From 86d0aa1b75dd49e646d084039e3455bff1a9de0f Mon Sep 17 00:00:00 2001 From: fengachen <373943794@qq.com> Date: Mon, 23 Aug 2021 10:04:51 +0800 Subject: [PATCH] Initial commit --- .gitattributes | 4 + .gitignore | 38 + LICENSE | 21 + README.md | 247 + db/Dockerfile | 13 + db/jeroboot-mysql-5.7.sql | 1387 +++ db/jeroboot-oracle11g.sql | 4338 ++++++++ db/jeroboot-sqlserver2017.sql | 9349 +++++++++++++++++ db/tables_nacos.sql | 265 + db/tables_xxl_job.sql | 119 + db/增量SQL/2.4升级到2.4.2增量mysql.sql | 28 + .../jimureport/jimureport.mysql5.7.create.sql | 1641 +++ db/增量SQL/版本升级说明.txt | 10 + docker-compose-server.yml | 51 + docker-compose.yml | 35 + jero-boot-base/jero-boot-base-api/pom.xml | 20 + .../jero/common/system/api/ISysBaseAPI.java | 302 + jero-boot-base/jero-boot-base-core/pom.xml | 244 + .../java/com/jero/common/api/CommonAPI.java | 97 + .../java/com/jero/common/api/IWpsBaseAPI.java | 24 + .../com/jero/common/api/dto/FileDownDTO.java | 30 + .../jero/common/api/dto/FileUploadDTO.java | 55 + .../java/com/jero/common/api/dto/LogDTO.java | 68 + .../jero/common/api/dto/OnlineAuthDTO.java | 41 + .../common/api/dto/message/BusMessageDTO.java | 43 + .../dto/message/BusTemplateMessageDTO.java | 45 + .../common/api/dto/message/MessageDTO.java | 69 + .../common/api/dto/message/TemplateDTO.java | 37 + .../api/dto/message/TemplateMessageDTO.java | 48 + .../com/jero/common/api/vo/OaWpsModel.java | 107 + .../java/com/jero/common/api/vo/Result.java | 143 + .../com/jero/common/aspect/AutoLogAspect.java | 268 + .../com/jero/common/aspect/DictAspect.java | 212 + .../common/aspect/PermissionDataAspect.java | 119 + .../com/jero/common/aspect/UrlMatchEnum.java | 58 + .../common/aspect/annotation/AutoLog.java | 45 + .../jero/common/aspect/annotation/Dict.java | 42 + .../common/aspect/annotation/DictPoint.java | 17 + .../common/aspect/annotation/OnlineAuth.java | 18 + .../aspect/annotation/PermissionData.java | 29 + .../jero/common/constant/CacheConstant.java | 73 + .../jero/common/constant/CommonConstant.java | 308 + .../common/constant/CommonSendStatus.java | 24 + .../common/constant/DataBaseConstant.java | 113 + .../common/constant/FillRuleConstant.java | 25 + .../common/constant/ProvinceCityArea.java | 131 + .../common/constant/ServiceNameConstants.java | 38 + .../jero/common/constant/VXESocketConst.java | 30 + .../jero/common/constant/WebsocketConst.java | 61 + .../common/constant/enums/CgformEnum.java | 150 + .../common/constant/enums/ModuleType.java | 17 + .../common/es/JeroElasticsearchTemplate.java | 515 + .../jero/common/es/QueryStringBuilder.java | 98 + .../common/exception/JeroBootException.java | 19 + .../exception/JeroBootExceptionHandler.java | 129 + .../jero/common/handler/IFillRuleHandler.java | 21 + .../base/controller/JeroController.java | 144 + .../common/system/base/entity/JeroEntity.java | 52 + .../system/base/service/JeroService.java | 12 + .../base/service/impl/JeroServiceImpl.java | 19 + .../common/system/query/MatchTypeEnum.java | 43 + .../common/system/query/QueryCondition.java | 55 + .../common/system/query/QueryGenerator.java | 1086 ++ .../common/system/query/QueryRuleEnum.java | 73 + .../system/util/JeroDataAutorUtils.java | 104 + .../com/jero/common/system/util/JwtUtil.java | 208 + .../com/jero/common/system/vo/ComboModel.java | 36 + .../com/jero/common/system/vo/DictModel.java | 43 + .../com/jero/common/system/vo/DictQuery.java | 34 + .../system/vo/DynamicDataSourceModel.java | 52 + .../com/jero/common/system/vo/LoginUser.java | 119 + .../common/system/vo/SysCategoryModel.java | 52 + .../jero/common/system/vo/SysDepartModel.java | 147 + .../common/system/vo/SysDepartTreeModel.java | 340 + .../system/vo/SysPermissionDataRuleModel.java | 151 + .../common/system/vo/SysUserCacheInfo.java | 67 + .../com/jero/common/util/BrowserType.java | 10 + .../com/jero/common/util/BrowserUtils.java | 206 + .../com/jero/common/util/CommonUtils.java | 239 + .../java/com/jero/common/util/DateUtils.java | 650 ++ .../java/com/jero/common/util/DySmsEnum.java | 70 + .../com/jero/common/util/DySmsHelper.java | 122 + .../com/jero/common/util/FillRuleUtil.java | 57 + .../java/com/jero/common/util/HTMLUtils.java | 29 + .../java/com/jero/common/util/IPUtils.java | 58 + .../com/jero/common/util/ImportExcelUtil.java | 96 + .../java/com/jero/common/util/MD5Util.java | 43 + .../java/com/jero/common/util/MinioUtil.java | 210 + .../com/jero/common/util/MyClassLoader.java | 92 + .../com/jero/common/util/PasswordUtil.java | 210 + .../java/com/jero/common/util/PmsUtil.java | 61 + .../java/com/jero/common/util/RedisUtil.java | 615 ++ .../com/jero/common/util/ReflectHelper.java | 238 + .../com/jero/common/util/RestDesformUtil.java | 121 + .../java/com/jero/common/util/RestUtil.java | 257 + .../com/jero/common/util/SimpleFormat.java | 173 + .../jero/common/util/SpringContextUtils.java | 94 + .../jero/common/util/SqlInjectionUtil.java | 139 + .../jero/common/util/SysAnnmentTypeEnum.java | 70 + .../java/com/jero/common/util/TokenUtils.java | 128 + .../com/jero/common/util/UUIDGenerator.java | 95 + .../java/com/jero/common/util/ValidUtil.java | 42 + .../com/jero/common/util/YouBianCodeUtil.java | 165 + .../util/dynamic/db/DataSourceCachePool.java | 92 + .../common/util/dynamic/db/DynamicDBUtil.java | 300 + .../dynamic/db/FreemarkerParseFactory.java | 171 + .../jero/common/util/dynamic/db/SqlUtils.java | 212 + .../util/encryption/AesEncryptUtil.java | 121 + .../util/encryption/EncryptedString.java | 12 + .../common/util/filter/StrAttackFilter.java | 20 + .../common/util/jsonschema/BaseColumn.java | 28 + .../util/jsonschema/CommonProperty.java | 195 + .../util/jsonschema/JsonSchemaDescrip.java | 87 + .../util/jsonschema/JsonschemaUtil.java | 70 + .../jsonschema/validate/DictProperty.java | 82 + .../jsonschema/validate/HiddenProperty.java | 38 + .../jsonschema/validate/LinkDownProperty.java | 66 + .../jsonschema/validate/NumberProperty.java | 153 + .../jsonschema/validate/PopupProperty.java | 76 + .../jsonschema/validate/StringProperty.java | 119 + .../jsonschema/validate/SwitchProperty.java | 46 + .../validate/TreeSelectProperty.java | 146 + .../com/jero/common/util/oConvertUtils.java | 668 ++ .../com/jero/common/util/oss/OssBootUtil.java | 329 + .../common/util/security/SecurityTools.java | 77 + .../util/security/entity/MyKeyPair.java | 9 + .../util/security/entity/SecurityReq.java | 11 + .../util/security/entity/SecurityResp.java | 10 + .../util/security/entity/SecuritySignReq.java | 9 + .../security/entity/SecuritySignResp.java | 10 + .../util/superSearch/ObjectParseUtil.java | 60 + .../util/superSearch/QueryRuleEnum.java | 60 + .../common/util/superSearch/QueryRuleVo.java | 11 + .../java/com/jero/config/AutoPoiConfig.java | 28 + .../com/jero/config/AutoPoiDictConfig.java | 65 + .../com/jero/config/JeroCloudCondition.java | 22 + .../com/jero/config/RestTemplateConfig.java | 28 + .../java/com/jero/config/StaticConfig.java | 31 + .../java/com/jero/config/Swagger2Config.java | 139 + .../main/java/com/jero/config/WebConfig.java | 62 + .../com/jero/config/WebMvcConfiguration.java | 82 + .../java/com/jero/config/WebSocketConfig.java | 18 + .../jero/config/filter/cors/CorsFilter.java | 90 + .../jero/config/filter/csrf/CsrfFilter.java | 124 + .../jero/config/filter/xss/HTMLFilter.java | 446 + .../com/jero/config/filter/xss/SqlFilter.java | 34 + .../com/jero/config/filter/xss/XssFilter.java | 57 + .../xss/XssHttpServletRequestWrapper.java | 134 + .../jero/config/mybatis/JeroTenantParser.java | 130 + .../config/mybatis/MybatisInterceptor.java | 161 + .../config/mybatis/MybatisPlusConfig.java | 142 + .../jero/config/mybatis/TenantContext.java | 25 + .../java/com/jero/config/oss/MinioConfig.java | 38 + .../com/jero/config/oss/OssConfiguration.java | 34 + .../com/jero/config/redis/RedisConfig.java | 112 + .../java/com/jero/config/shiro/JwtToken.java | 28 + .../com/jero/config/shiro/ShiroConfig.java | 252 + .../com/jero/config/shiro/ShiroRealm.java | 179 + .../filters/CustomShiroFilterFactoryBean.java | 76 + .../jero/config/shiro/filters/JwtFilter.java | 97 + .../shiro/filters/ResourceCheckFilter.java | 67 + .../modules/base/mapper/BaseCommonMapper.java | 16 + .../base/mapper/xml/BaseCommonMapper.xml | 23 + .../base/service/BaseCommonService.java | 34 + .../service/impl/BaseCommonServiceImpl.java | 91 + .../src/main/resources/static/pca.json | 51 + jero-boot-base/jero-boot-base-tools/pom.xml | 37 + .../common/annotation/RabbitComponent.java | 23 + .../java/com/jero/common/base/BaseMap.java | 141 + .../com/jero/common/config/CommonConfig.java | 22 + .../jero/common/constant/GlobalConstants.java | 14 + .../modules/redis/clent/JeroRedisClient.java | 43 + .../redis/config/RedisConfiguration.java | 93 + .../redis/listener/JeroRedisListerer.java | 12 + .../redis/prop/JeroRedisProperties.java | 24 + .../modules/redis/service/RedisReceiver.java | 30 + .../jero/common/util/SpringContextHolder.java | 81 + jero-boot-base/pom.xml | 21 + jero-boot-module-demo/pom.xml | 32 + jero-boot-module-system/.gitattributes | 4 + jero-boot-module-system/Dockerfile | 15 + jero-boot-module-system/pom.xml | 56 + .../jero/config/init/SystemInitListener.java | 41 + .../jero/config/init/TomcatFactoryConfig.java | 33 + .../jimureport/JimuReportTokenService.java | 41 + .../api/controller/SystemAPIController.java | 553 + .../cas/controller/CasClientController.java | 115 + .../jero/modules/cas/util/CASServiceUtil.java | 103 + .../com/jero/modules/cas/util/XmlUtils.java | 292 + .../controller/SysMessageController.java | 145 + .../SysMessageTemplateController.java | 170 + .../modules/message/entity/MsgParams.java | 23 + .../modules/message/entity/SysMessage.java | 60 + .../message/entity/SysMessageTemplate.java | 38 + .../message/handle/ISendMsgHandle.java | 6 + .../handle/enums/SendMsgStatusEnum.java | 25 + .../message/handle/enums/SendMsgTypeEnum.java | 51 + .../handle/impl/EmailSendMsgHandle.java | 45 + .../message/handle/impl/SmsSendMsgHandle.java | 15 + .../message/handle/impl/WxSendMsgHandle.java | 14 + .../jero/modules/message/job/SendMsgJob.java | 72 + .../message/mapper/SysMessageMapper.java | 17 + .../mapper/SysMessageTemplateMapper.java | 18 + .../message/mapper/xml/SysMessageMapper.xml | 5 + .../mapper/xml/SysMessageTemplateMapper.xml | 5 + .../message/service/ISysMessageService.java | 14 + .../service/ISysMessageTemplateService.java | 16 + .../service/impl/SysMessageServiceImpl.java | 18 + .../impl/SysMessageTemplateServiceImpl.java | 28 + .../modules/message/util/PushMsgUtil.java | 80 + .../message/websocket/SocketHandler.java | 29 + .../websocket/TestSocketController.java | 48 + .../modules/message/websocket/WebSocket.java | 150 + .../controller/ActuatorRedisController.java | 119 + .../modules/monitor/domain/RedisInfo.java | 137 + .../exception/RedisConnectException.java | 13 + .../modules/monitor/service/RedisService.java | 39 + .../service/impl/MailHealthIndicator.java | 29 + .../service/impl/RedisServiceImpl.java | 122 + .../modules/ngalain/aop/LogRecordAspect.java | 46 + .../ngalain/controller/NgAlainController.java | 86 + .../ngalain/service/NgAlainService.java | 12 + .../service/impl/NgAlainServiceImpl.java | 180 + .../oss/controller/OSSFileController.java | 97 + .../com/jero/modules/oss/entity/OSSFile.java | 24 + .../modules/oss/mapper/OSSFileMapper.java | 8 + .../modules/oss/service/IOSSFileService.java | 15 + .../oss/service/impl/OSSFileServiceImpl.java | 43 + .../controller/QuartzJobController.java | 286 + .../jero/modules/quartz/entity/QuartzJob.java | 62 + .../com/jero/modules/quartz/job/AsyncJob.java | 35 + .../jero/modules/quartz/job/SampleJob.java | 23 + .../modules/quartz/job/SampleParamJob.java | 32 + .../quartz/mapper/QuartzJobMapper.java | 20 + .../quartz/mapper/xml/QuartzJobMapper.xml | 9 + .../quartz/service/IQuartzJobService.java | 40 + .../service/impl/QuartzJobServiceImpl.java | 174 + .../system/controller/CommonController.java | 272 + .../controller/DuplicateCheckController.java | 89 + .../system/controller/LoginController.java | 574 + .../controller/SysAnnouncementController.java | 426 + .../SysAnnouncementSendController.java | 242 + .../controller/SysCategoryController.java | 503 + .../controller/SysCheckRuleController.java | 186 + .../controller/SysConfusionController.java | 171 + .../controller/SysDataLogController.java | 94 + .../controller/SysDataSourceController.java | 216 + .../controller/SysDepartController.java | 504 + .../SysDepartPermissionController.java | 314 + .../controller/SysDepartRoleController.java | 291 + .../system/controller/SysDictController.java | 585 ++ .../controller/SysDictItemController.java | 190 + .../controller/SysFillRuleController.java | 213 + .../controller/SysGatewayRouteController.java | 76 + .../system/controller/SysLogController.java | 117 + .../controller/SysPermissionController.java | 807 ++ .../system/controller/SysRoleController.java | 425 + .../controller/SysUserAgentController.java | 264 + .../system/controller/SysUserController.java | 1375 +++ .../controller/ThirdLoginController.java | 280 + .../system/entity/SysAnnouncement.java | 147 + .../system/entity/SysAnnouncementSend.java | 48 + .../modules/system/entity/SysCategory.java | 66 + .../modules/system/entity/SysCheckRule.java | 88 + .../modules/system/entity/SysConfusion.java | 105 + .../modules/system/entity/SysDataLog.java | 36 + .../modules/system/entity/SysDataSource.java | 120 + .../jero/modules/system/entity/SysDepart.java | 135 + .../system/entity/SysDepartPermission.java | 55 + .../modules/system/entity/SysDepartRole.java | 75 + .../entity/SysDepartRolePermission.java | 67 + .../system/entity/SysDepartRoleUser.java | 52 + .../jero/modules/system/entity/SysDict.java | 85 + .../modules/system/entity/SysDictItem.java | 82 + .../modules/system/entity/SysFillRule.java | 86 + .../system/entity/SysGatewayRoute.java | 111 + .../jero/modules/system/entity/SysLog.java | 112 + .../modules/system/entity/SysPermission.java | 182 + .../system/entity/SysPermissionDataRule.java | 83 + .../jero/modules/system/entity/SysRole.java | 82 + .../system/entity/SysRolePermission.java | 71 + .../system/entity/SysThirdAccount.java | 63 + .../jero/modules/system/entity/SysUser.java | 189 + .../modules/system/entity/SysUserAgent.java | 74 + .../modules/system/entity/SysUserDepart.java | 33 + .../modules/system/entity/SysUserRole.java | 50 + .../system/mapper/SysAnnouncementMapper.java | 22 + .../mapper/SysAnnouncementSendMapper.java | 31 + .../system/mapper/SysCategoryMapper.java | 32 + .../system/mapper/SysCheckRuleMapper.java | 14 + .../system/mapper/SysConfusionMapper.java | 17 + .../system/mapper/SysDataLogMapper.java | 17 + .../system/mapper/SysDataSourceMapper.java | 14 + .../system/mapper/SysDepartMapper.java | 53 + .../mapper/SysDepartPermissionMapper.java | 17 + .../system/mapper/SysDepartRoleMapper.java | 23 + .../mapper/SysDepartRolePermissionMapper.java | 17 + .../mapper/SysDepartRoleUserMapper.java | 17 + .../system/mapper/SysDictItemMapper.java | 20 + .../modules/system/mapper/SysDictMapper.java | 154 + .../system/mapper/SysFillRuleMapper.java | 14 + .../system/mapper/SysGatewayRouteMapper.java | 14 + .../modules/system/mapper/SysLogMapper.java | 57 + .../mapper/SysPermissionDataRuleMapper.java | 28 + .../system/mapper/SysPermissionMapper.java | 57 + .../modules/system/mapper/SysRoleMapper.java | 37 + .../mapper/SysRolePermissionMapper.java | 16 + .../system/mapper/SysThirdAccountMapper.java | 17 + .../system/mapper/SysUserAgentMapper.java | 17 + .../system/mapper/SysUserDepartMapper.java | 11 + .../modules/system/mapper/SysUserMapper.java | 142 + .../system/mapper/SysUserRoleMapper.java | 25 + .../mapper/xml/SysAnnouncementMapper.xml | 40 + .../mapper/xml/SysAnnouncementSendMapper.xml | 67 + .../system/mapper/xml/SysCategoryMapper.xml | 21 + .../system/mapper/xml/SysCheckRuleMapper.xml | 5 + .../system/mapper/xml/SysConfusionMapper.xml | 15 + .../system/mapper/xml/SysDataLogMapper.xml | 10 + .../system/mapper/xml/SysDataSourceMapper.xml | 5 + .../system/mapper/xml/SysDepartMapper.xml | 37 + .../mapper/xml/SysDepartPermissionMapper.xml | 5 + .../system/mapper/xml/SysDepartRoleMapper.xml | 12 + .../xml/SysDepartRolePermissionMapper.xml | 5 + .../mapper/xml/SysDepartRoleUserMapper.xml | 5 + .../system/mapper/xml/SysDictItemMapper.xml | 5 + .../system/mapper/xml/SysDictMapper.xml | 124 + .../system/mapper/xml/SysFillRuleMapper.xml | 5 + .../mapper/xml/SysGatewayRouteMapper.xml | 5 + .../system/mapper/xml/SysLogMapper.xml | 69 + .../xml/SysPermissionDataRuleMapper.xml | 26 + .../system/mapper/xml/SysPermissionMapper.xml | 108 + .../mapper/xml/SysThirdAccountMapper.xml | 5 + .../system/mapper/xml/SysUserAgentMapper.xml | 5 + .../system/mapper/xml/SysUserDepartMapper.xml | 9 + .../system/mapper/xml/SysUserMapper.xml | 164 + .../system/model/AnnouncementSendModel.java | 80 + .../modules/system/model/DepartIdModel.java | 93 + .../system/model/DuplicateCheckVo.java | 53 + .../modules/system/model/SysDictTree.java | 96 + .../modules/system/model/SysLoginModel.java | 64 + .../system/model/SysPermissionTree.java | 394 + .../system/model/SysUserSysDepartModel.java | 26 + .../modules/system/model/ThirdLoginModel.java | 72 + .../jero/modules/system/model/TreeModel.java | 174 + .../modules/system/model/TreeSelectModel.java | 94 + .../modules/system/rule/CategoryCodeRule.java | 64 + .../modules/system/rule/OrderNumberRule.java | 36 + .../jero/modules/system/rule/OrgCodeRule.java | 94 + .../service/ISysAnnouncementSendService.java | 28 + .../service/ISysAnnouncementService.java | 25 + .../system/service/ISysCategoryService.java | 62 + .../system/service/ISysCheckRuleService.java | 33 + .../system/service/ISysConfusionService.java | 61 + .../system/service/ISysDataLogService.java | 17 + .../system/service/ISysDataSourceService.java | 14 + .../service/ISysDepartPermissionService.java | 30 + .../ISysDepartRolePermissionService.java | 20 + .../system/service/ISysDepartRoleService.java | 24 + .../service/ISysDepartRoleUserService.java | 24 + .../system/service/ISysDepartService.java | 126 + .../system/service/ISysDictItemService.java | 18 + .../system/service/ISysDictService.java | 145 + .../system/service/ISysFillRuleService.java | 14 + .../service/ISysGatewayRouteService.java | 38 + .../system/service/ISysLogService.java | 56 + .../ISysPermissionDataRuleService.java | 55 + .../system/service/ISysPermissionService.java | 64 + .../service/ISysRolePermissionService.java | 31 + .../system/service/ISysRoleService.java | 43 + .../service/ISysThirdAccountService.java | 19 + .../system/service/ISysUserAgentService.java | 14 + .../system/service/ISysUserDepartService.java | 41 + .../system/service/ISysUserRoleService.java | 18 + .../system/service/ISysUserService.java | 236 + .../service/impl/ImportFileServiceImpl.java | 26 + .../impl/SysAnnouncementSendServiceImpl.java | 39 + .../impl/SysAnnouncementServiceImpl.java | 121 + .../system/service/impl/SysBaseApiImpl.java | 1018 ++ .../service/impl/SysCategoryServiceImpl.java | 207 + .../service/impl/SysCheckRuleServiceImpl.java | 98 + .../service/impl/SysConfusionServiceImpl.java | 89 + .../service/impl/SysDataLogServiceImpl.java | 33 + .../impl/SysDataSourceServiceImpl.java | 18 + .../impl/SysDepartPermissionServiceImpl.java | 111 + .../SysDepartRolePermissionServiceImpl.java | 87 + .../impl/SysDepartRoleServiceImpl.java | 25 + .../impl/SysDepartRoleUserServiceImpl.java | 93 + .../service/impl/SysDepartServiceImpl.java | 530 + .../service/impl/SysDictItemServiceImpl.java | 30 + .../service/impl/SysDictServiceImpl.java | 313 + .../service/impl/SysFillRuleServiceImpl.java | 18 + .../impl/SysGatewayRouteServiceImpl.java | 102 + .../service/impl/SysLogServiceImpl.java | 66 + .../impl/SysPermissionDataRuleImpl.java | 116 + .../impl/SysPermissionServiceImpl.java | 266 + .../impl/SysRolePermissionServiceImpl.java | 121 + .../service/impl/SysRoleServiceImpl.java | 93 + .../impl/SysThirdAccountServiceImpl.java | 106 + .../service/impl/SysUserAgentServiceImpl.java | 19 + .../impl/SysUserDepartServiceImpl.java | 133 + .../service/impl/SysUserRoleServiceImpl.java | 30 + .../service/impl/SysUserServiceImpl.java | 442 + .../system/util/FindsDepartsChildrenUtil.java | 172 + .../system/util/PermissionDataUtil.java | 95 + .../modules/system/util/RandImageUtil.java | 144 + .../modules/system/util/SecurityUtil.java | 51 + .../modules/system/util/TenantContext.java | 25 + .../modules/system/vo/SysDepartUsersVO.java | 28 + .../jero/modules/system/vo/SysDictPage.java | 41 + .../jero/modules/system/vo/SysUserDepVo.java | 15 + .../jero/modules/system/vo/SysUserRoleVO.java | 27 + .../system/volid/group/CreateGroup.java | 8 + .../system/volid/group/UpdateGroup.java | 8 + jero-boot-single-startup/pom.xml | 44 + .../com/jero/JeroSystemSingleApplication.java | 43 + .../src/main/resources/application-dev.yml | 296 + .../src/main/resources/application-prod.yml | 289 + .../src/main/resources/application-test.yml | 289 + .../src/main/resources/application.yml | 5 + .../src/main/resources/banner.txt | 14 + .../src/main/resources/logback-spring.xml | 77 + .../src/main/resources/spy.properties | 21 + .../src/main/resources/static/demo1.html | 1 + .../src/main/resources/static/generic/LICENSE | 177 + .../static/generic/web/cmaps/78-EUC-H.bcmap | Bin 0 -> 2404 bytes .../static/generic/web/cmaps/78-EUC-V.bcmap | Bin 0 -> 173 bytes .../static/generic/web/cmaps/78-H.bcmap | Bin 0 -> 2379 bytes .../static/generic/web/cmaps/78-RKSJ-H.bcmap | Bin 0 -> 2398 bytes .../static/generic/web/cmaps/78-RKSJ-V.bcmap | Bin 0 -> 173 bytes .../static/generic/web/cmaps/78-V.bcmap | Bin 0 -> 169 bytes .../generic/web/cmaps/78ms-RKSJ-H.bcmap | Bin 0 -> 2651 bytes .../generic/web/cmaps/78ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../generic/web/cmaps/83pv-RKSJ-H.bcmap | Bin 0 -> 905 bytes .../generic/web/cmaps/90ms-RKSJ-H.bcmap | Bin 0 -> 721 bytes .../generic/web/cmaps/90ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../generic/web/cmaps/90msp-RKSJ-H.bcmap | Bin 0 -> 715 bytes .../generic/web/cmaps/90msp-RKSJ-V.bcmap | Bin 0 -> 291 bytes .../generic/web/cmaps/90pv-RKSJ-H.bcmap | Bin 0 -> 982 bytes .../generic/web/cmaps/90pv-RKSJ-V.bcmap | Bin 0 -> 260 bytes .../static/generic/web/cmaps/Add-H.bcmap | Bin 0 -> 2419 bytes .../static/generic/web/cmaps/Add-RKSJ-H.bcmap | Bin 0 -> 2413 bytes .../static/generic/web/cmaps/Add-RKSJ-V.bcmap | Bin 0 -> 287 bytes .../static/generic/web/cmaps/Add-V.bcmap | Bin 0 -> 282 bytes .../generic/web/cmaps/Adobe-CNS1-0.bcmap | Bin 0 -> 317 bytes .../generic/web/cmaps/Adobe-CNS1-1.bcmap | Bin 0 -> 371 bytes .../generic/web/cmaps/Adobe-CNS1-2.bcmap | Bin 0 -> 376 bytes .../generic/web/cmaps/Adobe-CNS1-3.bcmap | Bin 0 -> 401 bytes .../generic/web/cmaps/Adobe-CNS1-4.bcmap | Bin 0 -> 405 bytes .../generic/web/cmaps/Adobe-CNS1-5.bcmap | Bin 0 -> 406 bytes .../generic/web/cmaps/Adobe-CNS1-6.bcmap | Bin 0 -> 406 bytes .../generic/web/cmaps/Adobe-CNS1-UCS2.bcmap | Bin 0 -> 41193 bytes .../generic/web/cmaps/Adobe-GB1-0.bcmap | Bin 0 -> 217 bytes .../generic/web/cmaps/Adobe-GB1-1.bcmap | Bin 0 -> 250 bytes .../generic/web/cmaps/Adobe-GB1-2.bcmap | Bin 0 -> 465 bytes .../generic/web/cmaps/Adobe-GB1-3.bcmap | Bin 0 -> 470 bytes .../generic/web/cmaps/Adobe-GB1-4.bcmap | Bin 0 -> 601 bytes .../generic/web/cmaps/Adobe-GB1-5.bcmap | Bin 0 -> 625 bytes .../generic/web/cmaps/Adobe-GB1-UCS2.bcmap | Bin 0 -> 33974 bytes .../generic/web/cmaps/Adobe-Japan1-0.bcmap | Bin 0 -> 225 bytes .../generic/web/cmaps/Adobe-Japan1-1.bcmap | Bin 0 -> 226 bytes .../generic/web/cmaps/Adobe-Japan1-2.bcmap | Bin 0 -> 233 bytes .../generic/web/cmaps/Adobe-Japan1-3.bcmap | Bin 0 -> 242 bytes .../generic/web/cmaps/Adobe-Japan1-4.bcmap | Bin 0 -> 337 bytes .../generic/web/cmaps/Adobe-Japan1-5.bcmap | Bin 0 -> 430 bytes .../generic/web/cmaps/Adobe-Japan1-6.bcmap | Bin 0 -> 485 bytes .../generic/web/cmaps/Adobe-Japan1-UCS2.bcmap | Bin 0 -> 40951 bytes .../generic/web/cmaps/Adobe-Korea1-0.bcmap | Bin 0 -> 241 bytes .../generic/web/cmaps/Adobe-Korea1-1.bcmap | Bin 0 -> 386 bytes .../generic/web/cmaps/Adobe-Korea1-2.bcmap | Bin 0 -> 391 bytes .../generic/web/cmaps/Adobe-Korea1-UCS2.bcmap | Bin 0 -> 23293 bytes .../static/generic/web/cmaps/B5-H.bcmap | Bin 0 -> 1086 bytes .../static/generic/web/cmaps/B5-V.bcmap | Bin 0 -> 142 bytes .../static/generic/web/cmaps/B5pc-H.bcmap | Bin 0 -> 1099 bytes .../static/generic/web/cmaps/B5pc-V.bcmap | Bin 0 -> 144 bytes .../static/generic/web/cmaps/CNS-EUC-H.bcmap | Bin 0 -> 1780 bytes .../static/generic/web/cmaps/CNS-EUC-V.bcmap | Bin 0 -> 1920 bytes .../static/generic/web/cmaps/CNS1-H.bcmap | Bin 0 -> 706 bytes .../static/generic/web/cmaps/CNS1-V.bcmap | Bin 0 -> 143 bytes .../static/generic/web/cmaps/CNS2-H.bcmap | Bin 0 -> 504 bytes .../static/generic/web/cmaps/CNS2-V.bcmap | 3 + .../static/generic/web/cmaps/ETHK-B5-H.bcmap | Bin 0 -> 4426 bytes .../static/generic/web/cmaps/ETHK-B5-V.bcmap | Bin 0 -> 158 bytes .../static/generic/web/cmaps/ETen-B5-H.bcmap | Bin 0 -> 1125 bytes .../static/generic/web/cmaps/ETen-B5-V.bcmap | Bin 0 -> 158 bytes .../generic/web/cmaps/ETenms-B5-H.bcmap | 3 + .../generic/web/cmaps/ETenms-B5-V.bcmap | Bin 0 -> 172 bytes .../static/generic/web/cmaps/EUC-H.bcmap | Bin 0 -> 578 bytes .../static/generic/web/cmaps/EUC-V.bcmap | Bin 0 -> 170 bytes .../static/generic/web/cmaps/Ext-H.bcmap | Bin 0 -> 2536 bytes .../static/generic/web/cmaps/Ext-RKSJ-H.bcmap | Bin 0 -> 2542 bytes .../static/generic/web/cmaps/Ext-RKSJ-V.bcmap | Bin 0 -> 218 bytes .../static/generic/web/cmaps/Ext-V.bcmap | Bin 0 -> 215 bytes .../static/generic/web/cmaps/GB-EUC-H.bcmap | Bin 0 -> 549 bytes .../static/generic/web/cmaps/GB-EUC-V.bcmap | Bin 0 -> 179 bytes .../static/generic/web/cmaps/GB-H.bcmap | 4 + .../static/generic/web/cmaps/GB-V.bcmap | Bin 0 -> 175 bytes .../static/generic/web/cmaps/GBK-EUC-H.bcmap | Bin 0 -> 14692 bytes .../static/generic/web/cmaps/GBK-EUC-V.bcmap | Bin 0 -> 180 bytes .../static/generic/web/cmaps/GBK2K-H.bcmap | Bin 0 -> 19662 bytes .../static/generic/web/cmaps/GBK2K-V.bcmap | Bin 0 -> 219 bytes .../static/generic/web/cmaps/GBKp-EUC-H.bcmap | Bin 0 -> 14686 bytes .../static/generic/web/cmaps/GBKp-EUC-V.bcmap | Bin 0 -> 181 bytes .../static/generic/web/cmaps/GBT-EUC-H.bcmap | Bin 0 -> 7290 bytes .../static/generic/web/cmaps/GBT-EUC-V.bcmap | Bin 0 -> 180 bytes .../static/generic/web/cmaps/GBT-H.bcmap | Bin 0 -> 7269 bytes .../static/generic/web/cmaps/GBT-V.bcmap | Bin 0 -> 176 bytes .../generic/web/cmaps/GBTpc-EUC-H.bcmap | Bin 0 -> 7298 bytes .../generic/web/cmaps/GBTpc-EUC-V.bcmap | Bin 0 -> 182 bytes .../static/generic/web/cmaps/GBpc-EUC-H.bcmap | Bin 0 -> 557 bytes .../static/generic/web/cmaps/GBpc-EUC-V.bcmap | Bin 0 -> 181 bytes .../static/generic/web/cmaps/H.bcmap | Bin 0 -> 553 bytes .../static/generic/web/cmaps/HKdla-B5-H.bcmap | Bin 0 -> 2654 bytes .../static/generic/web/cmaps/HKdla-B5-V.bcmap | Bin 0 -> 148 bytes .../static/generic/web/cmaps/HKdlb-B5-H.bcmap | Bin 0 -> 2414 bytes .../static/generic/web/cmaps/HKdlb-B5-V.bcmap | Bin 0 -> 148 bytes .../generic/web/cmaps/HKgccs-B5-H.bcmap | Bin 0 -> 2292 bytes .../generic/web/cmaps/HKgccs-B5-V.bcmap | Bin 0 -> 149 bytes .../generic/web/cmaps/HKm314-B5-H.bcmap | Bin 0 -> 1772 bytes .../generic/web/cmaps/HKm314-B5-V.bcmap | Bin 0 -> 149 bytes .../generic/web/cmaps/HKm471-B5-H.bcmap | Bin 0 -> 2171 bytes .../generic/web/cmaps/HKm471-B5-V.bcmap | Bin 0 -> 149 bytes .../static/generic/web/cmaps/HKscs-B5-H.bcmap | Bin 0 -> 4437 bytes .../static/generic/web/cmaps/HKscs-B5-V.bcmap | Bin 0 -> 159 bytes .../static/generic/web/cmaps/Hankaku.bcmap | Bin 0 -> 132 bytes .../static/generic/web/cmaps/Hiragana.bcmap | Bin 0 -> 124 bytes .../static/generic/web/cmaps/KSC-EUC-H.bcmap | Bin 0 -> 1848 bytes .../static/generic/web/cmaps/KSC-EUC-V.bcmap | Bin 0 -> 164 bytes .../static/generic/web/cmaps/KSC-H.bcmap | Bin 0 -> 1831 bytes .../generic/web/cmaps/KSC-Johab-H.bcmap | Bin 0 -> 16791 bytes .../generic/web/cmaps/KSC-Johab-V.bcmap | Bin 0 -> 166 bytes .../static/generic/web/cmaps/KSC-V.bcmap | Bin 0 -> 160 bytes .../generic/web/cmaps/KSCms-UHC-H.bcmap | Bin 0 -> 2787 bytes .../generic/web/cmaps/KSCms-UHC-HW-H.bcmap | Bin 0 -> 2789 bytes .../generic/web/cmaps/KSCms-UHC-HW-V.bcmap | Bin 0 -> 169 bytes .../generic/web/cmaps/KSCms-UHC-V.bcmap | Bin 0 -> 166 bytes .../generic/web/cmaps/KSCpc-EUC-H.bcmap | Bin 0 -> 2024 bytes .../generic/web/cmaps/KSCpc-EUC-V.bcmap | Bin 0 -> 166 bytes .../static/generic/web/cmaps/Katakana.bcmap | Bin 0 -> 100 bytes .../static/generic/web/cmaps/LICENSE | 36 + .../static/generic/web/cmaps/NWP-H.bcmap | Bin 0 -> 2765 bytes .../static/generic/web/cmaps/NWP-V.bcmap | Bin 0 -> 252 bytes .../static/generic/web/cmaps/RKSJ-H.bcmap | Bin 0 -> 534 bytes .../static/generic/web/cmaps/RKSJ-V.bcmap | Bin 0 -> 170 bytes .../static/generic/web/cmaps/Roman.bcmap | Bin 0 -> 96 bytes .../generic/web/cmaps/UniCNS-UCS2-H.bcmap | Bin 0 -> 48280 bytes .../generic/web/cmaps/UniCNS-UCS2-V.bcmap | Bin 0 -> 156 bytes .../generic/web/cmaps/UniCNS-UTF16-H.bcmap | Bin 0 -> 50419 bytes .../generic/web/cmaps/UniCNS-UTF16-V.bcmap | Bin 0 -> 156 bytes .../generic/web/cmaps/UniCNS-UTF32-H.bcmap | Bin 0 -> 52679 bytes .../generic/web/cmaps/UniCNS-UTF32-V.bcmap | Bin 0 -> 160 bytes .../generic/web/cmaps/UniCNS-UTF8-H.bcmap | Bin 0 -> 53629 bytes .../generic/web/cmaps/UniCNS-UTF8-V.bcmap | Bin 0 -> 157 bytes .../generic/web/cmaps/UniGB-UCS2-H.bcmap | Bin 0 -> 43366 bytes .../generic/web/cmaps/UniGB-UCS2-V.bcmap | Bin 0 -> 193 bytes .../generic/web/cmaps/UniGB-UTF16-H.bcmap | Bin 0 -> 44086 bytes .../generic/web/cmaps/UniGB-UTF16-V.bcmap | Bin 0 -> 178 bytes .../generic/web/cmaps/UniGB-UTF32-H.bcmap | Bin 0 -> 45738 bytes .../generic/web/cmaps/UniGB-UTF32-V.bcmap | Bin 0 -> 182 bytes .../generic/web/cmaps/UniGB-UTF8-H.bcmap | Bin 0 -> 46837 bytes .../generic/web/cmaps/UniGB-UTF8-V.bcmap | Bin 0 -> 181 bytes .../generic/web/cmaps/UniJIS-UCS2-H.bcmap | Bin 0 -> 25439 bytes .../generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap | Bin 0 -> 119 bytes .../generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap | Bin 0 -> 680 bytes .../generic/web/cmaps/UniJIS-UCS2-V.bcmap | Bin 0 -> 664 bytes .../generic/web/cmaps/UniJIS-UTF16-H.bcmap | Bin 0 -> 39443 bytes .../generic/web/cmaps/UniJIS-UTF16-V.bcmap | Bin 0 -> 643 bytes .../generic/web/cmaps/UniJIS-UTF32-H.bcmap | Bin 0 -> 40539 bytes .../generic/web/cmaps/UniJIS-UTF32-V.bcmap | Bin 0 -> 677 bytes .../generic/web/cmaps/UniJIS-UTF8-H.bcmap | Bin 0 -> 41695 bytes .../generic/web/cmaps/UniJIS-UTF8-V.bcmap | Bin 0 -> 678 bytes .../web/cmaps/UniJIS2004-UTF16-H.bcmap | Bin 0 -> 39534 bytes .../web/cmaps/UniJIS2004-UTF16-V.bcmap | Bin 0 -> 647 bytes .../web/cmaps/UniJIS2004-UTF32-H.bcmap | Bin 0 -> 40630 bytes .../web/cmaps/UniJIS2004-UTF32-V.bcmap | Bin 0 -> 681 bytes .../generic/web/cmaps/UniJIS2004-UTF8-H.bcmap | Bin 0 -> 41779 bytes .../generic/web/cmaps/UniJIS2004-UTF8-V.bcmap | Bin 0 -> 682 bytes .../web/cmaps/UniJISPro-UCS2-HW-V.bcmap | Bin 0 -> 705 bytes .../generic/web/cmaps/UniJISPro-UCS2-V.bcmap | Bin 0 -> 689 bytes .../generic/web/cmaps/UniJISPro-UTF8-V.bcmap | Bin 0 -> 726 bytes .../web/cmaps/UniJISX0213-UTF32-H.bcmap | Bin 0 -> 40517 bytes .../web/cmaps/UniJISX0213-UTF32-V.bcmap | Bin 0 -> 684 bytes .../web/cmaps/UniJISX02132004-UTF32-H.bcmap | Bin 0 -> 40608 bytes .../web/cmaps/UniJISX02132004-UTF32-V.bcmap | Bin 0 -> 688 bytes .../generic/web/cmaps/UniKS-UCS2-H.bcmap | Bin 0 -> 25783 bytes .../generic/web/cmaps/UniKS-UCS2-V.bcmap | Bin 0 -> 178 bytes .../generic/web/cmaps/UniKS-UTF16-H.bcmap | Bin 0 -> 26327 bytes .../generic/web/cmaps/UniKS-UTF16-V.bcmap | Bin 0 -> 164 bytes .../generic/web/cmaps/UniKS-UTF32-H.bcmap | Bin 0 -> 26451 bytes .../generic/web/cmaps/UniKS-UTF32-V.bcmap | Bin 0 -> 168 bytes .../generic/web/cmaps/UniKS-UTF8-H.bcmap | Bin 0 -> 27790 bytes .../generic/web/cmaps/UniKS-UTF8-V.bcmap | Bin 0 -> 169 bytes .../static/generic/web/cmaps/V.bcmap | Bin 0 -> 166 bytes .../static/generic/web/cmaps/WP-Symbol.bcmap | Bin 0 -> 179 bytes .../static/generic/web/compatibility.js | 577 + .../web/compressed.tracemonkey-pldi-09.pdf | Bin 0 -> 1016315 bytes .../resources/static/generic/web/debugger.js | 620 ++ .../generic/web/images/annotation-check.svg | 11 + .../generic/web/images/annotation-comment.svg | 16 + .../generic/web/images/annotation-help.svg | 26 + .../generic/web/images/annotation-insert.svg | 10 + .../generic/web/images/annotation-key.svg | 11 + .../web/images/annotation-newparagraph.svg | 11 + .../generic/web/images/annotation-noicon.svg | 7 + .../generic/web/images/annotation-note.svg | 42 + .../web/images/annotation-paragraph.svg | 16 + .../web/images/findbarButton-next-rtl.png | Bin 0 -> 199 bytes .../web/images/findbarButton-next-rtl@2x.png | Bin 0 -> 304 bytes .../generic/web/images/findbarButton-next.png | Bin 0 -> 193 bytes .../web/images/findbarButton-next@2x.png | Bin 0 -> 296 bytes .../web/images/findbarButton-previous-rtl.png | Bin 0 -> 193 bytes .../images/findbarButton-previous-rtl@2x.png | Bin 0 -> 296 bytes .../web/images/findbarButton-previous.png | Bin 0 -> 199 bytes .../web/images/findbarButton-previous@2x.png | Bin 0 -> 304 bytes .../static/generic/web/images/grab.cur | Bin 0 -> 326 bytes .../static/generic/web/images/grabbing.cur | Bin 0 -> 326 bytes .../generic/web/images/loading-icon.gif | Bin 0 -> 2545 bytes .../generic/web/images/loading-small.png | Bin 0 -> 7402 bytes .../generic/web/images/loading-small@2x.png | Bin 0 -> 16131 bytes ...ondaryToolbarButton-documentProperties.png | Bin 0 -> 403 bytes ...aryToolbarButton-documentProperties@2x.png | Bin 0 -> 933 bytes .../secondaryToolbarButton-firstPage.png | Bin 0 -> 179 bytes .../secondaryToolbarButton-firstPage@2x.png | Bin 0 -> 266 bytes .../secondaryToolbarButton-handTool.png | Bin 0 -> 301 bytes .../secondaryToolbarButton-handTool@2x.png | Bin 0 -> 583 bytes .../secondaryToolbarButton-lastPage.png | Bin 0 -> 175 bytes .../secondaryToolbarButton-lastPage@2x.png | Bin 0 -> 276 bytes .../secondaryToolbarButton-rotateCcw.png | Bin 0 -> 360 bytes .../secondaryToolbarButton-rotateCcw@2x.png | Bin 0 -> 731 bytes .../secondaryToolbarButton-rotateCw.png | Bin 0 -> 359 bytes .../secondaryToolbarButton-rotateCw@2x.png | Bin 0 -> 714 bytes .../static/generic/web/images/shadow.png | Bin 0 -> 290 bytes .../static/generic/web/images/texture.png | Bin 0 -> 2418 bytes .../web/images/toolbarButton-bookmark.png | Bin 0 -> 174 bytes .../web/images/toolbarButton-bookmark@2x.png | Bin 0 -> 260 bytes .../web/images/toolbarButton-download.png | Bin 0 -> 259 bytes .../web/images/toolbarButton-download@2x.png | Bin 0 -> 425 bytes .../web/images/toolbarButton-menuArrows.png | Bin 0 -> 108 bytes .../images/toolbarButton-menuArrows@2x.png | Bin 0 -> 152 bytes .../web/images/toolbarButton-openFile.png | Bin 0 -> 295 bytes .../web/images/toolbarButton-openFile@2x.png | Bin 0 -> 550 bytes .../web/images/toolbarButton-pageDown-rtl.png | Bin 0 -> 242 bytes .../images/toolbarButton-pageDown-rtl@2x.png | Bin 0 -> 398 bytes .../web/images/toolbarButton-pageDown.png | Bin 0 -> 238 bytes .../web/images/toolbarButton-pageDown@2x.png | Bin 0 -> 396 bytes .../web/images/toolbarButton-pageUp-rtl.png | Bin 0 -> 245 bytes .../images/toolbarButton-pageUp-rtl@2x.png | Bin 0 -> 405 bytes .../web/images/toolbarButton-pageUp.png | Bin 0 -> 246 bytes .../web/images/toolbarButton-pageUp@2x.png | Bin 0 -> 403 bytes .../images/toolbarButton-presentationMode.png | Bin 0 -> 321 bytes .../toolbarButton-presentationMode@2x.png | Bin 0 -> 586 bytes .../web/images/toolbarButton-print.png | Bin 0 -> 257 bytes .../web/images/toolbarButton-print@2x.png | Bin 0 -> 464 bytes .../web/images/toolbarButton-search.png | Bin 0 -> 309 bytes .../web/images/toolbarButton-search@2x.png | Bin 0 -> 653 bytes ...olbarButton-secondaryToolbarToggle-rtl.png | Bin 0 -> 246 bytes ...arButton-secondaryToolbarToggle-rtl@2x.png | Bin 0 -> 456 bytes .../toolbarButton-secondaryToolbarToggle.png | Bin 0 -> 243 bytes ...oolbarButton-secondaryToolbarToggle@2x.png | Bin 0 -> 458 bytes .../toolbarButton-sidebarToggle-rtl.png | Bin 0 -> 225 bytes .../toolbarButton-sidebarToggle-rtl@2x.png | Bin 0 -> 344 bytes .../images/toolbarButton-sidebarToggle.png | Bin 0 -> 225 bytes .../images/toolbarButton-sidebarToggle@2x.png | Bin 0 -> 331 bytes .../images/toolbarButton-viewAttachments.png | Bin 0 -> 384 bytes .../toolbarButton-viewAttachments@2x.png | Bin 0 -> 871 bytes .../images/toolbarButton-viewOutline-rtl.png | Bin 0 -> 177 bytes .../toolbarButton-viewOutline-rtl@2x.png | Bin 0 -> 394 bytes .../web/images/toolbarButton-viewOutline.png | Bin 0 -> 178 bytes .../images/toolbarButton-viewOutline@2x.png | Bin 0 -> 331 bytes .../images/toolbarButton-viewThumbnail.png | Bin 0 -> 185 bytes .../images/toolbarButton-viewThumbnail@2x.png | Bin 0 -> 220 bytes .../web/images/toolbarButton-zoomIn.png | Bin 0 -> 136 bytes .../web/images/toolbarButton-zoomIn@2x.png | Bin 0 -> 160 bytes .../web/images/toolbarButton-zoomOut.png | Bin 0 -> 88 bytes .../web/images/toolbarButton-zoomOut@2x.png | Bin 0 -> 109 bytes .../main/resources/static/generic/web/l10n.js | 1033 ++ .../generic/web/locale/locale.properties | 312 + .../web/locale/zh-CN/viewer.properties | 167 + .../resources/static/generic/web/viewer.css | 1999 ++++ .../resources/static/generic/web/viewer.html | 418 + .../resources/static/generic/web/viewer.js | 7614 ++++++++++++++ .../main/resources/static/view/userlist.html | 122 + .../src/main/resources/templates/demo3.ftl | 17 + .../resources/templates/pdfPreviewIframe.ftl | 30 + .../main/resources/templates/thirdLogin.ftl | 28 + .../test/java/com/jero/SecurityToolsTest.java | 49 + .../online/desform/test/DesformApiTest.java | 192 + .../online/desform/test/OnlineApiTest.java | 190 + .../jero/modules/system/test/SysUserTest.java | 188 + pom.xml | 387 + 689 files changed, 74480 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 db/Dockerfile create mode 100644 db/jeroboot-mysql-5.7.sql create mode 100644 db/jeroboot-oracle11g.sql create mode 100644 db/jeroboot-sqlserver2017.sql create mode 100644 db/tables_nacos.sql create mode 100644 db/tables_xxl_job.sql create mode 100644 db/增量SQL/2.4升级到2.4.2增量mysql.sql create mode 100644 db/增量SQL/jimureport/jimureport.mysql5.7.create.sql create mode 100644 db/增量SQL/版本升级说明.txt create mode 100644 docker-compose-server.yml create mode 100644 docker-compose.yml create mode 100644 jero-boot-base/jero-boot-base-api/pom.xml create mode 100644 jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java create mode 100644 jero-boot-base/jero-boot-base-core/pom.xml create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/CommonAPI.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/IWpsBaseAPI.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileDownDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileUploadDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/LogDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/OnlineAuthDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusMessageDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusTemplateMessageDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/MessageDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateMessageDTO.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/OaWpsModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/Result.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/AutoLogAspect.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/DictAspect.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/PermissionDataAspect.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/UrlMatchEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/AutoLog.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/Dict.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/DictPoint.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/OnlineAuth.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/PermissionData.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CacheConstant.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonConstant.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonSendStatus.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/DataBaseConstant.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/FillRuleConstant.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ProvinceCityArea.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ServiceNameConstants.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/VXESocketConst.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/WebsocketConst.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/CgformEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/ModuleType.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/JeroElasticsearchTemplate.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/QueryStringBuilder.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootException.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootExceptionHandler.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/handler/IFillRuleHandler.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/entity/JeroEntity.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/JeroService.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/impl/JeroServiceImpl.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/MatchTypeEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryCondition.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryRuleEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JeroDataAutorUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/ComboModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictQuery.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DynamicDataSourceModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysCategoryModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartTreeModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysPermissionDataRuleModel.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysUserCacheInfo.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserType.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/CommonUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DateUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsHelper.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/FillRuleUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HTMLUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/IPUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ImportExcelUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MD5Util.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MinioUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MyClassLoader.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PasswordUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PmsUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RedisUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ReflectHelper.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestDesformUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SimpleFormat.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SpringContextUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SqlInjectionUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SysAnnmentTypeEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/UUIDGenerator.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ValidUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/YouBianCodeUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/DataSourceCachePool.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/DynamicDBUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/FreemarkerParseFactory.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/SqlUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/AesEncryptUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/EncryptedString.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/filter/StrAttackFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/BaseColumn.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/CommonProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonSchemaDescrip.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonschemaUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/DictProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/HiddenProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/LinkDownProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/NumberProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/PopupProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/StringProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/SwitchProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/TreeSelectProperty.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oConvertUtils.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oss/OssBootUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/SecurityTools.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/MyKeyPair.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityReq.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityResp.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignReq.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignResp.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/ObjectParseUtil.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleEnum.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleVo.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiDictConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/JeroCloudCondition.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/RestTemplateConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/StaticConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/Swagger2Config.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebMvcConfiguration.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebSocketConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/cors/CorsFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/csrf/CsrfFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/HTMLFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/SqlFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssHttpServletRequestWrapper.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/JeroTenantParser.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisInterceptor.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisPlusConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/TenantContext.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/MinioConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/OssConfiguration.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/redis/RedisConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/JwtToken.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/CustomShiroFilterFactoryBean.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/JwtFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/ResourceCheckFilter.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/mapper/BaseCommonMapper.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/mapper/xml/BaseCommonMapper.xml create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/BaseCommonService.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/impl/BaseCommonServiceImpl.java create mode 100644 jero-boot-base/jero-boot-base-core/src/main/resources/static/pca.json create mode 100644 jero-boot-base/jero-boot-base-tools/pom.xml create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/annotation/RabbitComponent.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/base/BaseMap.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/config/CommonConfig.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/constant/GlobalConstants.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/clent/JeroRedisClient.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/config/RedisConfiguration.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/listener/JeroRedisListerer.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/prop/JeroRedisProperties.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/service/RedisReceiver.java create mode 100644 jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/util/SpringContextHolder.java create mode 100644 jero-boot-base/pom.xml create mode 100644 jero-boot-module-demo/pom.xml create mode 100644 jero-boot-module-system/.gitattributes create mode 100644 jero-boot-module-system/Dockerfile create mode 100644 jero-boot-module-system/pom.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/config/init/SystemInitListener.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/config/init/TomcatFactoryConfig.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/config/jimureport/JimuReportTokenService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/api/controller/SystemAPIController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/cas/controller/CasClientController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/cas/util/CASServiceUtil.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/cas/util/XmlUtils.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageTemplateController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/entity/MsgParams.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessage.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/handle/ISendMsgHandle.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgStatusEnum.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgTypeEnum.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/EmailSendMsgHandle.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/SmsSendMsgHandle.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/WxSendMsgHandle.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/job/SendMsgJob.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageTemplateMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageTemplateMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageTemplateService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageTemplateServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/util/PushMsgUtil.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/SocketHandler.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/TestSocketController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/WebSocket.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/monitor/controller/ActuatorRedisController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/monitor/domain/RedisInfo.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/monitor/exception/RedisConnectException.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/RedisService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/MailHealthIndicator.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/RedisServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/ngalain/aop/LogRecordAspect.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/ngalain/controller/NgAlainController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/NgAlainService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/impl/NgAlainServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/oss/controller/OSSFileController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/oss/entity/OSSFile.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/oss/mapper/OSSFileMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/oss/service/IOSSFileService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/controller/QuartzJobController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/entity/QuartzJob.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/AsyncJob.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleJob.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleParamJob.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/QuartzJobMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/xml/QuartzJobMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/IQuartzJobService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/impl/QuartzJobServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementSendController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCategoryController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCheckRuleController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysConfusionController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataLogController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataSourceController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartPermissionController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartRoleController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictItemController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysFillRuleController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysGatewayRouteController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysLogController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserAgentController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/controller/ThirdLoginController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncement.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncementSend.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCategory.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCheckRule.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysConfusion.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataLog.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataSource.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepart.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartPermission.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRole.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRolePermission.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRoleUser.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDict.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysFillRule.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysGatewayRoute.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysLog.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermission.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermissionDataRule.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRole.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRolePermission.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysThirdAccount.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserAgent.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserDepart.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserRole.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementSendMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCategoryMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCheckRuleMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysConfusionMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataLogMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataSourceMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartPermissionMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRolePermissionMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleUserMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictItemMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysFillRuleMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysGatewayRouteMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysLogMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionDataRuleMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRoleMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRolePermissionMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysThirdAccountMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserAgentMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserDepartMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserRoleMapper.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementSendMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCategoryMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCheckRuleMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysConfusionMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataLogMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataSourceMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartPermissionMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRolePermissionMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleUserMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictItemMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysFillRuleMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysGatewayRouteMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysLogMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysThirdAccountMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserAgentMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserDepartMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/AnnouncementSendModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/DepartIdModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/DuplicateCheckVo.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysDictTree.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysLoginModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysPermissionTree.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysUserSysDepartModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/ThirdLoginModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeSelectModel.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/rule/CategoryCodeRule.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrderNumberRule.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrgCodeRule.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementSendService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCategoryService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCheckRuleService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysConfusionService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataLogService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataSourceService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartPermissionService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRolePermissionService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleUserService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictItemService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysFillRuleService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysGatewayRouteService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysLogService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionDataRuleService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRolePermissionService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRoleService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysThirdAccountService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserAgentService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserDepartService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserRoleService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/ImportFileServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementSendServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCategoryServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCheckRuleServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysConfusionServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataLogServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataSourceServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartPermissionServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleUserServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictItemServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysFillRuleServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysGatewayRouteServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysLogServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionDataRuleImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRolePermissionServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysThirdAccountServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserAgentServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserDepartServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserRoleServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/util/FindsDepartsChildrenUtil.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/util/PermissionDataUtil.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/util/RandImageUtil.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/util/SecurityUtil.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/util/TenantContext.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDepartUsersVO.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDictPage.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserDepVo.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserRoleVO.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/CreateGroup.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/UpdateGroup.java create mode 100644 jero-boot-single-startup/pom.xml create mode 100644 jero-boot-single-startup/src/main/java/com/jero/JeroSystemSingleApplication.java create mode 100644 jero-boot-single-startup/src/main/resources/application-dev.yml create mode 100644 jero-boot-single-startup/src/main/resources/application-prod.yml create mode 100644 jero-boot-single-startup/src/main/resources/application-test.yml create mode 100644 jero-boot-single-startup/src/main/resources/application.yml create mode 100644 jero-boot-single-startup/src/main/resources/banner.txt create mode 100644 jero-boot-single-startup/src/main/resources/logback-spring.xml create mode 100644 jero-boot-single-startup/src/main/resources/spy.properties create mode 100644 jero-boot-single-startup/src/main/resources/static/demo1.html create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/LICENSE create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78ms-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78ms-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/83pv-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90ms-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90ms-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90msp-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90msp-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90pv-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90pv-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-0.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-1.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-3.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-4.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-5.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-6.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-UCS2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-0.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-1.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-3.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-4.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-5.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-UCS2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-0.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-1.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-3.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-4.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-5.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-6.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-UCS2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-0.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-1.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-UCS2.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5pc-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5pc-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS1-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS1-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETHK-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETHK-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETen-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETen-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Ext-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Ext-RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Ext-RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Ext-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK2K-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK2K-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBKp-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBKp-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBTpc-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBTpc-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBpc-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBpc-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdla-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdla-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdlb-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdlb-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKgccs-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKgccs-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm314-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm314-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm471-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm471-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKscs-B5-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKscs-B5-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Hankaku.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Hiragana.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-Johab-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-Johab-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-HW-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-HW-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCpc-EUC-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCpc-EUC-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Katakana.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/LICENSE create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/NWP-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/NWP-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/RKSJ-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/RKSJ-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Roman.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UCS2-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UCS2-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF16-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF16-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF8-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF8-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UCS2-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UCS2-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF16-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF16-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF8-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF8-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF16-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF16-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF8-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF8-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF16-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF16-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF8-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF8-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UCS2-HW-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UCS2-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UTF8-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX0213-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX0213-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX02132004-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX02132004-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UCS2-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UCS2-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF16-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF16-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF32-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF32-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF8-H.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF8-V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/V.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/WP-Symbol.bcmap create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/compatibility.js create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/compressed.tracemonkey-pldi-09.pdf create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/debugger.js create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-check.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-comment.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-help.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-insert.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-key.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-newparagraph.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-noicon.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-note.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-paragraph.svg create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/grab.cur create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/grabbing.cur create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-icon.gif create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-small.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-small@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-documentProperties.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-documentProperties@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-firstPage.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-firstPage@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-handTool.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-handTool@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-lastPage.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-lastPage@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-rotateCcw.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-rotateCcw@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-rotateCw.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-rotateCw@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/shadow.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/texture.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-bookmark.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-bookmark@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-download.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-download@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-menuArrows.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-menuArrows@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-openFile.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-openFile@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-presentationMode.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-presentationMode@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-print.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-print@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-search.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-search@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-secondaryToolbarToggle.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-secondaryToolbarToggle@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewAttachments.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewAttachments@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewOutline-rtl.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewOutline-rtl@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewOutline.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewOutline@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewThumbnail.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewThumbnail@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomIn.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomIn@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomOut.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomOut@2x.png create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/l10n.js create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/locale/locale.properties create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/locale/zh-CN/viewer.properties create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/viewer.css create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/viewer.html create mode 100644 jero-boot-single-startup/src/main/resources/static/generic/web/viewer.js create mode 100644 jero-boot-single-startup/src/main/resources/static/view/userlist.html create mode 100644 jero-boot-single-startup/src/main/resources/templates/demo3.ftl create mode 100644 jero-boot-single-startup/src/main/resources/templates/pdfPreviewIframe.ftl create mode 100644 jero-boot-single-startup/src/main/resources/templates/thirdLogin.ftl create mode 100644 jero-boot-single-startup/src/test/java/com/jero/SecurityToolsTest.java create mode 100644 jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/DesformApiTest.java create mode 100644 jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/OnlineApiTest.java create mode 100644 jero-boot-single-startup/src/test/java/com/jero/modules/system/test/SysUserTest.java create mode 100644 pom.xml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d479839e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.js linguist-language=Java +*.css linguist-language=Java +*.html linguist-language=Java +*.vue linguist-language=Java diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2d937e7f --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +/target/ +/.idea/ +jeecg-boot-module-demo +rebel.xml + +#java +*.class + +#package file +*.war +*.ear +*.zip +*.tar.gz +*.rar +#maven ignore +target/ +build/ + +#eclipse ignore +.settings/ +.project +.classpatch + +#Intellij idea +.idea/ +/idea/ +out/ +logs/ +*.ipr +*.iml +*.iws + +# temp file +*.log +*.cache +*.diff +*.patch +*.tmp \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..774af2dc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 jero-boot + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..9494c114 --- /dev/null +++ b/README.md @@ -0,0 +1,247 @@ +# jero-boot 低代码开发平台(青春版) + +=============== + +当前最新版本: 2.4.2(发布日期:20210126) +青春版修改内容请看第五点和第六点 + +## 后端技术架构 + +- 基础框架:Spring Boot 2.3.5.RELEASE + +- 持久层框架:Mybatis-plus 3.4.1 + +- 安全框架:Apache Shiro 1.7.0,Jwt 3.11.0 + +- 数据库连接池:阿里巴巴Druid 1.1.22 + +- 缓存框架:redis + +- 日志打印:logback + +- 其他:fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。 + +## 开发环境 + +- 语言:Java 8 + +- IDE(JAVA): Eclipse安装lombok插件 或者 IDEA + +- 依赖管理:Maven + +- 数据库:MySQL5.7+ & Oracle 11g + +- 缓存:Redis + +## 技术文档 + +- 在线文档: [http://doc.xxx.com](http://doc.xxx.com) + +- 常见问题: [http://xxx.com/doc/qa](http://xxx.com/doc/qa) + +## 专项文档 + +### 初始管理员账户密码 + +账户: admin +密码: 123456 + +### 一、查询过滤器用法 + +```text +QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(?, req.getParameterMap()); +``` + +代码示例: + +```text + + @GetMapping(value = "/list") + public Result> list(JeroDemo jeroDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + + //调用QueryGenerator的initQueryWrapper + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(jeroDemo, req.getParameterMap()); + + Page page = new Page(pageNo, pageSize); + IPage pageList = JeroDemoService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + +``` + +- 查询规则 (本规则不适用于高级查询,高级查询有自己对应的查询类型可以选择 ) + +| 查询模式 | 用法 | 说明 | +|---------- |-------------------------------------------------------|------------------| +| 模糊查询 | 支持左右模糊和全模糊 需要在查询输入框内前或后带\*或是前后全部带\* | | +| 取非查询 | 在查询输入框前面输入! 则查询该字段不等于输入值的数据(数值类型不支持此种查询,可以将数值字段定义为字符串类型的) | | +| \> \>= < <= | 同取非查询 在输入框前面输入对应特殊字符即表示走对应规则查询 | | +| in查询 | 若传入的数据带,(逗号) 则表示该查询为in查询 | | +| 多选字段模糊查询 | 上述4 有一个特例,若某一查询字段前后都带逗号 则会将其视为走这种查询方式 ,该查询方式是将查询条件以逗号分割再遍历数组 将每个元素作like查询 用or拼接,例如 现在name传入值 ,a,b,c, 那么结果sql就是 name like '%a%' or name like '%b%' or name like '%c%' | | + +### 三、代码生成器 + +> 功能说明: 一键生成的代码(包括:controller、service、dao、mapper、entity、vue) + +- 模板位置: src/main/resources/jero/code-template +- 技术文档: + +### 四、编码排重使用示例 + +重复校验效果: +![输入图片说明](https://static.oschina.net/uploads/img/201904/19191836_eGkQ.png "在这里输入图片标题") + +1.引入排重接口,代码如下: + +```js +import { duplicateCheck } from '@/api/api' + ``` + +2.找到编码必填校验规则的前端代码,代码如下: + +```js + + +code: { + rules: [ + { required: true, message: '请输入编码!' }, + {validator: this.validateCode} + ] + } + ``` + +3.找到rules里validator对应的方法在哪里,然后使用第一步中引入的排重校验接口. + 以用户online表单编码为示例,其中四个必传的参数有: + +```text + {tableName:表名,fieldName:字段名,fieldVal:字段值,dataId:表的主键}, + ``` + + 具体使用代码如下: + +```text + validateCode(rule, value, callback){ + let pattern = /^[a-z|A-Z][a-z|A-Z|\d|_|-]{0,}$/; + if(!pattern.test(value)){ + callback('编码必须以字母开头,可包含数字、下划线、横杠'); + } else { + var params = { + tableName: "onl_cgreport_head", + fieldName: "code", + fieldVal: value, + dataId: this.model.id + }; + duplicateCheck(params).then((res)=>{ + if(res.success){ + callback(); + }else{ + callback(res.message); + } + }) + } + } +``` + +6.访问后台项目(注意要开启swagger) + +```text + http://localhost:8080/jero-boot/doc.html +``` + +### 五 精简功能 + +1. 去除了Online代码生成功能的sql,代码,配置文件 + jero-boot-base-generater模块 和 jero-boot-base-generater-core模块 +2. 去除了spring cloud相关的代码和依赖 +3. 去除了demo模块的内容 +4. 去除了多租户模块功能 +5. 把jero-system-local-api模块改为jero-boot-base-api模块 + 删除jero-system-cloud-api模块 + +### 六 新增功能 + +1. 集成p6spy sql打印依赖 + - 数据库url和驱动改为p6spy + - 注释了yml文件里mybatis-plus的sql打印 + - 增加了[spy.properties](/jero-boot-single-startup/src/main/resources/spy.properties)配置文件 + +2. 增加[@DictPoint](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/DictPoint.java)注解(会查找返回值中的@Dict返回字典数据) +使用方法如下: + + ```text + @DictPoint + @GetMapping(value = "/a") + public Result a() { + + } + ``` + +3. 账号和密码提示信息改为"登录失败,用户名或密码错误!" +4. 验证码过期时间改为5分钟 +5. 指定生成的jar包名 + [pom.xml](./pom.xml) + + ```xml + + jero-boot + + ``` + +6. 增加xss过滤,cors过滤,html过滤,sql过滤 + [webConfig](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebConfig.java) + [xss过滤](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssFilter.java) + [cors过滤](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/cors/CorsFilter.java) + [html过滤](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/HTMLFilter.java) + [sql过滤](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/SqlFilter.java) + 在jero-boot-base-core模块com.jero.config.filter路径下 +7. @Valid相关 + - 增加全局处理@Valid验证异常 + 在jero-boot-base-core模块com.jero.common.exception路径下 + [JeroBootExceptionHandler](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootExceptionHandler.java) + + ````text + /** + * get方法使用BindException接收 + */ + @ExceptionHandler(BindException.class) + @ResponseBody + public Result handleBindException(BindException e) { + log.error(e.getMessage(), e.getBindingResult().getFieldError().getDefaultMessage()); + return Result.error(e.getBindingResult().getFieldError().getDefaultMessage()); + } + + /** + * post方法使用MethodArgumentNotValidException接收 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error(e.getMessage(),e.getBindingResult().getFieldError().getDefaultMessage()); + return Result.error(e.getBindingResult().getFieldError().getDefaultMessage()); + } + ```` + + - 增加手动校验方法 + [ValidUtil.validate()](/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ValidUtil.java) + 使用情景,当想要校验一个对象的参数是否符合规则时,随时随地都可以调用: + + ````text + public Result add(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String selectedRoles = jsonObject.getString("selectedroles"); + String selectedDeparts = jsonObject.getString("selecteddeparts"); + SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); + ValidUtil.validate(user); + ```` + +8. 修改重复校验工具的校验规则[DuplicateCheckController](/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java) + - 增加了一个混淆表sys_confusion 参数有 + - |表明|字段名|混淆码| + |----|----|----| + |table_name|field_name|confusion_code| + - 根据传入的混淆码获取表名和字段名,然后重复校验 diff --git a/db/Dockerfile b/db/Dockerfile new file mode 100644 index 00000000..2b8f3076 --- /dev/null +++ b/db/Dockerfile @@ -0,0 +1,13 @@ +FROM mysql:8.0.19 + +MAINTAINER jeecgos@163.com + +ENV TZ=Asia/Shanghai + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +COPY ./tables_nacos.sql /docker-entrypoint-initdb.d + +COPY jeroboot-mysql-5.7.sql /docker-entrypoint-initdb.d + +COPY ./tables_xxl_job.sql /docker-entrypoint-initdb.d \ No newline at end of file diff --git a/db/jeroboot-mysql-5.7.sql b/db/jeroboot-mysql-5.7.sql new file mode 100644 index 00000000..70d2ac7e --- /dev/null +++ b/db/jeroboot-mysql-5.7.sql @@ -0,0 +1,1387 @@ +/* + Navicat Premium Data Transfer + + Source Server : local_mysql + Source Server Type : MySQL + Source Server Version : 50721 + Source Host : localhost:3306 + Source Schema : jero-boot2 + + Target Server Type : MySQL + Target Server Version : 50721 + File Encoding : 65001 + + Date: 23/04/2021 13:04:27 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for oss_file +-- ---------------------------- +DROP TABLE IF EXISTS `oss_file`; +CREATE TABLE `oss_file` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称', + `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件地址', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'Oss File 文件上传表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `BLOB_DATA` blob NULL, + 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 = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz以Blob 类型存储的触发器' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CALENDAR_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存放日历信息, quartz可配置一个日历来指定一个时间范围。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CRON_EXPRESSION` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + 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 = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存放cron类型的触发器。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- +INSERT INTO `qrtz_cron_triggers` VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', '0/1 * * * * ?', 'Asia/Shanghai'); +INSERT INTO `qrtz_cron_triggers` VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', '0/1 * * * * ?', 'Asia/Shanghai'); + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `INSTANCE_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FIRED_TIME` bigint(13) NOT NULL, + `SCHED_TIME` bigint(13) NOT NULL, + `PRIORITY` int(11) NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存放已触发的触发器。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存放一个jobDetail信息。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- +INSERT INTO `qrtz_job_details` VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', NULL, 'com.jero.modules.quartz.job.SampleJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000001740009706172616D65746572707800); +INSERT INTO `qrtz_job_details` VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', NULL, 'com.jero.modules.quartz.job.SampleParamJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000001740009706172616D6574657274000573636F74747800); + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存储程序的悲观锁的信息(假如使用了悲观锁)。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- +INSERT INTO `qrtz_locks` VALUES ('MyScheduler', 'STATE_ACCESS'); +INSERT INTO `qrtz_locks` VALUES ('MyScheduler', 'TRIGGER_ACCESS'); +INSERT INTO `qrtz_locks` VALUES ('quartzScheduler', 'TRIGGER_ACCESS'); + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存放暂停掉的触发器。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `INSTANCE_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint(13) NOT NULL, + `CHECKIN_INTERVAL` bigint(13) NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz调度器状态。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- +INSERT INTO `qrtz_scheduler_state` VALUES ('MyScheduler', 'MMMMMM1619153807188', 1619154265676, 10000); + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REPEAT_COUNT` bigint(7) NOT NULL, + `REPEAT_INTERVAL` bigint(12) NOT NULL, + `TIMES_TRIGGERED` bigint(10) NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) 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 = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz简单触发器的信息。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `INT_PROP_1` int(11) NULL DEFAULT NULL, + `INT_PROP_2` int(11) NULL DEFAULT NULL, + `LONG_PROP_1` bigint(20) NULL DEFAULT NULL, + `LONG_PROP_2` bigint(20) NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + 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 = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL, + `PRIORITY` int(11) NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `START_TIME` bigint(13) NOT NULL, + `END_TIME` bigint(13) NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + 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 = utf8 COLLATE = utf8_general_ci COMMENT = 'quartz触发器的基本信息。' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- +INSERT INTO `qrtz_triggers` VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', NULL, 1588405730000, 1588405729000, 5, 'PAUSED', 'CRON', 1588405237000, 0, NULL, 0, ''); +INSERT INTO `qrtz_triggers` VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', NULL, 1588405236000, 1588405235000, 5, 'PAUSED', 'CRON', 1588405221000, 0, NULL, 0, ''); + +-- ---------------------------- +-- Table structure for sys_announcement +-- ---------------------------- +DROP TABLE IF EXISTS `sys_announcement`; +CREATE TABLE `sys_announcement` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `titile` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标题', + `msg_content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '内容', + `start_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', + `sender` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发布人', + `priority` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '优先级(L低,M中,H高)', + `msg_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '2' COMMENT '消息类型1:通知公告2:系统消息', + `msg_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通告对象类型(USER:指定用户,ALL:全体用户)', + `send_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发布状态(0未发布,1已发布,2已撤销)', + `send_time` datetime(0) NULL DEFAULT NULL COMMENT '发布时间', + `cancel_time` datetime(0) NULL DEFAULT NULL COMMENT '撤销时间', + `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除状态(0,正常,1已删除)', + `bus_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务类型(email:邮件 bpm:流程)', + `bus_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务id', + `open_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '打开方式(组件:component 路由:url)', + `open_page` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件/路由 地址', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `user_ids` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '指定用户', + `msg_abstract` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '摘要', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统通告表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_announcement_send +-- ---------------------------- +DROP TABLE IF EXISTS `sys_announcement_send`; +CREATE TABLE `sys_announcement_send` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `annt_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通告ID', + `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id', + `read_flag` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '阅读状态(0未读,1已读)', + `read_time` datetime(0) NULL DEFAULT NULL COMMENT '阅读时间', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间' +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户通告阅读标记表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_category +-- ---------------------------- +DROP TABLE IF EXISTS `sys_category`; +CREATE TABLE `sys_category` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `pid` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级节点', + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型名称', + `code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型编码', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + `has_child` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否有子节点', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `index_code`(`code`) USING BTREE, + INDEX `idx_sc_code`(`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '分类字典' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_check_rule +-- ---------------------------- +DROP TABLE IF EXISTS `sys_check_rule`; +CREATE TABLE `sys_check_rule` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `rule_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则名称', + `rule_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则Code', + `rule_json` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则JSON', + `rule_description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则描述', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uni_sys_check_rule_code`(`rule_code`) USING BTREE, + UNIQUE INDEX `uk_scr_rule_code`(`rule_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '编码校验规则表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_check_rule +-- ---------------------------- +INSERT INTO `sys_check_rule` VALUES ('1224980593992388610', '通用编码规则-Demo', 'common', '[{\"digits\":\"1\",\"pattern\":\"^[a-z|A-Z]$\",\"message\":\"第一位只能是字母\"},{\"digits\":\"*\",\"pattern\":\"^[0-9|a-z|A-Z|_]{0,}$\",\"message\":\"只能填写数字、大小写字母、下划线\"},{\"digits\":\"*\",\"pattern\":\"^.{3,}$\",\"message\":\"最少输入3位数\"},{\"digits\":\"*\",\"pattern\":\"^.{3,12}$\",\"message\":\"最多输入12位数\"}]', '规则:1、首位只能是字母;2、只能填写数字、大小写字母、下划线;3、最少3位数,最多12位数。', 'admin', '2021-03-16 16:34:09', 'admin', '2020-02-05 16:58:27'); + +-- ---------------------------- +-- Table structure for sys_data_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_data_log`; +CREATE TABLE `sys_data_log` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `data_table` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表名', + `data_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据ID', + `data_content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '数据内容', + `data_version` int(11) NULL DEFAULT NULL COMMENT '版本号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `sindex`(`data_table`, `data_id`) USING BTREE, + INDEX `idx_sdl_data_table_id`(`data_table`, `data_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据日志表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_data_log +-- ---------------------------- +INSERT INTO `sys_data_log` VALUES ('402880f05ab0d198015ab12274bf0006', 'admin', '2017-03-09 11:35:09', NULL, NULL, 'jero_demo', '4028ef81550c1a7901550c1cd6e70001', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Jun 23, 2016 12:00:00 PM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"9001\",\"status\":\"1\",\"content\":\"111\",\"id\":\"4028ef81550c1a7901550c1cd6e70001\"}', 3); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab700bead0009', 'admin', '2017-03-10 14:56:03', NULL, NULL, 'jero_demo', '402880f05ab6d12b015ab700be8d0008', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 2:56:03 PM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"111\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab700be8d0008\"}', 1); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab705a23f000d', 'admin', '2017-03-10 15:01:24', NULL, NULL, 'jero_demo', '402880f05ab6d12b015ab705a233000c', '{\"mobilePhone\":\"\",\"officePhone\":\"11\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 3:01:24 PM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"11\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab705a233000c\"}', 1); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab712a6420013', 'admin', '2017-03-10 15:15:37', NULL, NULL, 'jero_demo', '402880f05ab6d12b015ab712a6360012', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 3:15:37 PM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小王\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab712a6360012\"}', 1); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab712d0510015', 'admin', '2017-03-10 15:15:47', NULL, NULL, 'jero_demo', '402880f05ab6d12b015ab712a6360012', '{\"mobilePhone\":\"18611788525\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 3:15:37 AM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小王\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab712a6360012\"}', 2); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab71308240018', 'admin', '2017-03-10 15:16:02', NULL, NULL, 'jero_demo', '8a8ab0b246dc81120146dc81860f016f', '{\"mobilePhone\":\"13111111111\",\"officePhone\":\"66666666\",\"email\":\"demo@jero.com\",\"age\":12,\"salary\":10.00,\"birthday\":\"Feb 14, 2014 12:00:00 AM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小明\",\"status\":\"\",\"content\":\"\",\"id\":\"8a8ab0b246dc81120146dc81860f016f\"}', 1); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab72806c3001b', 'admin', '2017-03-10 15:38:58', NULL, NULL, 'jero_demo', '8a8ab0b246dc81120146dc81860f016f', '{\"mobilePhone\":\"18611788888\",\"officePhone\":\"66666666\",\"email\":\"demo@jero.com\",\"age\":12,\"salary\":10.00,\"birthday\":\"Feb 14, 2014 12:00:00 AM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小明\",\"status\":\"\",\"content\":\"\",\"id\":\"8a8ab0b246dc81120146dc81860f016f\"}', 2); +INSERT INTO `sys_data_log` VALUES ('4028ef815318148a0153181567690001', 'admin', '2016-02-25 18:59:29', NULL, NULL, 'jero_demo', '4028ef815318148a0153181566270000', '{\"mobilePhone\":\"13423423423\",\"officePhone\":\"1\",\"email\":\"\",\"age\":1,\"salary\":1,\"birthday\":\"Feb 25, 2016 12:00:00 AM\",\"createDate\":\"Feb 25, 2016 6:59:24 PM\",\"depId\":\"402880e447e9a9570147e9b6a3be0005\",\"userName\":\"1\",\"status\":\"0\",\"id\":\"4028ef815318148a0153181566270000\"}', 1); +INSERT INTO `sys_data_log` VALUES ('4028ef815318148a01531815ec5c0003', 'admin', '2016-02-25 19:00:03', NULL, NULL, 'jero_demo', '4028ef815318148a0153181566270000', '{\"mobilePhone\":\"13426498659\",\"officePhone\":\"1\",\"email\":\"\",\"age\":1,\"salary\":1.00,\"birthday\":\"Feb 25, 2016 12:00:00 AM\",\"createDate\":\"Feb 25, 2016 6:59:24 AM\",\"depId\":\"402880e447e9a9570147e9b6a3be0005\",\"userName\":\"1\",\"status\":\"0\",\"id\":\"4028ef815318148a0153181566270000\"}', 2); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c0502e6b0003', 'admin', '2016-03-29 10:59:53', NULL, NULL, 'jero_demo', '4028ef8153c028db0153c0502d420002', '{\"mobilePhone\":\"18455477548\",\"officePhone\":\"123\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 10:59:53 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"123\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0502d420002\"}', 1); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c0509aa40006', 'admin', '2016-03-29 11:00:21', NULL, NULL, 'jero_demo', '4028ef8153c028db0153c0509a3e0005', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 11:00:21 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"22\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0509a3e0005\"}', 1); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c051c4a70008', 'admin', '2016-03-29 11:01:37', NULL, NULL, 'jero_demo', '4028ef8153c028db0153c0509a3e0005', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 11:00:21 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"22\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0509a3e0005\"}', 2); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c051d4b5000a', 'admin', '2016-03-29 11:01:41', NULL, NULL, 'jero_demo', '4028ef8153c028db0153c0502d420002', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"123\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 10:59:53 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"123\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0502d420002\"}', 2); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c07033d8000d', 'admin', '2016-03-29 11:34:52', NULL, NULL, 'jero_demo', '4028ef8153c028db0153c0502d420002', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"123\",\"email\":\"\",\"age\":23,\"createDate\":\"Mar 29, 2016 10:59:53 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"123\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0502d420002\"}', 3); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c070492e000f', 'admin', '2016-03-29 11:34:57', NULL, NULL, 'jero_demo', '4028ef8153c028db0153c0509a3e0005', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"\",\"email\":\"\",\"age\":22,\"createDate\":\"Mar 29, 2016 11:00:21 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"22\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0509a3e0005\"}', 3); +INSERT INTO `sys_data_log` VALUES ('4028ef81550c1a7901550c1cd7850002', 'admin', '2016-06-01 21:17:44', NULL, NULL, 'jero_demo', '4028ef81550c1a7901550c1cd6e70001', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Jun 1, 2016 9:17:44 PM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"121221\",\"status\":\"0\",\"id\":\"4028ef81550c1a7901550c1cd6e70001\"}', 1); +INSERT INTO `sys_data_log` VALUES ('4028ef81568c31ec01568c3307080004', 'admin', '2016-08-15 11:16:09', NULL, NULL, 'jero_demo', '4028ef81550c1a7901550c1cd6e70001', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Jun 23, 2016 12:00:00 PM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"9001\",\"status\":\"1\",\"content\":\"111\",\"id\":\"4028ef81550c1a7901550c1cd6e70001\"}', 2); + +-- ---------------------------- +-- Table structure for sys_data_source +-- ---------------------------- +DROP TABLE IF EXISTS `sys_data_source`; +CREATE TABLE `sys_data_source` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源编码', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源名称', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `db_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型', + `db_driver` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驱动类', + `db_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源地址', + `db_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库名称', + `db_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `db_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `sys_data_source_code_uni`(`code`) USING BTREE, + UNIQUE INDEX `uk_sdc_rule_code`(`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '多数据源管理表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_data_source +-- ---------------------------- +INSERT INTO `sys_data_source` VALUES ('1209779538310004737', 'local_mysql', 'MySQL5.7-Demo', '本地数据库MySQL5.7', '4', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai', 'jero-boot', 'jero-boot', 'c0e5dbdaede24c84091fb7dc0db47ccb', 'admin', '2019-12-25 18:14:53', 'admin', '2021-03-16 16:44:03', 'A01'); + +-- ---------------------------- +-- Table structure for sys_depart +-- ---------------------------- +DROP TABLE IF EXISTS `sys_depart`; +CREATE TABLE `sys_depart` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID', + `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父机构ID', + `depart_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构/部门名称', + `depart_name_en` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '英文名', + `depart_name_abbr` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩写', + `depart_order` int(11) NULL DEFAULT 0 COMMENT '排序', + `description` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司,2组织机构,2岗位', + `org_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '机构类型 1一级部门 2子部门', + `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构编码', + `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', + `fax` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '传真', + `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', + `memo` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `status` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态(1启用,0不启用)', + `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除状态(0,正常,1已删除)', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_depart_org_code`(`org_code`) USING BTREE, + INDEX `index_depart_parent_id`(`parent_id`) USING BTREE, + INDEX `index_depart_depart_order`(`depart_order`) USING BTREE, + INDEX `index_depart_org_code`(`org_code`) USING BTREE, + INDEX `idx_sd_parent_id`(`parent_id`) USING BTREE, + INDEX `idx_sd_depart_order`(`depart_order`) USING BTREE, + INDEX `idx_sd_org_code`(`org_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织机构表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_depart +-- ---------------------------- +INSERT INTO `sys_depart` VALUES ('c6d7cb4deeac411cb3384b1b31278596', '', '公司总部', NULL, NULL, 0, NULL, '1', '1', 'A01', NULL, NULL, NULL, NULL, NULL, '0', 'admin', '2019-02-11 14:21:51', 'admin', '2021-03-16 14:19:08'); + +-- ---------------------------- +-- Table structure for sys_depart_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_depart_permission`; +CREATE TABLE `sys_depart_permission` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `depart_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id', + `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限id', + `data_rule_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据规则id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_depart_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_depart_role`; +CREATE TABLE `sys_depart_role` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `depart_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id', + `role_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门角色名称', + `role_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门角色编码', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门角色表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_depart_role_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_depart_role_permission`; +CREATE TABLE `sys_depart_role_permission` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `depart_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id', + `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id', + `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限id', + `data_rule_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据权限ids', + `operate_date` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `operate_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作ip', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_group_role_per_id`(`role_id`, `permission_id`) USING BTREE, + INDEX `index_group_role_id`(`role_id`) USING BTREE, + INDEX `index_group_per_id`(`permission_id`) USING BTREE, + INDEX `idx_sdrp_role_per_id`(`role_id`, `permission_id`) USING BTREE, + INDEX `idx_sdrp_role_id`(`role_id`) USING BTREE, + INDEX `idx_sdrp_per_id`(`permission_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门角色权限表' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for sys_depart_role_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_depart_role_user`; +CREATE TABLE `sys_depart_role_user` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id', + `drole_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门角色用户表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_dict +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict`; +CREATE TABLE `sys_dict` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `dict_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称', + `dict_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典编码', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `type` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '字典类型0为string,1为number', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `indextable_dict_code`(`dict_code`) USING BTREE, + UNIQUE INDEX `uk_sd_dict_code`(`dict_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict +-- ---------------------------- +INSERT INTO `sys_dict` VALUES ('0b5d19e1fce4b2e6647e6b4a17760c14', '通告类型', 'msg_category', '消息类型1:通知公告2:系统消息', 0, 'admin', '2019-04-22 18:01:35', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('1174511106530525185', '机构类型', 'org_category', '机构类型 1公司,2部门 3岗位', 0, 'admin', '2019-09-19 10:30:43', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('1209733563293962241', '数据库类型', 'database_type', '', 0, 'admin', '2019-12-25 15:12:12', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('1232913193820581889', 'Online表单业务分类', 'ol_form_biz_type', '', 0, 'admin', '2020-02-27 14:19:46', 'admin', '2020-02-27 14:20:23', 0); +INSERT INTO `sys_dict` VALUES ('1250687930947620866', '定时任务状态', 'quartz_status', '', 0, 'admin', '2020-04-16 15:30:14', '', NULL, NULL); +INSERT INTO `sys_dict` VALUES ('1280401766745718786', '租户状态', 'tenant_status', '租户状态', 0, 'admin', '2020-07-07 15:22:25', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('236e8a4baff0db8c62c00dd95632834f', '同步工作流引擎', 'activiti_sync', '同步工作流引擎', 0, 'admin', '2019-05-15 15:27:33', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('2e02df51611a4b9632828ab7e5338f00', '权限策略', 'perms_type', '权限策略', 0, 'admin', '2019-04-26 18:26:55', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', '', 0, 'admin', '2019-03-17 21:21:32', 'admin', '2019-03-26 19:57:45', 0); +INSERT INTO `sys_dict` VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', NULL, 0, 'admin', '2019-01-18 21:46:26', 'admin', '2019-03-30 11:17:11', 0); +INSERT INTO `sys_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', NULL, 0, NULL, '2019-01-04 14:56:32', 'admin', '2019-03-30 11:28:27', 1); +INSERT INTO `sys_dict` VALUES ('4274efc2292239b6f000b153f50823ff', '全局权限策略', 'global_perms_type', '全局权限策略', 0, 'admin', '2019-05-10 17:54:05', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', NULL, 0, 'admin', '2020-06-18 23:18:42', 'admin', '2019-03-30 19:33:52', 1); +INSERT INTO `sys_dict` VALUES ('4d7fec1a7799a436d26d02325eff295e', '优先级', 'priority', '优先级', 0, 'admin', '2019-03-16 17:03:34', 'admin', '2019-04-16 17:39:23', 0); +INSERT INTO `sys_dict` VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', '', 0, 'admin', '2019-04-01 10:15:03', 'admin', '2019-04-01 10:30:47', 0); +INSERT INTO `sys_dict` VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', NULL, 0, 'admin', '2019-04-11 14:27:09', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('68168534ff5065a152bfab275c2136f8', '有效无效状态', 'valid_status', '有效无效状态', 0, 'admin', '2020-09-26 19:21:14', 'admin', '2019-04-26 19:21:23', 0); +INSERT INTO `sys_dict` VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', '', 0, 'admin', '2019-01-27 10:13:02', 'admin', '2019-03-30 11:37:36', 0); +INSERT INTO `sys_dict` VALUES ('78bda155fe380b1b3f175f1e88c284c6', '流程状态', 'bpm_status', '流程状态', 0, 'admin', '2019-05-09 16:31:52', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', NULL, 0, 'admin', '2019-03-18 23:22:19', NULL, NULL, 1); +INSERT INTO `sys_dict` VALUES ('845da5006c97754728bf48b6a10f79cc', '状态', 'status', NULL, 0, 'admin', '2019-03-18 21:45:25', 'admin', '2019-03-18 21:58:25', 0); +INSERT INTO `sys_dict` VALUES ('880a895c98afeca9d9ac39f29e67c13e', '操作类型', 'operate_type', '操作类型', 0, 'admin', '2019-07-22 10:54:29', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('8dfe32e2d29ea9430a988b3b558bf233', '发布状态', 'send_status', '发布状态', 0, 'admin', '2019-04-16 17:40:42', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('a7adbcd86c37f7dbc9b66945c82ef9e6', '1是0否', 'yn', '', 0, 'admin', '2019-05-22 19:29:29', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', NULL, 0, 'admin', '2019-04-12 18:18:17', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', NULL, 0, 'admin', '2020-12-18 23:24:32', 'admin', '2019-04-01 15:27:06', 1); +INSERT INTO `sys_dict` VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', NULL, 0, 'admin', '2019-03-18 21:59:51', NULL, NULL, 0); +INSERT INTO `sys_dict` VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', NULL, 0, 'admin', '2019-03-18 21:57:25', 'admin', '2019-03-18 23:11:58', 1); + +-- ---------------------------- +-- Table structure for sys_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_item`; +CREATE TABLE `sys_dict_item` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `dict_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典id', + `item_text` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典项文本', + `item_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典项值', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `sort_order` int(10) NULL DEFAULT NULL COMMENT '排序', + `status` int(11) NULL DEFAULT NULL COMMENT '状态(1启用 0不启用)', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_table_dict_id`(`dict_id`) USING BTREE, + INDEX `index_table_sort_order`(`sort_order`) USING BTREE, + INDEX `index_table_dict_status`(`status`) USING BTREE, + INDEX `idx_sdi_role_dict_id`(`dict_id`) USING BTREE, + INDEX `idx_sdi_role_sort_order`(`sort_order`) USING BTREE, + INDEX `idx_sdi_status`(`status`) USING BTREE, + INDEX `idx_sdi_dict_val`(`dict_id`, `item_value`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典内容表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_item +-- ---------------------------- +INSERT INTO `sys_dict_item` VALUES ('0072d115e07c875d76c9b022e2179128', '4d7fec1a7799a436d26d02325eff295e', '低', 'L', '低', 3, 1, 'admin', '2019-04-16 17:04:59', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', NULL, NULL, 1, 'admin', '2025-10-18 21:46:56', 'admin', '2019-03-28 22:23:20'); +INSERT INTO `sys_dict_item` VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', NULL, NULL, 1, 'admin', '2019-03-17 21:22:19', 'admin', '2019-03-17 21:22:28'); +INSERT INTO `sys_dict_item` VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', NULL, 3, 1, 'admin', '2019-03-27 10:13:43', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1030a2652608f5eac3b49d70458b8532', '2e02df51611a4b9632828ab7e5338f00', '禁用', '2', '禁用', 2, 1, 'admin', '2021-03-26 18:27:28', 'admin', '2019-04-26 18:39:11'); +INSERT INTO `sys_dict_item` VALUES ('1174509082208395266', '1174511106530525185', '岗位', '3', '岗位', 1, 1, 'admin', '2019-09-19 10:31:16', '', NULL); +INSERT INTO `sys_dict_item` VALUES ('1174511197735665665', '1174511106530525185', '公司', '1', '公司', 1, 1, 'admin', '2019-09-19 10:31:05', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1174511244036587521', '1174511106530525185', '部门', '2', '部门', 1, 1, 'admin', '2019-09-19 10:31:16', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1199607547704647681', '4f69be5f507accea8d5df5f11346181a', '系统', '4', '', 1, 1, 'admin', '2019-11-27 16:35:02', 'admin', '2019-11-27 19:37:46'); +INSERT INTO `sys_dict_item` VALUES ('1209733775114702850', '1209733563293962241', 'MySQL5.5', '1', '', 1, 1, 'admin', '2019-12-25 15:13:02', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1209733839933476865', '1209733563293962241', 'Oracle', '2', '', 3, 1, 'admin', '2019-12-25 15:13:18', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1209733903020003330', '1209733563293962241', 'SQLServer', '3', '', 4, 1, 'admin', '2019-12-25 15:13:33', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1232913424813486081', '1232913193820581889', '官方示例', 'demo', '', 1, 1, 'admin', '2020-02-27 14:20:42', 'admin', '2020-02-27 14:21:37'); +INSERT INTO `sys_dict_item` VALUES ('1232913493717512194', '1232913193820581889', '流程表单', 'bpm', '', 2, 1, 'admin', '2020-02-27 14:20:58', 'admin', '2020-02-27 14:22:20'); +INSERT INTO `sys_dict_item` VALUES ('1232913605382467585', '1232913193820581889', '测试表单', 'temp', '', 4, 1, 'admin', '2020-02-27 14:21:25', 'admin', '2020-02-27 14:22:16'); +INSERT INTO `sys_dict_item` VALUES ('1232914232372195330', '1232913193820581889', '导入表单', 'bdfl_include', '', 5, 1, 'admin', '2020-02-27 14:23:54', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1234371726545010689', '4e4602b3e3686f0911384e188dc7efb4', '左模糊', 'LEFT_LIKE', '左模糊', 7, 1, 'admin', '2020-03-02 14:55:27', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1234371809495760898', '4e4602b3e3686f0911384e188dc7efb4', '右模糊', 'RIGHT_LIKE', '右模糊', 7, 1, 'admin', '2020-03-02 14:55:47', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1250688147579228161', '1250687930947620866', '正常', '0', '', 1, 1, 'admin', '2020-04-16 15:31:05', '', NULL); +INSERT INTO `sys_dict_item` VALUES ('1250688201064992770', '1250687930947620866', '停止', '-1', '', 1, 1, 'admin', '2020-04-16 15:31:18', '', NULL); +INSERT INTO `sys_dict_item` VALUES ('1280401815068295170', '1280401766745718786', '正常', '1', '', 1, 1, 'admin', '2020-07-07 15:22:36', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1280401847607705602', '1280401766745718786', '冻结', '0', '', 1, 1, 'admin', '2020-07-07 15:22:44', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', NULL, 1, 1, 'admin', '2020-12-03 18:16:02', 'admin', '2020-12-03 18:16:02'); +INSERT INTO `sys_dict_item` VALUES ('222705e11ef0264d4214affff1fb4ff9', '4f69be5f507accea8d5df5f11346181a', '短信', '1', '', 1, 1, 'admin', '2023-02-28 10:50:36', 'admin', '2019-04-28 10:58:11'); +INSERT INTO `sys_dict_item` VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', '不等于', 3, 1, 'admin', '2019-04-01 16:46:15', 'admin', '2019-04-01 17:48:40'); +INSERT INTO `sys_dict_item` VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', '小于等于', 6, 1, 'admin', '2019-04-01 16:44:34', 'admin', '2019-04-01 17:49:10'); +INSERT INTO `sys_dict_item` VALUES ('2d51376643f220afdeb6d216a8ac2c01', '68168534ff5065a152bfab275c2136f8', '有效', '1', '有效', 2, 1, 'admin', '2019-04-26 19:22:01', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('308c8aadf0c37ecdde188b97ca9833f5', '8dfe32e2d29ea9430a988b3b558bf233', '已发布', '1', '已发布', 2, 1, 'admin', '2019-04-16 17:41:24', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('333e6b2196e01ef9a5f76d74e86a6e33', '8dfe32e2d29ea9430a988b3b558bf233', '未发布', '0', '未发布', 1, 1, 'admin', '2019-04-16 17:41:12', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', NULL, 3, 1, 'admin', '2019-04-12 18:20:02', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('3fbc03d6c994ae06d083751248037c0e', '78bda155fe380b1b3f175f1e88c284c6', '已完成', '3', '已完成', 3, 1, 'admin', '2019-05-09 16:33:25', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('41d7aaa40c9b61756ffb1f28da5ead8e', '0b5d19e1fce4b2e6647e6b4a17760c14', '通知公告', '1', NULL, 1, 1, 'admin', '2019-04-22 18:01:57', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', '等于', 4, 1, 'admin', '2019-04-01 16:45:24', 'admin', '2019-04-01 17:49:00'); +INSERT INTO `sys_dict_item` VALUES ('43d2295b8610adce9510ff196a49c6e9', '845da5006c97754728bf48b6a10f79cc', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 21:45:51', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:22:49', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('51222413e5906cdaf160bb5c86fb827c', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '是', '1', '', 1, 1, 'admin', '2019-05-22 19:29:45', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('538fca35afe004972c5f3947c039e766', '2e02df51611a4b9632828ab7e5338f00', '显示', '1', '显示', 1, 1, 'admin', '2025-03-26 18:27:13', 'admin', '2019-04-26 18:39:07'); +INSERT INTO `sys_dict_item` VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL表达式', 'USE_SQL_RULES', '自定义SQL表达式', 9, 1, 'admin', '2019-04-01 10:45:24', 'admin', '2019-04-01 17:49:27'); +INSERT INTO `sys_dict_item` VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', NULL, 2, 1, 'admin', '2019-03-27 10:13:36', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', NULL, NULL, 1, 'admin', '2020-10-17 21:22:43', 'admin', '2019-03-28 22:17:09'); +INSERT INTO `sys_dict_item` VALUES ('5d833f69296f691843ccdd0c91212b6b', '880a895c98afeca9d9ac39f29e67c13e', '修改', '3', '', 3, 1, 'admin', '2019-07-22 10:55:07', 'admin', '2019-07-22 10:55:41'); +INSERT INTO `sys_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', NULL, 2, 1, NULL, '2019-01-04 14:56:56', NULL, '2019-01-04 17:38:12'); +INSERT INTO `sys_dict_item` VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', '大于', 1, 1, 'admin', '2019-04-01 10:45:46', 'admin', '2019-04-01 17:48:29'); +INSERT INTO `sys_dict_item` VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', NULL, 1, 1, 'admin', '2019-04-12 18:19:23', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('6a7a9e1403a7943aba69e54ebeff9762', '4f69be5f507accea8d5df5f11346181a', '邮件', '2', '', 2, 1, 'admin', '2031-02-28 10:50:44', 'admin', '2019-04-28 10:59:03'); +INSERT INTO `sys_dict_item` VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', NULL, 1, 1, 'admin', '2019-03-27 10:13:29', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', '模糊', 7, 1, 'admin', '2019-04-01 16:46:02', 'admin', '2019-04-01 17:49:20'); +INSERT INTO `sys_dict_item` VALUES ('6d4e26e78e1a09699182e08516c49fc4', '4d7fec1a7799a436d26d02325eff295e', '高', 'H', '高', 1, 1, 'admin', '2019-04-16 17:04:24', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54'); +INSERT INTO `sys_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:29:28', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:30:28', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:25:40', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:30:37', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', '', 1, 1, 'admin', '2019-05-10 17:54:51', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', 5, 1, 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05'); +INSERT INTO `sys_dict_item` VALUES ('84dfc178dd61b95a72900fcdd624c471', '78bda155fe380b1b3f175f1e88c284c6', '处理中', '2', '处理中', 2, 1, 'admin', '2019-05-09 16:33:01', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:25:27', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('8bccb963e1cd9e8d42482c54cc609ca2', '4f69be5f507accea8d5df5f11346181a', '微信', '3', NULL, 3, 1, 'admin', '2021-05-11 14:29:12', 'admin', '2019-04-11 14:29:31'); +INSERT INTO `sys_dict_item` VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', '', 0, 1, 'admin', '2020-07-18 23:19:27', 'admin', '2019-05-17 14:51:18'); +INSERT INTO `sys_dict_item` VALUES ('8cdf08045056671efd10677b8456c999', '4274efc2292239b6f000b153f50823ff', '可编辑(未授权时禁用)', '2', '', 2, 1, 'admin', '2019-05-10 17:55:38', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('8ff48e657a7c5090d4f2a59b37d1b878', '4d7fec1a7799a436d26d02325eff295e', '中', 'M', '中', 2, 1, 'admin', '2019-04-16 17:04:40', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('948923658baa330319e59b2213cda97c', '880a895c98afeca9d9ac39f29e67c13e', '添加', '2', '', 2, 1, 'admin', '2019-07-22 10:54:59', 'admin', '2019-07-22 10:55:36'); +INSERT INTO `sys_dict_item` VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', NULL, 1, 1, 'admin', '2019-03-18 23:19:53', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('a1e7d1ca507cff4a480c8caba7c1339e', '880a895c98afeca9d9ac39f29e67c13e', '导出', '6', '', 6, 1, 'admin', '2019-07-22 12:06:50', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('a2be752dd4ec980afaec1efd1fb589af', '8dfe32e2d29ea9430a988b3b558bf233', '已撤销', '2', '已撤销', 3, 1, 'admin', '2019-04-16 17:41:39', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:24:52', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', '包含', 8, 1, 'admin', '2019-04-01 16:45:47', 'admin', '2019-04-01 17:49:24'); +INSERT INTO `sys_dict_item` VALUES ('b029a41a851465332ee4ee69dcf0a4c2', '0b5d19e1fce4b2e6647e6b4a17760c14', '系统消息', '2', NULL, 1, 1, 'admin', '2019-02-22 18:02:08', 'admin', '2019-04-22 18:02:13'); +INSERT INTO `sys_dict_item` VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', NULL, NULL, 1, 'admin', '2022-10-18 21:46:48', 'admin', '2019-03-28 22:22:20'); +INSERT INTO `sys_dict_item` VALUES ('b5f3bd5f66bb9a83fecd89228c0d93d1', '68168534ff5065a152bfab275c2136f8', '无效', '0', '无效', 1, 1, 'admin', '2019-04-26 19:21:49', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('b9fbe2a3602d4a27b45c100ac5328484', '78bda155fe380b1b3f175f1e88c284c6', '待提交', '1', '待提交', 1, 1, 'admin', '2019-05-09 16:32:35', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('ba27737829c6e0e582e334832703d75e', '236e8a4baff0db8c62c00dd95632834f', '同步', '1', '同步', 1, 1, 'admin', '2019-05-15 15:28:15', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('bcec04526b04307e24a005d6dcd27fd6', '880a895c98afeca9d9ac39f29e67c13e', '导入', '5', '', 5, 1, 'admin', '2019-07-22 12:06:41', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('c53da022b9912e0aed691bbec3c78473', '880a895c98afeca9d9ac39f29e67c13e', '查询', '1', '', 1, 1, 'admin', '2019-07-22 10:54:51', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('c5700a71ad08994d18ad1dacc37a71a9', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '否', '0', '', 1, 1, 'admin', '2019-05-22 19:29:55', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', NULL, 1, 1, NULL, '2027-08-04 14:56:49', 'admin', '2019-03-23 22:44:44'); +INSERT INTO `sys_dict_item` VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', '小于', 2, 1, 'admin', '2019-04-01 16:44:15', 'admin', '2019-04-01 17:48:34'); +INSERT INTO `sys_dict_item` VALUES ('e94eb7af89f1dbfa0d823580a7a6e66a', '236e8a4baff0db8c62c00dd95632834f', '不同步', '0', '不同步', 2, 1, 'admin', '2019-05-15 15:28:28', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', NULL, 2, 1, 'admin', '2019-04-12 18:19:43', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('f2a7920421f3335afdf6ad2b342f6b5d', '845da5006c97754728bf48b6a10f79cc', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 21:46:02', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:22:37', NULL, NULL); +INSERT INTO `sys_dict_item` VALUES ('f80a8f6838215753b05e1a5ba3346d22', '880a895c98afeca9d9ac39f29e67c13e', '删除', '4', '', 4, 1, 'admin', '2019-07-22 10:55:14', 'admin', '2019-07-22 10:55:30'); +INSERT INTO `sys_dict_item` VALUES ('fe50b23ae5e68434def76f67cef35d2d', '78bda155fe380b1b3f175f1e88c284c6', '已作废', '4', '已作废', 4, 1, 'admin', '2021-09-09 16:33:43', 'admin', '2019-05-09 16:34:40'); + +-- ---------------------------- +-- Table structure for sys_fill_rule +-- ---------------------------- +DROP TABLE IF EXISTS `sys_fill_rule`; +CREATE TABLE `sys_fill_rule` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID', + `rule_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则名称', + `rule_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则Code', + `rule_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则实现类', + `rule_params` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则参数', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uni_sys_fill_rule_code`(`rule_code`) USING BTREE, + UNIQUE INDEX `uk_sfr_rule_code`(`rule_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '填值规则表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_fill_rule +-- ---------------------------- +INSERT INTO `sys_fill_rule` VALUES ('1202551334738382850', '机构编码生成', 'org_num_role', 'com.jero.modules.system.rule.OrgCodeRule', '{\"parentId\":\"c6d7cb4deeac411cb3384b1b31278596\"}', 'admin', '2019-12-09 10:37:06', 'admin', '2019-12-05 19:32:35'); +INSERT INTO `sys_fill_rule` VALUES ('1202787623203065858', '分类字典编码生成', 'category_code_rule', 'com.jero.modules.system.rule.CategoryCodeRule', '{\"pid\":\"\"}', 'admin', '2019-12-09 10:36:54', 'admin', '2019-12-06 11:11:31'); + +-- ---------------------------- +-- Table structure for sys_gateway_route +-- ---------------------------- +DROP TABLE IF EXISTS `sys_gateway_route`; +CREATE TABLE `sys_gateway_route` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `router_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路由ID', + `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务名', + `uri` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务地址', + `predicates` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '断言', + `filters` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '过滤器', + `retryable` int(3) NULL DEFAULT NULL COMMENT '是否重试:0-否 1-是', + `strip_prefix` int(3) NULL DEFAULT NULL COMMENT '是否忽略前缀0-否 1-是', + `persistable` int(3) NULL DEFAULT NULL COMMENT '是否为保留数据:0-否 1-是', + `show_api` int(3) NULL DEFAULT NULL COMMENT '是否在接口文档中展示:0-否 1-是', + `status` int(3) NULL DEFAULT NULL COMMENT '状态:0-无效 1-有效', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'gateway路由管理' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_gateway_route +-- ---------------------------- +INSERT INTO `sys_gateway_route` VALUES ('1331051599401857026', 'jero-demo-websocket', 'jero-demo-websocket', 'lb:ws://jero-demo', '[{\"args\":[\"/vxeSocket/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-24 09:46:46', NULL, NULL, NULL); +INSERT INTO `sys_gateway_route` VALUES ('jero-cloud-websocket', 'jero-system-websocket', 'jero-system-websocket', 'lb:ws://jero-system', '[{\"args\":[\"/websocket/**\",\"/eoaSocket/**\",\"/newsWebsocket/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL); +INSERT INTO `sys_gateway_route` VALUES ('jero-demo', 'jero-demo', 'jero-demo', 'lb://jero-demo', '[{\"args\":[\"/mock/**\",\"/test/**\",\"/bigscreen/template1/**\",\"/bigscreen/template2/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL); +INSERT INTO `sys_gateway_route` VALUES ('jero-system', 'jero-system', 'jero-system', 'lb://jero-system', '[{\"args\":[\"/sys/**\",\"/eoa/**\",\"/joa/**\",\"/online/**\",\"/bigscreen/**\",\"/jmreport/**\",\"/desform/**\",\"/process/**\",\"/act/**\",\"/plug-in/***/\",\"/druid/**\",\"/generic/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log`; +CREATE TABLE `sys_log` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `log_type` int(2) NULL DEFAULT NULL COMMENT '日志类型(1登录日志,2操作日志)', + `log_content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '日志内容', + `operate_type` int(2) NULL DEFAULT NULL COMMENT '操作类型', + `userid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作用户账号', + `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作用户名称', + `ip` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'IP', + `method` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求java方法', + `request_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求路径', + `request_param` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请求参数', + `request_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求类型', + `cost_time` bigint(20) NULL DEFAULT NULL COMMENT '耗时', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_table_userid`(`userid`) USING BTREE, + INDEX `index_logt_ype`(`log_type`) USING BTREE, + INDEX `index_operate_type`(`operate_type`) USING BTREE, + INDEX `index_log_type`(`log_type`) USING BTREE, + INDEX `idx_sl_userid`(`userid`) USING BTREE, + INDEX `idx_sl_log_type`(`log_type`) USING BTREE, + INDEX `idx_sl_operate_type`(`operate_type`) USING BTREE, + INDEX `idx_sl_create_time`(`create_time`) USING BTREE +) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统日志表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_log +-- ---------------------------- +INSERT INTO `sys_log` VALUES ('1385457895031435266', 1, '用户名: 开发管理员,退出成功!', NULL, 'admin', '开发管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2021-04-23 12:57:57', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1385457925930872833', 1, '用户名: admin,登录成功!', NULL, 'admin', '开发管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2021-04-23 12:58:05', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1385459069537218562', 2, '多数据源管理-分页列表查询', 1, 'admin', '开发管理员', '127.0.0.1', 'com.jero.modules.system.controller.SysDataSourceController.queryPageList()', NULL, ' sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@90dad63', NULL, 87, NULL, '2021-04-23 13:02:37', NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_permission`; +CREATE TABLE `sys_permission` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父id', + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单标题', + `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径', + `component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件', + `component_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件名字', + `redirect` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '一级菜单跳转地址', + `menu_type` int(11) NULL DEFAULT NULL COMMENT '菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)', + `perms` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码', + `perms_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '权限策略1显示2禁用', + `sort_no` double(8, 2) NULL DEFAULT NULL COMMENT '菜单排序', + `always_show` tinyint(1) NULL DEFAULT NULL COMMENT '聚合子路由: 1是0否', + `icon` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单图标', + `is_route` tinyint(1) NULL DEFAULT 1 COMMENT '是否路由菜单: 0:不是 1:是(默认值1)', + `is_leaf` tinyint(1) NULL DEFAULT NULL COMMENT '是否叶子节点: 1:是 0:不是', + `keep_alive` tinyint(1) NULL DEFAULT NULL COMMENT '是否缓存该页面: 1:是 0:不是', + `hidden` int(2) NULL DEFAULT 0 COMMENT '是否隐藏路由: 0否,1是', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `del_flag` int(1) NULL DEFAULT 0 COMMENT '删除状态 0正常 1已删除', + `rule_flag` int(3) NULL DEFAULT 0 COMMENT '是否添加数据权限1是0否', + `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮权限状态(0无效1有效)', + `internal_or_external` tinyint(1) NULL DEFAULT NULL COMMENT '外链菜单打开方式 0/内部打开 1/外部打开', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_prem_pid`(`parent_id`) USING BTREE, + INDEX `index_prem_is_route`(`is_route`) USING BTREE, + INDEX `index_prem_is_leaf`(`is_leaf`) USING BTREE, + INDEX `index_prem_sort_no`(`sort_no`) USING BTREE, + INDEX `index_prem_del_flag`(`del_flag`) USING BTREE, + INDEX `index_menu_type`(`menu_type`) USING BTREE, + INDEX `index_menu_hidden`(`hidden`) USING BTREE, + INDEX `index_menu_status`(`status`) USING BTREE, + INDEX `idx_sp_parent_id`(`parent_id`) USING BTREE, + INDEX `idx_sp_is_route`(`is_route`) USING BTREE, + INDEX `idx_sp_is_leaf`(`is_leaf`) USING BTREE, + INDEX `idx_sp_sort_no`(`sort_no`) USING BTREE, + INDEX `idx_sp_del_flag`(`del_flag`) USING BTREE, + INDEX `idx_sp_menu_type`(`menu_type`) USING BTREE, + INDEX `idx_sp_hidden`(`hidden`) USING BTREE, + INDEX `idx_sp_status`(`status`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_permission +-- ---------------------------- +INSERT INTO `sys_permission` VALUES ('00a2a0ae65cdca5e93209cdbde97cbe6', '2e42e3835c2b44ec9f7bc26c146ee531', '成功', '/result/success', 'result/Success', NULL, NULL, 1, NULL, NULL, 1.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('020b06793e4de2eee0007f603000c769', 'f0675b52d89100ee88472b6800754a08', 'ViserChartDemo', '/report/ViserChartDemo', 'demo/report/ViserChartDemo', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-03 19:08:53', 'admin', '2019-04-03 19:08:53', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('024f1fd1283dc632458976463d8984e1', '700b7f95165c46cc7a78bf227aa8fed3', 'Tomcat信息', '/monitor/TomcatInfo', 'modules/monitor/TomcatInfo', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-02 09:44:29', 'admin', '2019-05-07 15:19:10', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('043780fa095ff1b2bec4dc406d76f023', '2a470fc0c3954d9dbb61de6d80846549', '表格合计', '/demo/tableTotal', 'demo/TableTotal', NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-08-14 10:28:46', NULL, NULL, 0, 0, '1', NULL); +INSERT INTO `sys_permission` VALUES ('05b3c82ddb2536a4a5ee1a4c46b5abef', '540a2936940846cb98114ffb0d145cb8', '用户列表', '/list/user-list', 'demo/list/UserList', NULL, NULL, 1, NULL, NULL, 3.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('0620e402857b8c5b605e1ad9f4b89350', '2a470fc0c3954d9dbb61de6d80846549', '异步树列表Demo', '/demo/jeroTreeTable', 'demo/JeroTreeTable', NULL, NULL, 1, NULL, '0', 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-05-13 17:30:30', 'admin', '2021-03-16 22:19:21', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('078f9558cdeab239aecb2bda1a8ed0d1', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(文章)', '/list/search/article', 'demo/list/TableList', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-02-12 14:00:34', 'admin', '2019-02-12 14:17:54', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('08e6b9dc3c04489c8e1ff2ce6f105aa4', '', '系统监控', '/dashboard3', 'layouts/RouteView', NULL, NULL, 0, NULL, NULL, 16.00, 0, 'dashboard', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:31:58', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('0ac2ad938963b6c6d1af25477d5b8b51', '8d4683aacaa997ab86b966b464360338', '代码生成按钮', NULL, NULL, NULL, NULL, 2, 'online:goGenerateCode', '1', 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-06-11 14:20:09', NULL, NULL, 0, 0, '1', NULL); +INSERT INTO `sys_permission` VALUES ('109c78a583d4693ce2f16551b7786786', 'e41b69c57a941a3bbcce45032fe57605', 'Online报表配置', '/online/cgreport', 'modules/online/cgreport/OnlCgreportHeadList', NULL, NULL, 1, NULL, NULL, 2.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-03-08 10:51:07', 'admin', '2019-03-30 19:04:28', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('1166535831146504193', '2a470fc0c3954d9dbb61de6d80846549', '文件上传示例', '/oss/file', 'modules/oss/OSSFileList', NULL, NULL, 1, NULL, '1', 1.00, 0, '', 1, 1, 0, 0, NULL, 'admin', '2019-08-28 02:19:50', 'admin', '2021-03-16 20:48:53', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1192318987661234177', 'e41b69c57a941a3bbcce45032fe57605', '系统编码规则', '/isystem/fillRule', 'system/SysFillRuleList', NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-11-07 13:52:53', 'admin', '2020-07-10 16:55:03', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1205097455226462210', '1371830841603710977', '报表设计', '/big/screen', 'layouts/RouteView', NULL, NULL, 1, NULL, '1', 2.00, 0, 'area-chart', 1, 0, 0, 0, NULL, 'admin', '2019-12-12 20:09:58', 'admin', '2021-03-16 22:29:22', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1205098241075453953', '1205097455226462210', '生产销售监控', '{{ window._CONFIG[\'domianURL\'] }}/test/bigScreen/templat/index1', 'layouts/IframePageView', NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-12-12 20:13:05', 'admin', '2019-12-12 20:15:27', 0, 0, '1', 1); +INSERT INTO `sys_permission` VALUES ('1205306106780364802', '1205097455226462210', '智慧物流监控', '{{ window._CONFIG[\'domianURL\'] }}/test/bigScreen/templat/index2', 'layouts/IframePageView', NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-12-13 09:59:04', 'admin', '2019-12-25 09:28:03', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1209731624921534465', 'e41b69c57a941a3bbcce45032fe57605', '多数据源管理', '/isystem/dataSource', 'system/SysDataSourceList', NULL, NULL, 1, NULL, '1', 6.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-12-25 15:04:30', 'admin', '2020-02-23 22:43:37', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1224641973866467330', 'e41b69c57a941a3bbcce45032fe57605', '系统校验规则', '/isystem/checkRule', 'system/SysCheckRuleList', NULL, NULL, 1, NULL, '1', 5.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-11-07 13:52:53', 'admin', '2020-07-10 16:55:12', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1260928341675982849', '3f915b2769fc80648e92d04e84ca059d', '添加按钮', NULL, NULL, NULL, NULL, 2, 'user:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-14 21:41:58', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1260929666434318338', '3f915b2769fc80648e92d04e84ca059d', '用户编辑', NULL, NULL, NULL, NULL, 2, 'user:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-14 21:47:14', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1260931366557696001', '3f915b2769fc80648e92d04e84ca059d', '表单性别可见', '', NULL, NULL, NULL, 2, 'user:sex', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-14 21:53:59', 'admin', '2020-05-14 21:57:00', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1260933542969458689', '3f915b2769fc80648e92d04e84ca059d', '禁用生日字段', NULL, NULL, NULL, NULL, 2, 'user:form:birthday', '2', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-14 22:02:38', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1265162119913824258', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '路由网关', '/isystem/gatewayroute', 'system/SysGatewayRouteList', NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 1, 0, 0, NULL, NULL, '2020-05-26 14:05:30', 'admin', '2020-09-09 14:47:52', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1280350452934307841', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '租户管理', '/isys/tenant', 'system/TenantList', NULL, NULL, 1, NULL, '1', 10.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-07 11:58:30', 'admin', '2020-07-10 15:46:35', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1280464606292099074', '2a470fc0c3954d9dbb61de6d80846549', '图片裁剪', '/demo/ImagCropper', 'demo/ImagCropper', NULL, NULL, 1, NULL, '1', 9.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-07 19:32:06', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1287715272999944193', '2a470fc0c3954d9dbb61de6d80846549', 'JVXETable示例', '/demo/j-vxe-table-demo', 'layouts/RouteView', NULL, NULL, 1, NULL, '1', 0.10, 0, '', 1, 0, 0, 0, NULL, 'admin', '2020-07-27 19:43:40', 'admin', '2020-09-09 14:52:06', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1287715783966834689', '1287715272999944193', '普通示例', '/demo/j-vxe-table-demo/normal', 'demo/JVXETableDemo', NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-27 19:45:42', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1287716451494510593', '1287715272999944193', '布局模板', '/demo/j-vxe-table-demo/layout', 'demo/JVxeDemo/layout-demo/Index', NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-27 19:48:21', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1287718919049691137', '1287715272999944193', '即时保存', '/demo/j-vxe-table-demo/jsbc', 'demo/JVxeDemo/demo/JSBCDemo', NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-27 19:57:36', 'admin', '2020-07-27 20:03:37', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1287718938179911682', '1287715272999944193', '弹出子表', '/demo/j-vxe-table-demo/tczb', 'demo/JVxeDemo/demo/PopupSubTable', NULL, NULL, 1, NULL, '1', 4.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-27 19:57:41', 'admin', '2020-07-27 20:03:47', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1287718956957810689', '1287715272999944193', '无痕刷新', '/demo/j-vxe-table-demo/whsx', 'demo/JVxeDemo/demo/SocketReload', NULL, NULL, 1, NULL, '1', 5.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-07-27 19:57:44', 'admin', '2020-07-27 20:03:57', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('13212d3416eb690c2e1d5033166ff47a', '2e42e3835c2b44ec9f7bc26c146ee531', '失败', '/result/fail', 'result/Error', NULL, NULL, 1, NULL, NULL, 2.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('1335960713267093506', '1205097455226462210', '积木报表设计', '{{ window._CONFIG[\'domianURL\'] }}/jmreport/list?token=${token}', 'layouts/IframePageView', NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-12-07 22:53:50', 'admin', '2020-12-08 09:28:06', 0, 0, '1', 1); +INSERT INTO `sys_permission` VALUES ('1367a93f2c410b169faa7abcbad2f77c', '6e73eb3c26099c191bf03852ee1310a1', '基本设置', '/account/settings/BaseSetting', 'account/settings/BaseSetting', 'account-settings-base', NULL, 1, 'BaseSettings', NULL, NULL, 0, NULL, 1, 1, NULL, 1, NULL, NULL, '2018-12-26 18:58:35', 'admin', '2019-03-20 12:57:31', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('1371830841603710977', '', '图表/报表示例', '/charts', 'layouts/RouteView', NULL, NULL, 0, NULL, '1', 19.00, 0, 'line-chart', 1, 0, 0, 0, NULL, 'admin', '2021-03-16 22:28:55', 'admin', '2021-03-16 22:31:24', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1371831353354936322', '', '日志中心', '/log', 'layouts/RouteView', NULL, NULL, 0, NULL, '1', 10.00, 0, 'copy', 1, 0, 0, 0, NULL, 'admin', '2021-03-16 22:30:57', 'admin', '2021-03-16 22:37:10', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383952003393466369', '190c2b43bec6a5f7a4194a85db67d96a', '角色添加', NULL, NULL, NULL, NULL, 2, 'sys:role:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:14:05', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383952499906785282', '190c2b43bec6a5f7a4194a85db67d96a', '角色编辑', NULL, NULL, NULL, NULL, 2, 'sys:role:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:16:03', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383952680177971201', '190c2b43bec6a5f7a4194a85db67d96a', '角色删除', NULL, NULL, NULL, NULL, 2, 'sys:role:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:16:46', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383952988471898113', '45c966826eeff4c99b8f8ebfe74511fc', '部门添加', NULL, NULL, NULL, NULL, 2, 'sys:depart:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:18:00', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383953084483710977', '45c966826eeff4c99b8f8ebfe74511fc', '部门编辑', NULL, NULL, NULL, NULL, 2, 'sys:depart:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:18:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383953171704262657', '45c966826eeff4c99b8f8ebfe74511fc', '部门删除', NULL, NULL, NULL, NULL, 2, 'sys:depart:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:18:43', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383953340499832833', 'f1cb187abf927c88b89470d08615f5ac', '数据字典添加', NULL, NULL, NULL, NULL, 2, 'sys:dict:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:19:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383953594972450818', 'f1cb187abf927c88b89470d08615f5ac', '数据字典编辑', NULL, NULL, NULL, NULL, 2, 'sys:dict:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:20:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383953732851806210', 'f1cb187abf927c88b89470d08615f5ac', '数据字典删除', NULL, NULL, NULL, NULL, 2, 'sys:dict:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:20:57', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383953875781103617', 'ebb9d82ea16ad864071158e0c449d186', '分类字典添加', NULL, NULL, NULL, NULL, 2, 'sys:category:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:21:31', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383954065124569090', 'ebb9d82ea16ad864071158e0c449d186', '分类字典编辑', NULL, NULL, NULL, NULL, 2, 'sys:category:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:22:16', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383954151342682114', 'ebb9d82ea16ad864071158e0c449d186', '分类字典删除', NULL, NULL, NULL, NULL, 2, 'sys:category:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:22:37', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383956546739056641', '3f915b2769fc80648e92d04e84ca059d', '用户删除', NULL, NULL, NULL, NULL, 2, 'sys:user:sel', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:32:08', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383956678637334529', '3f915b2769fc80648e92d04e84ca059d', '用户导入', NULL, NULL, NULL, NULL, 2, 'sys:user:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:32:40', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383956779212550146', '3f915b2769fc80648e92d04e84ca059d', '用户导出', NULL, NULL, NULL, NULL, 2, 'sys:user:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:33:03', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383956904978755586', '190c2b43bec6a5f7a4194a85db67d96a', '角色导入', NULL, NULL, NULL, NULL, 2, 'sys:role:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:33:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957016807288833', '190c2b43bec6a5f7a4194a85db67d96a', '角色导出', NULL, NULL, NULL, NULL, 2, 'sys:role:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:34:00', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957130082856962', '45c966826eeff4c99b8f8ebfe74511fc', '部门导入', NULL, NULL, NULL, NULL, 2, 'sys:depart:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:34:27', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957217370517506', '45c966826eeff4c99b8f8ebfe74511fc', '部门导出', NULL, NULL, NULL, NULL, 2, 'sys:depart:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:34:48', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957378981244930', 'f1cb187abf927c88b89470d08615f5ac', '数据字典导入', NULL, NULL, NULL, NULL, 2, 'sys:dict:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:35:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957508945948674', 'f1cb187abf927c88b89470d08615f5ac', '数据字典导出', NULL, NULL, NULL, NULL, 2, 'sys:dict:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:35:57', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957660913971202', 'ebb9d82ea16ad864071158e0c449d186', '分类字典导入', NULL, NULL, NULL, NULL, 2, 'sys:category:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:36:34', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1383957793466560514', 'ebb9d82ea16ad864071158e0c449d186', '分类字典导出', NULL, NULL, NULL, NULL, 2, 'sys:category:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-04-19 09:37:05', 'admin', '2021-04-19 10:04:58', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('190c2b43bec6a5f7a4194a85db67d96a', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '角色管理', '/isystem/roleUserList', 'system/RoleUserList', NULL, NULL, 1, 'sys:role:list', '1', 1.20, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2019-04-17 15:13:56', 'admin', '2019-12-25 09:36:31', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1a0811914300741f4e11838ff37a1d3a', '3f915b2769fc80648e92d04e84ca059d', '手机号禁用', NULL, NULL, NULL, NULL, 2, 'user:form:phone', '2', 1.00, 0, NULL, 0, 1, NULL, 0, NULL, 'admin', '2019-05-11 17:19:30', 'admin', '2019-05-11 18:00:22', 0, 0, '1', NULL); +INSERT INTO `sys_permission` VALUES ('200006f0edf145a2b50eacca07585451', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(应用)', '/list/search/application', 'demo/list/TableList', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-02-12 14:02:51', 'admin', '2019-02-12 14:14:01', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('265de841c58907954b8877fb85212622', '2a470fc0c3954d9dbb61de6d80846549', '图片拖拽排序', '/demo/imgDragSort', 'demo/ImgDragSort', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-25 10:43:08', 'admin', '2019-04-25 10:46:26', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('277bfabef7d76e89b33062b16a9a5020', 'e3c13679c73a4f829bcff2aba8fd68b1', '基础表单', '/form/base-form', 'demo/form/BasicForm', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 0, NULL, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2019-02-26 17:02:08', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('2a470fc0c3954d9dbb61de6d80846549', '', '开发示例Demo', '/jero', 'layouts/RouteView', NULL, NULL, 0, NULL, NULL, 20.00, 0, 'qrcode', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:31:20', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('2aeddae571695cd6380f6d6d334d6e7d', 'f0675b52d89100ee88472b6800754a08', '布局统计报表', '/report/ArchivesStatisticst', 'demo/report/ArchivesStatisticst', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-03 18:32:48', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('2dbbafa22cda07fa5d169d741b81fe12', 'e41b69c57a941a3bbcce45032fe57605', '在线文档', '{{ window._CONFIG[\'domianURL\'] }}/doc.html', 'layouts/IframePageView', NULL, NULL, 1, NULL, NULL, 8.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-01-30 10:00:01', 'admin', '2021-03-16 22:33:43', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('2e42e3835c2b44ec9f7bc26c146ee531', '2a470fc0c3954d9dbb61de6d80846549', '结果页', '/result', 'layouts/PageView', NULL, NULL, 1, NULL, NULL, 20.00, 0, 'check-circle-o', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:22:54', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('3f915b2769fc80648e92d04e84ca059d', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '用户管理', '/isystem/user', 'system/UserList', NULL, NULL, 1, 'sys:user:list', '1', 1.10, 0, NULL, 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2019-12-25 09:36:24', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('3fac0d3c9cd40fa53ab70d4c583821f8', '2a470fc0c3954d9dbb61de6d80846549', '分屏', '/demo/splitPanel', 'demo/SplitPanel', NULL, NULL, 1, NULL, NULL, 6.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-25 16:27:06', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('4148ec82b6acd69f470bea75fe41c357', '2a470fc0c3954d9dbb61de6d80846549', '单表模型示例', '/demo/JeroDemoList', 'demo/JeroDemoList', 'DemoList', NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, 0, 0, NULL, NULL, '2018-12-28 15:57:30', 'jero', '2020-05-14 22:09:34', 0, 1, NULL, 0); +INSERT INTO `sys_permission` VALUES ('418964ba087b90a84897b62474496b93', '540a2936940846cb98114ffb0d145cb8', '查询表格', '/list/query-list', 'demo/list/TableList', NULL, NULL, 1, NULL, NULL, 1.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('4356a1a67b564f0988a484f5531fd4d9', '2a470fc0c3954d9dbb61de6d80846549', '内嵌Table', '/demo/TableExpandeSub', 'demo/TableExpandeSub', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-04 22:48:13', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('45c966826eeff4c99b8f8ebfe74511fc', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '部门管理', '/isystem/depart', 'system/DepartList', NULL, NULL, 1, 'sys:depart:list', '1', 1.40, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2019-01-29 18:47:40', 'admin', '2019-12-25 09:36:47', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('4875ebe289344e14844d8e3ea1edd73f', '2a470fc0c3954d9dbb61de6d80846549', '详情页', '/profile', 'layouts/RouteView', NULL, NULL, 1, NULL, NULL, 21.00, 0, 'profile', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:23:07', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('4f66409ef3bbd69c1d80469d6e2a885e', '6e73eb3c26099c191bf03852ee1310a1', '账户绑定', '/account/settings/binding', 'account/settings/Binding', NULL, NULL, 1, 'BindingSettings', NULL, NULL, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-26 19:01:20', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('4f84f9400e5e92c95f05b554724c2b58', '540a2936940846cb98114ffb0d145cb8', '角色列表', '/list/role-list', 'demo/list/RoleList', NULL, NULL, 1, NULL, NULL, 4.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('53a9230444d33de28aa11cc108fb1dba', '5c8042bd6c601270b2bbd9b20bccc68b', '我的消息', '/isps/userAnnouncement', 'system/UserAnnouncementList', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-04-19 10:16:00', 'admin', '2021-03-16 18:01:26', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('540a2936940846cb98114ffb0d145cb8', '2a470fc0c3954d9dbb61de6d80846549', '列表页', '/list', 'layouts/PageView', NULL, '/list/query-list', 1, NULL, NULL, 24.00, 0, 'table', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:23:31', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('54dd5457a3190740005c1bfec55b1c34', 'e41b69c57a941a3bbcce45032fe57605', '菜单管理', '/isystem/permission', 'system/PermissionList', NULL, NULL, 1, NULL, NULL, 7.00, 0, NULL, 1, 1, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:32:38', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('58857ff846e61794c69208e9d3a85466', '1371831353354936322', '操作日志', '/isystem/log', 'system/LogList', NULL, NULL, 1, NULL, NULL, 1.00, 0, '', 1, 1, 0, 0, NULL, NULL, '2018-12-26 10:11:18', 'admin', '2021-03-16 22:33:27', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('58b9204feaf07e47284ddb36cd2d8468', '2a470fc0c3954d9dbb61de6d80846549', '图片翻页', '/demo/imgTurnPage', 'demo/ImgTurnPage', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-25 11:36:42', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('5c2f42277948043026b7a14692456828', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '我的部门', '/isystem/departUserList', 'system/DepartUserList', NULL, NULL, 1, NULL, NULL, 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-04-17 15:12:24', 'admin', '2019-12-25 09:35:26', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('5c8042bd6c601270b2bbd9b20bccc68b', '', '消息中心', '/message', 'layouts/RouteView', NULL, NULL, 0, NULL, NULL, 9.00, 0, 'message', 1, 0, 0, 0, NULL, 'admin', '2019-04-09 11:05:04', 'admin', '2021-03-16 22:32:06', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('6531cf3421b1265aeeeabaab5e176e6d', 'e3c13679c73a4f829bcff2aba8fd68b1', '分步表单', '/form/step-form', 'demo/form/stepForm/StepForm', NULL, NULL, 1, NULL, NULL, 2.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('655563cd64b75dcf52ef7bcdd4836953', '2a470fc0c3954d9dbb61de6d80846549', '图片预览', '/demo/ImagPreview', 'demo/ImagPreview', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-17 11:18:45', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('65a8f489f25a345836b7f44b1181197a', 'c65321e57b7949b7a975313220de0422', '403', '/exception/403', 'exception/403', NULL, NULL, 1, NULL, NULL, 1.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('6ad53fd1b220989a8b71ff482d683a5a', '2a470fc0c3954d9dbb61de6d80846549', '一对多Tab示例', '/demo/tablist/jeroOrderDMainList', 'demo/tablist/JeroOrderDMainList', NULL, NULL, 1, NULL, NULL, 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-02-20 14:45:09', 'admin', '2021-03-16 22:18:38', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('6e73eb3c26099c191bf03852ee1310a1', '717f6bee46f44a3897eca9abd6e2ec44', '个人设置', '/account/settings/BaseSetting', 'account/settings/Index', NULL, NULL, 1, NULL, NULL, 2.00, 1, NULL, 1, 0, NULL, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2019-04-19 09:41:05', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('700b7f95165c46cc7a78bf227aa8fed3', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '性能监控', '/monitor', 'layouts/RouteView', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2019-04-02 11:34:34', 'admin', '2020-09-09 14:48:51', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('717f6bee46f44a3897eca9abd6e2ec44', '2a470fc0c3954d9dbb61de6d80846549', '个人页', '/account', 'layouts/RouteView', NULL, NULL, 1, NULL, NULL, 25.00, 0, 'user', 1, 0, 0, 1, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:23:42', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('73678f9daa45ed17a3674131b03432fb', '540a2936940846cb98114ffb0d145cb8', '权限列表', '/list/permission-list', 'demo/list/PermissionList', NULL, NULL, 1, NULL, NULL, 5.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('7960961b0063228937da5fa8dd73d371', '2a470fc0c3954d9dbb61de6d80846549', 'JEditableTable示例', '/demo/JEditableTable', 'demo/JeroEditableTableExample', NULL, NULL, 1, NULL, NULL, 0.20, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-03-22 15:22:18', 'admin', '2021-03-16 22:21:32', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('7ac9eb9ccbde2f7a033cd4944272bf1e', '540a2936940846cb98114ffb0d145cb8', '卡片列表', '/list/card', 'demo/list/CardList', NULL, NULL, 1, NULL, NULL, 7.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('841057b8a1bef8f6b4b20f9a618a7fa6', '1371831353354936322', '数据日志', '/sys/dataLog-list', 'system/DataLogList', NULL, NULL, 1, NULL, NULL, 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-03-11 19:26:49', 'admin', '2021-03-16 22:33:07', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('882a73768cfd7f78f3a37584f7299656', '6e73eb3c26099c191bf03852ee1310a1', '个性化设置', '/account/settings/custom', 'account/settings/Custom', NULL, NULL, 1, 'CustomSettings', NULL, NULL, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-26 19:00:46', NULL, '2018-12-26 21:13:25', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('8b3bff2eee6f1939147f5c68292a1642', '700b7f95165c46cc7a78bf227aa8fed3', '服务器信息', '/monitor/SystemInfo', 'modules/monitor/SystemInfo', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-02 11:39:19', 'admin', '2019-04-02 15:40:02', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('8d1ebd663688965f1fd86a2f0ead3416', '700b7f95165c46cc7a78bf227aa8fed3', 'Redis监控', '/monitor/redis/info', 'modules/monitor/RedisInfo', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-02 13:11:33', 'admin', '2019-05-07 15:18:54', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('8d4683aacaa997ab86b966b464360338', 'e41b69c57a941a3bbcce45032fe57605', 'Online表单开发', '/online/cgform', 'modules/online/cgform/OnlCgformHeadList', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 0, NULL, 0, NULL, 'admin', '2019-03-12 15:48:14', 'admin', '2019-06-11 14:19:17', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('8fb8172747a78756c11916216b8b8066', '717f6bee46f44a3897eca9abd6e2ec44', '工作台', '/dashboard/workplace', 'dashboard/Workplace', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, NULL, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2019-04-02 11:45:02', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('944abf0a8fc22fe1f1154a389a574154', '5c8042bd6c601270b2bbd9b20bccc68b', '消息管理', '/modules/message/sysMessageList', 'modules/message/SysMessageList', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-04-09 11:27:53', 'admin', '2021-03-16 18:01:20', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('9502685863ab87f0ad1134142788a385', '', '首页', '/dashboard/analysis', 'dashboard/Analysis', NULL, NULL, 0, NULL, NULL, 0.00, 0, 'home', 1, 1, NULL, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2019-03-29 11:04:13', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('97c8629abc7848eccdb6d77c24bb3ebb', '700b7f95165c46cc7a78bf227aa8fed3', '磁盘监控', '/monitor/Disk', 'modules/monitor/DiskMonitoring', NULL, NULL, 1, NULL, NULL, 6.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-25 14:30:06', 'admin', '2019-05-05 14:37:14', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('9a90363f216a6a08f32eecb3f0bf12a3', '2a470fc0c3954d9dbb61de6d80846549', 'Jero组件示例', '/demo/SelectDemo', 'demo/SelectDemo', NULL, NULL, 1, NULL, NULL, 0.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-03-19 11:19:05', 'admin', '2021-03-16 22:15:28', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('ae4fed059f67086fd52a73d913cf473d', '540a2936940846cb98114ffb0d145cb8', '内联编辑表格', '/list/edit-table', 'demo/list/TableInnerEditList', NULL, NULL, 1, NULL, NULL, 2.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('aedbf679b5773c1f25e9f7b10111da73', '08e6b9dc3c04489c8e1ff2ce6f105aa4', 'SQL监控', '{{ window._CONFIG[\'domianURL\'] }}/druid/', 'layouts/IframePageView', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-01-30 09:43:22', 'admin', '2020-09-09 14:48:38', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('b1cb0a3fedf7ed0e4653cb5a229837ee', 'e41b69c57a941a3bbcce45032fe57605', '定时任务', '/isystem/QuartzJobList', 'system/QuartzJobList', NULL, NULL, 1, NULL, NULL, 10.00, 0, NULL, 1, 1, 0, 0, NULL, NULL, '2019-01-03 09:38:52', 'admin', '2021-03-16 22:42:39', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('b3c824fc22bd953e2eb16ae6914ac8f9', '4875ebe289344e14844d8e3ea1edd73f', '高级详情页', '/profile/advanced', 'demo/profile/advanced/Advanced', NULL, NULL, 1, NULL, NULL, 2.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('b4dfc7d5dd9e8d5b6dd6d4579b1aa559', 'c65321e57b7949b7a975313220de0422', '500', '/exception/500', 'exception/500', NULL, NULL, 1, NULL, NULL, 3.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('c431130c0bc0ec71b0a5be37747bb36a', '2a470fc0c3954d9dbb61de6d80846549', '一对多JEditable', '/demo/JeroOrderMainListForJEditableTable', 'demo/JeroOrderMainListForJEditableTable', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-03-29 10:51:59', 'admin', '2019-04-04 20:09:39', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('c65321e57b7949b7a975313220de0422', '2a470fc0c3954d9dbb61de6d80846549', '异常页', '/exception', 'layouts/RouteView', NULL, NULL, 1, NULL, NULL, 22.00, 0, 'warning', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:23:19', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('c6cf95444d80435eb37b2f9db3971ae6', '2a470fc0c3954d9dbb61de6d80846549', '数据回执模拟', '/demo/InterfaceTest', 'demo/InterfaceTest', NULL, NULL, 1, NULL, NULL, 6.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-02-19 16:02:23', 'admin', '2019-02-21 16:25:45', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('cc50656cf9ca528e6f2150eba4714ad2', '4875ebe289344e14844d8e3ea1edd73f', '基础详情页', '/profile/basic', 'demo/profile/basic/Index', NULL, NULL, 1, NULL, NULL, 1.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('d07a2c87a451434c99ab06296727ec4f', '700b7f95165c46cc7a78bf227aa8fed3', 'JVM信息', '/monitor/JvmInfo', 'modules/monitor/JvmInfo', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-01 23:07:48', 'admin', '2019-04-02 11:37:16', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('d2bbf9ebca5a8fa2e227af97d2da7548', 'c65321e57b7949b7a975313220de0422', '404', '/exception/404', 'exception/404', NULL, NULL, 1, NULL, NULL, 2.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('d7d6e2e4e2934f2c9385a623fd98c6f3', '', '系统管理', '/isystem', 'layouts/RouteView', NULL, NULL, 0, NULL, NULL, 15.00, 0, 'setting', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:31:34', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('d86f58e7ab516d3bc6bfb1fe10585f97', '717f6bee46f44a3897eca9abd6e2ec44', '个人中心', '/account/center', 'account/center/Index', NULL, NULL, 1, NULL, NULL, 1.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('de13e0f6328c069748de7399fcc1dbbd', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(项目)', '/list/search/project', 'demo/list/TableList', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-02-12 14:01:40', 'admin', '2019-02-12 14:14:18', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('e08cb190ef230d5d4f03824198773950', '5c8042bd6c601270b2bbd9b20bccc68b', '系统通告', '/isystem/annountCement', 'system/SysAnnouncementList', NULL, NULL, 1, 'annountCement', NULL, 1.00, 0, '', 1, 1, 0, 0, NULL, NULL, '2019-01-02 17:23:01', 'admin', '2021-03-16 18:00:58', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('e1979bb53e9ea51cecc74d86fd9d2f64', '2a470fc0c3954d9dbb61de6d80846549', 'PDF预览', '/demo/jeroPdfView', 'demo/JeroPdfView', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-04-25 10:39:35', 'admin', '2021-03-16 22:18:26', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('e3c13679c73a4f829bcff2aba8fd68b1', '2a470fc0c3954d9dbb61de6d80846549', '表单页', '/form', 'layouts/PageView', NULL, NULL, 1, NULL, NULL, 25.00, 0, 'form', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-03-16 22:23:54', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('e41b69c57a941a3bbcce45032fe57605', '', '开发工具', '/online', 'layouts/RouteView', NULL, NULL, 0, NULL, NULL, 18.00, 0, 'cloud', 1, 0, 0, 0, NULL, 'admin', '2019-03-08 10:43:10', 'admin', '2021-03-16 22:31:28', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('e5973686ed495c379d829ea8b2881fc6', 'e3c13679c73a4f829bcff2aba8fd68b1', '高级表单', '/form/advanced-form', 'demo/form/advancedForm/AdvancedForm', NULL, NULL, 1, NULL, NULL, 3.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('e6bfd1fcabfd7942fdd05f076d1dad38', '2a470fc0c3954d9dbb61de6d80846549', '打印测试', '/demo/PrintDemo', 'demo/PrintDemo', NULL, NULL, 1, NULL, NULL, 3.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-02-19 15:58:48', 'admin', '2019-05-07 20:14:39', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('ebb9d82ea16ad864071158e0c449d186', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '分类字典', '/isys/category', 'system/SysCategoryList', NULL, NULL, 1, 'sys:category:list', '1', 5.20, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2019-05-29 18:48:07', 'admin', '2020-02-23 22:45:33', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('ec8d607d0156e198b11853760319c646', '6e73eb3c26099c191bf03852ee1310a1', '安全设置', '/account/settings/security', 'account/settings/Security', NULL, NULL, 1, 'SecuritySettings', NULL, NULL, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-26 18:59:52', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('f0675b52d89100ee88472b6800754a08', '1371830841603710977', '统计报表', '/report', 'layouts/RouteView', NULL, NULL, 1, NULL, NULL, 1.00, 0, 'bar-chart', 1, 0, 0, 0, NULL, 'admin', '2019-04-03 18:32:02', 'admin', '2021-03-16 22:29:03', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('f1cb187abf927c88b89470d08615f5ac', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '数据字典', '/isystem/dict', 'system/DictList', NULL, NULL, 1, 'sys:dict:list', '1', 5.00, 0, NULL, 1, 0, 0, 0, NULL, NULL, '2018-12-28 13:54:43', 'admin', '2020-02-23 22:45:25', 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('f23d9bfff4d9aa6b68569ba2cff38415', '540a2936940846cb98114ffb0d145cb8', '标准列表', '/list/basic-list', 'demo/list/StandardList', NULL, NULL, 1, NULL, NULL, 6.00, NULL, NULL, 1, 1, NULL, NULL, NULL, NULL, '2018-12-25 20:34:38', NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('f780d0d3083d849ccbdb1b1baee4911d', '5c8042bd6c601270b2bbd9b20bccc68b', '模板管理', '/modules/message/sysMessageTemplateList', 'modules/message/SysMessageTemplateList', NULL, NULL, 1, NULL, NULL, 1.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-09 11:50:31', 'admin', '2019-04-12 10:16:34', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('fb07ca05a3e13674dbf6d3245956da2e', '540a2936940846cb98114ffb0d145cb8', '搜索列表', '/list/search', 'demo/list/search/SearchLayout', NULL, '/list/search/article', 1, NULL, NULL, 8.00, 0, NULL, 1, 0, NULL, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2019-02-12 15:09:13', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('fb367426764077dcf94640c843733985', '2a470fc0c3954d9dbb61de6d80846549', '一对多示例', '/demo/jeroOrderMainList', 'demo/JeroOrderMainList', NULL, NULL, 1, NULL, NULL, 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2019-02-15 16:24:11', 'admin', '2021-03-16 22:18:47', 0, 0, NULL, 0); +INSERT INTO `sys_permission` VALUES ('fc810a2267dd183e4ef7c71cc60f4670', '700b7f95165c46cc7a78bf227aa8fed3', '请求追踪', '/monitor/HttpTrace', 'modules/monitor/HttpTrace', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, 'admin', '2019-04-02 09:46:19', 'admin', '2019-04-02 11:37:27', 0, 0, NULL, NULL); +INSERT INTO `sys_permission` VALUES ('fedfbf4420536cacc0218557d263dfea', '6e73eb3c26099c191bf03852ee1310a1', '新消息通知', '/account/settings/notification', 'account/settings/Notification', NULL, NULL, 1, 'NotificationSettings', NULL, NULL, NULL, '', 1, 1, NULL, NULL, NULL, NULL, '2018-12-26 19:02:05', NULL, NULL, 0, 0, NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_permission_data_rule +-- ---------------------------- +DROP TABLE IF EXISTS `sys_permission_data_rule`; +CREATE TABLE `sys_permission_data_rule` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID', + `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单ID', + `rule_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '规则名称', + `rule_column` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段', + `rule_conditions` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '条件', + `rule_value` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '规则值', + `status` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限有效状态1有0否', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_fucntionid`(`permission_id`) USING BTREE, + INDEX `idx_spdr_permission_id`(`permission_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单权限数据规则表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_quartz_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_quartz_job`; +CREATE TABLE `sys_quartz_job` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `job_class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务类名', + `cron_expression` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'cron表达式', + `parameter` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `status` int(1) NULL DEFAULT NULL COMMENT '状态 0正常 -1停止', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_job_class_name`(`job_class_name`) USING BTREE +) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '定时任务在线管理表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_quartz_job +-- ---------------------------- +INSERT INTO `sys_quartz_job` VALUES ('df26ecacf0f75d219d746750fe84bbee', NULL, NULL, 0, 'admin', '2021-03-16 16:47:23', 'com.jero.modules.quartz.job.SampleParamJob', '0/1 * * * * ?', 'scott', 'Demo-带参测试,后台将每隔1秒执行输出日志', -1); +INSERT INTO `sys_quartz_job` VALUES ('a253cdfc811d69fa0efc70d052bc8128', 'admin', '2019-03-30 12:44:48', 0, 'admin', '2021-03-16 16:47:05', 'com.jero.modules.quartz.job.SampleJob', '0/1 * * * * ?', NULL, 'Demo', -1); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `role_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色名称', + `role_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色编码', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_sys_role_role_code`(`role_code`) USING BTREE, + INDEX `idx_sr_role_code`(`role_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES ('f6817f48af4fb3af11b9e8bf182f618b', '开发管理员', 'admin', '开发人员使用的最高管理员', NULL, '2018-12-21 18:03:39', 'admin', '2021-03-16 13:55:05'); + +-- ---------------------------- +-- Table structure for sys_role_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_permission`; +CREATE TABLE `sys_role_permission` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id', + `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限id', + `data_rule_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据权限ids', + `operate_date` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `operate_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作ip', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_group_role_per_id`(`role_id`, `permission_id`) USING BTREE, + INDEX `index_group_role_id`(`role_id`) USING BTREE, + INDEX `index_group_per_id`(`permission_id`) USING BTREE, + INDEX `idx_srp_role_per_id`(`role_id`, `permission_id`) USING BTREE, + INDEX `idx_srp_role_id`(`role_id`) USING BTREE, + INDEX `idx_srp_permission_id`(`permission_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_permission +-- ---------------------------- +INSERT INTO `sys_role_permission` VALUES ('00b82058779cca5106fbb84783534c9b', 'f6817f48af4fb3af11b9e8bf182f618b', '4148ec82b6acd69f470bea75fe41c357', '', NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('0254c0b25694ad5479e6d6935bbc176e', 'f6817f48af4fb3af11b9e8bf182f618b', '944abf0a8fc22fe1f1154a389a574154', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('09bd4fc30ffe88c4a44ed3868f442719', 'f6817f48af4fb3af11b9e8bf182f618b', 'e6bfd1fcabfd7942fdd05f076d1dad38', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('0c2d2db76ee3aa81a4fe0925b0f31365', 'f6817f48af4fb3af11b9e8bf182f618b', '024f1fd1283dc632458976463d8984e1', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('0c6b8facbb1cc874964c87a8cf01e4b1', 'f6817f48af4fb3af11b9e8bf182f618b', '841057b8a1bef8f6b4b20f9a618a7fa6', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('0c6e1075e422972083c3e854d9af7851', 'f6817f48af4fb3af11b9e8bf182f618b', '08e6b9dc3c04489c8e1ff2ce6f105aa4', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('0e1469997af2d3b97fff56a59ee29eeb', 'f6817f48af4fb3af11b9e8bf182f618b', 'e41b69c57a941a3bbcce45032fe57605', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('0f861cb988fdc639bb1ab943471f3a72', 'f6817f48af4fb3af11b9e8bf182f618b', '97c8629abc7848eccdb6d77c24bb3ebb', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1185039870537576450', 'f6817f48af4fb3af11b9e8bf182f618b', '1166535831146504193', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1197431682208206850', 'f6817f48af4fb3af11b9e8bf182f618b', '1192318987661234177', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1197795315916271617', 'f6817f48af4fb3af11b9e8bf182f618b', '109c78a583d4693ce2f16551b7786786', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1209423530518761473', 'f6817f48af4fb3af11b9e8bf182f618b', '1205097455226462210', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1209423530594258945', 'f6817f48af4fb3af11b9e8bf182f618b', '1205098241075453953', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1209423530606841858', 'f6817f48af4fb3af11b9e8bf182f618b', '1205306106780364802', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1209423580355481602', 'f6817f48af4fb3af11b9e8bf182f618b', '190c2b43bec6a5f7a4194a85db67d96a', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1231590078632955905', 'f6817f48af4fb3af11b9e8bf182f618b', '1224641973866467330', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1231590078658121729', 'f6817f48af4fb3af11b9e8bf182f618b', '1209731624921534465', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1260928399955836929', 'f6817f48af4fb3af11b9e8bf182f618b', '1260928341675982849', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1269526122208522241', 'f6817f48af4fb3af11b9e8bf182f618b', '1267412134208319489', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('126ea9faebeec2b914d6d9bef957afb6', 'f6817f48af4fb3af11b9e8bf182f618b', 'f1cb187abf927c88b89470d08615f5ac', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1281494164924653569', 'f6817f48af4fb3af11b9e8bf182f618b', '1280350452934307841', NULL, '2020-07-10 15:43:13', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1281494164945625089', 'f6817f48af4fb3af11b9e8bf182f618b', '1280464606292099074', NULL, '2020-07-10 15:43:13', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1281494684632473602', 'f6817f48af4fb3af11b9e8bf182f618b', '1265162119913824258', NULL, '2020-07-10 15:45:16', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1303585080082485250', 'f6817f48af4fb3af11b9e8bf182f618b', '1287715272999944193', NULL, '2020-09-09 14:44:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1303585080103456769', 'f6817f48af4fb3af11b9e8bf182f618b', '1287715783966834689', NULL, '2020-09-09 14:44:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1303585080116039682', 'f6817f48af4fb3af11b9e8bf182f618b', '1287716451494510593', NULL, '2020-09-09 14:44:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1303585080124428290', 'f6817f48af4fb3af11b9e8bf182f618b', '1287718919049691137', NULL, '2020-09-09 14:44:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1303585080128622593', 'f6817f48af4fb3af11b9e8bf182f618b', '1287718938179911682', NULL, '2020-09-09 14:44:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1303585080141205506', 'f6817f48af4fb3af11b9e8bf182f618b', '1287718956957810689', NULL, '2020-09-09 14:44:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1335960787783098369', 'f6817f48af4fb3af11b9e8bf182f618b', '1335960713267093506', NULL, '2020-12-07 22:54:07', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624661061633', 'f6817f48af4fb3af11b9e8bf182f618b', '1371831353354936322', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624677838849', 'f6817f48af4fb3af11b9e8bf182f618b', '1260929666434318338', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624677838850', 'f6817f48af4fb3af11b9e8bf182f618b', '1260931366557696001', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624677838851', 'f6817f48af4fb3af11b9e8bf182f618b', '1260933542969458689', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624677838852', 'f6817f48af4fb3af11b9e8bf182f618b', '1a0811914300741f4e11838ff37a1d3a', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624677838853', 'f6817f48af4fb3af11b9e8bf182f618b', '1371830841603710977', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1371832624686227457', 'f6817f48af4fb3af11b9e8bf182f618b', '277bfabef7d76e89b33062b16a9a5020', NULL, '2021-03-16 22:36:00', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('154edd0599bd1dc2c7de220b489cd1e2', 'f6817f48af4fb3af11b9e8bf182f618b', '7ac9eb9ccbde2f7a033cd4944272bf1e', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('165acd6046a0eaf975099f46a3c898ea', 'f6817f48af4fb3af11b9e8bf182f618b', '4f66409ef3bbd69c1d80469d6e2a885e', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1664b92dff13e1575e3a929caa2fa14d', 'f6817f48af4fb3af11b9e8bf182f618b', 'd2bbf9ebca5a8fa2e227af97d2da7548', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1c1dbba68ef1817e7fb19c822d2854e8', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb367426764077dcf94640c843733985', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('1e47db875601fd97723254046b5bba90', 'f6817f48af4fb3af11b9e8bf182f618b', 'baf16b7174bd821b6bab23fa9abb200d', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('20e53c87a785688bdc0a5bb6de394ef1', 'f6817f48af4fb3af11b9e8bf182f618b', '540a2936940846cb98114ffb0d145cb8', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('25491ecbd5a9b34f09c8bc447a10ede1', 'f6817f48af4fb3af11b9e8bf182f618b', 'd07a2c87a451434c99ab06296727ec4f', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('2779cdea8367fff37db26a42c1a1f531', 'f6817f48af4fb3af11b9e8bf182f618b', 'fef097f3903caf3a3c3a6efa8de43fbb', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('29fb6b0ad59a7e911c8d27e0bdc42d23', 'f6817f48af4fb3af11b9e8bf182f618b', '9a90363f216a6a08f32eecb3f0bf12a3', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('2ad37346c1b83ddeebc008f6987b2227', 'f6817f48af4fb3af11b9e8bf182f618b', '8d1ebd663688965f1fd86a2f0ead3416', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('38a2e55db0960262800576e34b3af44c', 'f6817f48af4fb3af11b9e8bf182f618b', '5c2f42277948043026b7a14692456828', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('3b1886f727ac503c93fecdd06dcb9622', 'f6817f48af4fb3af11b9e8bf182f618b', 'c431130c0bc0ec71b0a5be37747bb36a', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('3de2a60c7e42a521fecf6fcc5cb54978', 'f6817f48af4fb3af11b9e8bf182f618b', '2d83d62bd2544b8994c8f38cf17b0ddf', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('3e4e38f748b8d87178dd62082e5b7b60', 'f6817f48af4fb3af11b9e8bf182f618b', '7960961b0063228937da5fa8dd73d371', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('3f1d04075e3c3254666a4138106a4e51', 'f6817f48af4fb3af11b9e8bf182f618b', '3fac0d3c9cd40fa53ab70d4c583821f8', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('4204f91fb61911ba8ce40afa7c02369f', 'f6817f48af4fb3af11b9e8bf182f618b', '3f915b2769fc80648e92d04e84ca059d', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('444126230885d5d38b8fa6072c9f43f8', 'f6817f48af4fb3af11b9e8bf182f618b', 'f780d0d3083d849ccbdb1b1baee4911d', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('445656dd187bd8a71605f4bbab1938a3', 'f6817f48af4fb3af11b9e8bf182f618b', '020b06793e4de2eee0007f603000c769', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('455cdb482457f529b79b479a2ff74427', 'f6817f48af4fb3af11b9e8bf182f618b', 'e1979bb53e9ea51cecc74d86fd9d2f64', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('45a358bb738782d1a0edbf7485e81459', 'f6817f48af4fb3af11b9e8bf182f618b', '0ac2ad938963b6c6d1af25477d5b8b51', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('4dab5a06acc8ef3297889872caa74747', 'f6817f48af4fb3af11b9e8bf182f618b', 'ffb423d25cc59dcd0532213c4a518261', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('4e0a37ed49524df5f08fc6593aee875c', 'f6817f48af4fb3af11b9e8bf182f618b', 'f23d9bfff4d9aa6b68569ba2cff38415', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('4ea403fc1d19feb871c8bdd9f94a4ecc', 'f6817f48af4fb3af11b9e8bf182f618b', '2e42e3835c2b44ec9f7bc26c146ee531', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('4f254549d9498f06f4cc9b23f3e2c070', 'f6817f48af4fb3af11b9e8bf182f618b', '93d5cfb4448f11e9916698e7f462b4b6', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('504e326de3f03562cdd186748b48a8c7', 'f6817f48af4fb3af11b9e8bf182f618b', '027aee69baee98a0ed2e01806e89c891', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('520b5989e6fe4a302a573d4fee12a40a', 'f6817f48af4fb3af11b9e8bf182f618b', '6531cf3421b1265aeeeabaab5e176e6d', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('54fdf85e52807bdb32ce450814abc256', 'f6817f48af4fb3af11b9e8bf182f618b', 'cc50656cf9ca528e6f2150eba4714ad2', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('5d230e6cd2935c4117f6cb9a7a749e39', 'f6817f48af4fb3af11b9e8bf182f618b', 'fc810a2267dd183e4ef7c71cc60f4670', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('5de6871fadb4fe1cdd28989da0126b07', 'f6817f48af4fb3af11b9e8bf182f618b', 'a400e4f4d54f79bf5ce160a3432231af', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('5e4015a9a641cbf3fb5d28d9f885d81a', 'f6817f48af4fb3af11b9e8bf182f618b', '2dbbafa22cda07fa5d169d741b81fe12', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('60eda4b4db138bdb47edbe8e10e71675', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb07ca05a3e13674dbf6d3245956da2e', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('61835e48f3e675f7d3f5c9dd3a10dcf3', 'f6817f48af4fb3af11b9e8bf182f618b', 'f0675b52d89100ee88472b6800754a08', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('660fbc40bcb1044738f7cabdf1708c28', 'f6817f48af4fb3af11b9e8bf182f618b', 'b3c824fc22bd953e2eb16ae6914ac8f9', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('66b202f8f84fe766176b3f51071836ef', 'f6817f48af4fb3af11b9e8bf182f618b', '1367a93f2c410b169faa7abcbad2f77c', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('6c74518eb6bb9a353f6a6c459c77e64b', 'f6817f48af4fb3af11b9e8bf182f618b', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('6daddafacd7eccb91309530c17c5855d', 'f6817f48af4fb3af11b9e8bf182f618b', 'edfa74d66e8ea63ea432c2910837b150', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('6fb4c2142498dd6d5b6c014ef985cb66', 'f6817f48af4fb3af11b9e8bf182f618b', '6e73eb3c26099c191bf03852ee1310a1', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('7413acf23b56c906aedb5a36fb75bd3a', 'f6817f48af4fb3af11b9e8bf182f618b', 'a4fc7b64b01a224da066bb16230f9c5a', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('76a54a8cc609754360bf9f57e7dbb2db', 'f6817f48af4fb3af11b9e8bf182f618b', 'c65321e57b7949b7a975313220de0422', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('7ca833caa5eac837b7200d8b6de8b2e3', 'f6817f48af4fb3af11b9e8bf182f618b', 'fedfbf4420536cacc0218557d263dfea', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('84eac2f113c23737128fb099d1d1da89', 'f6817f48af4fb3af11b9e8bf182f618b', '03dc3d93261dda19fc86dd7ca486c6cf', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('86060e2867a5049d8a80d9fe5d8bc28b', 'f6817f48af4fb3af11b9e8bf182f618b', '765dd244f37b804e3d00f475fd56149b', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('884f147c20e003cc80ed5b7efa598cbe', 'f6817f48af4fb3af11b9e8bf182f618b', 'e5973686ed495c379d829ea8b2881fc6', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('8b09925bdc194ab7f3559cd3a7ea0507', 'f6817f48af4fb3af11b9e8bf182f618b', 'ebb9d82ea16ad864071158e0c449d186', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('8d154c2382a8ae5c8d1b84bd38df2a93', 'f6817f48af4fb3af11b9e8bf182f618b', 'd86f58e7ab516d3bc6bfb1fe10585f97', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('8dd64f65a1014196078d0882f767cd85', 'f6817f48af4fb3af11b9e8bf182f618b', 'e3c13679c73a4f829bcff2aba8fd68b1', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('8e3dc1671abad4f3c83883b194d2e05a', 'f6817f48af4fb3af11b9e8bf182f618b', 'b1cb0a3fedf7ed0e4653cb5a229837ee', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('905bf419332ebcb83863603b3ebe30f0', 'f6817f48af4fb3af11b9e8bf182f618b', '8fb8172747a78756c11916216b8b8066', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('9380121ca9cfee4b372194630fce150e', 'f6817f48af4fb3af11b9e8bf182f618b', '65a8f489f25a345836b7f44b1181197a', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('94911fef73a590f6824105ebf9b6cab3', 'f6817f48af4fb3af11b9e8bf182f618b', '8b3bff2eee6f1939147f5c68292a1642', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('9700d20dbc1ae3cbf7de1c810b521fe6', 'f6817f48af4fb3af11b9e8bf182f618b', 'ec8d607d0156e198b11853760319c646', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('980171fda43adfe24840959b1d048d4d', 'f6817f48af4fb3af11b9e8bf182f618b', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('987c23b70873bd1d6dca52f30aafd8c2', 'f6817f48af4fb3af11b9e8bf182f618b', '00a2a0ae65cdca5e93209cdbde97cbe6', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('9b2ad767f9861e64a20b097538feafd3', 'f6817f48af4fb3af11b9e8bf182f618b', '73678f9daa45ed17a3674131b03432fb', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('9d980ec0489040e631a9c24a6af42934', 'f6817f48af4fb3af11b9e8bf182f618b', '05b3c82ddb2536a4a5ee1a4c46b5abef', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('a034ed7c38c996b880d3e78f586fe0ae', 'f6817f48af4fb3af11b9e8bf182f618b', 'c89018ea6286e852b424466fd92a2ffc', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('a307a9349ad64a2eff8ab69582fa9be4', 'f6817f48af4fb3af11b9e8bf182f618b', '0620e402857b8c5b605e1ad9f4b89350', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('a5d25fdb3c62904a8474182706ce11a0', 'f6817f48af4fb3af11b9e8bf182f618b', '418964ba087b90a84897b62474496b93', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('acacce4417e5d7f96a9c3be2ded5b4be', 'f6817f48af4fb3af11b9e8bf182f618b', 'f9d3f4f27653a71c52faa9fb8070fbe7', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('ae1852fb349d8513eb3fdc173da3ee56', 'f6817f48af4fb3af11b9e8bf182f618b', '8d4683aacaa997ab86b966b464360338', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('af60ac8fafd807ed6b6b354613b9ccbc', 'f6817f48af4fb3af11b9e8bf182f618b', '58857ff846e61794c69208e9d3a85466', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('b0c8a20800b8bf1ebdd7be473bceb44f', 'f6817f48af4fb3af11b9e8bf182f618b', '58b9204feaf07e47284ddb36cd2d8468', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('b128ebe78fa5abb54a3a82c6689bdca3', 'f6817f48af4fb3af11b9e8bf182f618b', 'aedbf679b5773c1f25e9f7b10111da73', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('b21b07951bb547b09cc85624a841aea0', 'f6817f48af4fb3af11b9e8bf182f618b', '4356a1a67b564f0988a484f5531fd4d9', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('b64c4ab9cd9a2ea8ac1e9db5fb7cf522', 'f6817f48af4fb3af11b9e8bf182f618b', '2aeddae571695cd6380f6d6d334d6e7d', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('bbec16ad016efec9ea2def38f4d3d9dc', 'f6817f48af4fb3af11b9e8bf182f618b', '13212d3416eb690c2e1d5033166ff47a', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('bea2986432079d89203da888d99b3f16', 'f6817f48af4fb3af11b9e8bf182f618b', '54dd5457a3190740005c1bfec55b1c34', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('c56fb1658ee5f7476380786bf5905399', 'f6817f48af4fb3af11b9e8bf182f618b', 'de13e0f6328c069748de7399fcc1dbbd', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('c6fee38d293b9d0596436a0cbd205070', 'f6817f48af4fb3af11b9e8bf182f618b', '4f84f9400e5e92c95f05b554724c2b58', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('c90b0b01c7ca454d2a1cb7408563e696', 'f6817f48af4fb3af11b9e8bf182f618b', '882a73768cfd7f78f3a37584f7299656', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('cf1feb1bf69eafc982295ad6c9c8d698', 'f6817f48af4fb3af11b9e8bf182f618b', 'a2b11669e98c5fe54a53c3e3c4f35d14', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('cf2ef620217673e4042f695743294f01', 'f6817f48af4fb3af11b9e8bf182f618b', '717f6bee46f44a3897eca9abd6e2ec44', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('cf43895aef7fc684669483ab00ef2257', 'f6817f48af4fb3af11b9e8bf182f618b', '700b7f95165c46cc7a78bf227aa8fed3', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('d281a95b8f293d0fa2a136f46c4e0b10', 'f6817f48af4fb3af11b9e8bf182f618b', '5c8042bd6c601270b2bbd9b20bccc68b', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('d37ad568e26f46ed0feca227aa9c2ffa', 'f6817f48af4fb3af11b9e8bf182f618b', '9502685863ab87f0ad1134142788a385', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('d3ddcacee1acdfaa0810618b74e38ef2', 'f6817f48af4fb3af11b9e8bf182f618b', 'c6cf95444d80435eb37b2f9db3971ae6', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('d83282192a69514cfe6161b3087ff962', 'f6817f48af4fb3af11b9e8bf182f618b', '53a9230444d33de28aa11cc108fb1dba', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('d8a5c9079df12090e108e21be94b4fd7', 'f6817f48af4fb3af11b9e8bf182f618b', '078f9558cdeab239aecb2bda1a8ed0d1', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('dc83bb13c0e8c930e79d28b2db26f01f', 'f6817f48af4fb3af11b9e8bf182f618b', '63b551e81c5956d5c861593d366d8c57', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('dc8fd3f79bd85bd832608b42167a1c71', 'f6817f48af4fb3af11b9e8bf182f618b', '91c23960fab49335831cf43d820b0a61', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('de82e89b8b60a3ea99be5348f565c240', 'f6817f48af4fb3af11b9e8bf182f618b', '56ca78fe0f22d815fabc793461af67b8', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('e7467726ee72235baaeb47df04a35e73', 'f6817f48af4fb3af11b9e8bf182f618b', 'e08cb190ef230d5d4f03824198773950', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('eaef4486f1c9b0408580bbfa2037eb66', 'f6817f48af4fb3af11b9e8bf182f618b', '2a470fc0c3954d9dbb61de6d80846549', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('ec4bc97829ab56afd83f428b6dc37ff6', 'f6817f48af4fb3af11b9e8bf182f618b', '200006f0edf145a2b50eacca07585451', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('ec846a3f85fdb6813e515be71f11b331', 'f6817f48af4fb3af11b9e8bf182f618b', '732d48f8e0abe99fe6a23d18a3171cd1', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('ec93bb06f5be4c1f19522ca78180e2ef', 'f6817f48af4fb3af11b9e8bf182f618b', '265de841c58907954b8877fb85212622', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('ecdd72fe694e6bba9c1d9fc925ee79de', 'f6817f48af4fb3af11b9e8bf182f618b', '45c966826eeff4c99b8f8ebfe74511fc', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('edefd8d468f5727db465cf1b860af474', 'f6817f48af4fb3af11b9e8bf182f618b', '6ad53fd1b220989a8b71ff482d683a5a', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('ef8bdd20d29447681ec91d3603e80c7b', 'f6817f48af4fb3af11b9e8bf182f618b', 'ae4fed059f67086fd52a73d913cf473d', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('f177acac0276329dc66af0c9ad30558a', 'f6817f48af4fb3af11b9e8bf182f618b', 'c2c356bf4ddd29975347a7047a062440', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('f99f99cc3bc27220cdd4f5aced33b7d7', 'f6817f48af4fb3af11b9e8bf182f618b', '655563cd64b75dcf52ef7bcdd4836953', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('fafe73c4448b977fe42880a6750c3ee8', 'f6817f48af4fb3af11b9e8bf182f618b', '9cb91b8851db0cf7b19d7ecc2a8193dd', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('fced905c7598973b970d42d833f73474', 'f6817f48af4fb3af11b9e8bf182f618b', '4875ebe289344e14844d8e3ea1edd73f', NULL, NULL, NULL); +INSERT INTO `sys_role_permission` VALUES ('fd97963dc5f144d3aecfc7045a883427', 'f6817f48af4fb3af11b9e8bf182f618b', '043780fa095ff1b2bec4dc406d76f023', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_sms +-- ---------------------------- +DROP TABLE IF EXISTS `sys_sms`; +CREATE TABLE `sys_sms` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID', + `es_title` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息标题', + `es_type` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送方式:1短信 2邮件 3微信', + `es_receiver` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人', + `es_param` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送所需参数Json格式', + `es_content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '推送内容', + `es_send_time` datetime(0) NULL DEFAULT NULL COMMENT '推送时间', + `es_send_status` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '推送状态 0未推送 1推送成功 2推送失败 -1失败不再发送', + `es_send_num` int(11) NULL DEFAULT NULL COMMENT '发送次数 超过5次不再发送', + `es_result` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '推送失败原因', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_type`(`es_type`) USING BTREE, + INDEX `index_receiver`(`es_receiver`) USING BTREE, + INDEX `index_sendtime`(`es_send_time`) USING BTREE, + INDEX `index_status`(`es_send_status`) USING BTREE, + INDEX `idx_ss_es_type`(`es_type`) USING BTREE, + INDEX `idx_ss_es_receiver`(`es_receiver`) USING BTREE, + INDEX `idx_ss_es_send_time`(`es_send_time`) USING BTREE, + INDEX `idx_ss_es_send_status`(`es_send_status`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '消息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS `sys_sms_template`; +CREATE TABLE `sys_sms_template` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `template_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模板标题', + `template_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板CODE', + `template_type` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板类型:1短信 2邮件 3微信', + `template_content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板内容', + `template_test_json` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模板测试json', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_templatecode`(`template_code`) USING BTREE, + UNIQUE INDEX `uk_sst_template_code`(`template_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '消息模板表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_sms_template +-- ---------------------------- +INSERT INTO `sys_sms_template` VALUES ('1199606397416775681', '系统消息通知-Demo', 'sys_ts_note', '4', '

    系统通知

\n
    \n
  • 通知时间:  ${ts_date}
  • \n
  • 通知内容:  ${ts_content}
  • \n
', NULL, '2019-11-27 16:30:27', 'admin', '2021-03-16 16:56:36', 'admin'); +INSERT INTO `sys_sms_template` VALUES ('1199648914107625473', '流程办理超时提醒-Demo', 'bpm_chaoshi_tip', '4', '

   流程办理超时提醒

\n
    \n
  •    超时提醒信息:    您有待处理的超时任务,请尽快处理!
  • \n
  •    超时任务标题:    ${title}
  • \n
  •    超时任务节点:    ${task}
  • \n
  •    任务处理人:       ${user}
  • \n
  •    任务开始时间:    ${time}
  • \n
', NULL, '2019-11-27 19:19:24', 'admin', '2021-03-16 16:56:20', 'admin'); +INSERT INTO `sys_sms_template` VALUES ('4028608164691b000164693108140003', '催办:${taskName}-Demo', 'SYS001', '3', '${userName},您好!\r\n请前待办任务办理事项!${taskName}\r\n\r\n\r\n===========================\r\n此消息由系统发出', '{\r\n\"taskName\":\"HR审批\",\r\n\"userName\":\"admin\"\r\n}', '2018-07-05 14:46:18', 'admin', '2021-03-16 16:57:00', 'admin'); + +-- ---------------------------- +-- Table structure for sys_third_account +-- ---------------------------- +DROP TABLE IF EXISTS `sys_third_account`; +CREATE TABLE `sys_third_account` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', + `sys_user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方登录id', + `third_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录来源', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态(1-正常,2-冻结)', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除状态(0-正常,1-已删除)', + `realname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名', + `third_user_uuid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方账号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '第三方登录账号表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录账号', + `realname` varchar(100) 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 '密码', + `salt` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'md5密码盐', + `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像', + `birthday` datetime(0) NULL DEFAULT NULL COMMENT '生日', + `sex` tinyint(1) NULL DEFAULT NULL COMMENT '性别(0-默认未知,1-男,2-女)', + `email` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电子邮件', + `phone` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话', + `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '机构编码', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '性别(1-正常,2-冻结)', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除状态(0-正常,1-已删除)', + `third_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '第三方登录的唯一标识', + `third_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '第三方类型', + `activiti_sync` tinyint(1) NULL DEFAULT NULL COMMENT '同步工作流引擎(1-同步,0-不同步)', + `work_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '工号,唯一键', + `telephone` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '座机号', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `user_identity` tinyint(1) NULL DEFAULT NULL COMMENT '身份(1普通成员 2上级)', + `depart_ids` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '负责部门', + `rel_tenant_ids` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识', + `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `index_user_name`(`username`) USING BTREE, + UNIQUE INDEX `uniq_sys_user_work_no`(`work_no`) USING BTREE, + UNIQUE INDEX `uniq_sys_user_username`(`username`) USING BTREE, + UNIQUE INDEX `uniq_sys_user_phone`(`phone`) USING BTREE, + UNIQUE INDEX `uniq_sys_user_email`(`email`) USING BTREE, + INDEX `index_user_status`(`status`) USING BTREE, + INDEX `index_user_del_flag`(`del_flag`) USING BTREE, + INDEX `idx_su_username`(`username`) USING BTREE, + INDEX `idx_su_status`(`status`) USING BTREE, + INDEX `idx_su_del_flag`(`del_flag`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES ('e9ca23d68d884d4ebb19d07889727dae', 'admin', '开发管理员', 'cb362cfeefbf3d8d', 'RCGTeGiH', NULL, '2018-12-05 00:00:00', 1, 'lixuetao@syxysoft.com', '18608732661', 'A01', 1, 0, NULL, NULL, 1, '00001', NULL, NULL, '2019-06-21 17:54:10', 'admin', '2021-03-16 18:00:16', 2, 'c6d7cb4deeac411cb3384b1b31278596', '', NULL); + +-- ---------------------------- +-- Table structure for sys_user_agent +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_agent`; +CREATE TABLE `sys_user_agent` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '序号', + `user_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名', + `agent_user_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '代理人用户名', + `start_time` datetime(0) NULL DEFAULT NULL COMMENT '代理开始时间', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '代理结束时间', + `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态0无效1有效', + `create_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人名称', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人名称', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + `sys_company_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属公司', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_username`(`user_name`) USING BTREE, + UNIQUE INDEX `uk_sug_user_name`(`user_name`) USING BTREE, + INDEX `statux_index`(`status`) USING BTREE, + INDEX `begintime_index`(`start_time`) USING BTREE, + INDEX `endtime_index`(`end_time`) USING BTREE, + INDEX `idx_sug_status`(`status`) USING BTREE, + INDEX `idx_sug_start_time`(`start_time`) USING BTREE, + INDEX `idx_sug_end_time`(`end_time`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户代理人设置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_user_depart +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_depart`; +CREATE TABLE `sys_user_depart` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id', + `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id', + `dep_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id', + PRIMARY KEY (`ID`) USING BTREE, + INDEX `index_depart_groupk_userid`(`user_id`) USING BTREE, + INDEX `index_depart_groupkorgid`(`dep_id`) USING BTREE, + INDEX `index_depart_groupk_uidanddid`(`user_id`, `dep_id`) USING BTREE, + INDEX `idx_sud_user_id`(`user_id`) USING BTREE, + INDEX `idx_sud_dep_id`(`dep_id`) USING BTREE, + INDEX `idx_sud_user_dep_id`(`user_id`, `dep_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户部门表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_depart +-- ---------------------------- +INSERT INTO `sys_user_depart` VALUES ('1371763232992583682', 'e9ca23d68d884d4ebb19d07889727dae', 'c6d7cb4deeac411cb3384b1b31278596'); + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id', + `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index2_groupuu_user_id`(`user_id`) USING BTREE, + INDEX `index2_groupuu_ole_id`(`role_id`) USING BTREE, + INDEX `index2_groupuu_useridandroleid`(`user_id`, `role_id`) USING BTREE, + INDEX `idx_sur_user_id`(`user_id`) USING BTREE, + INDEX `idx_sur_role_id`(`role_id`) USING BTREE, + INDEX `idx_sur_user_role_id`(`user_id`, `role_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES ('1371763232468295682', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b'); + +-- ---------------------------- +-- Table structure for sys_confusion +-- ---------------------------- +DROP TABLE IF EXISTS `sys_confusion`; +CREATE TABLE `sys_confusion` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门', + `table_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表名', + `field_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段名', + `confusion_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '混淆code', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '混淆表' ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/jeroboot-oracle11g.sql b/db/jeroboot-oracle11g.sql new file mode 100644 index 00000000..e70d5ed1 --- /dev/null +++ b/db/jeroboot-oracle11g.sql @@ -0,0 +1,4338 @@ +/* +Navicat Oracle Data Transfer +Oracle Client Version : 10.2.0.5.0 + +Source Server : jero-boot +Source Server Version : 110200 +Source Host : 121.36.69.172:1521 +Source Schema : JERO-BOOT + +Target Server Type : ORACLE +Target Server Version : 110200 +File Encoding : 65001 + +Date: 2021-03-19 14:36:25 +*/ + + +-- ---------------------------- +-- Table structure for DEMO +-- ---------------------------- +DROP TABLE "DEMO"; +CREATE TABLE "DEMO" ( +"ID" NVARCHAR2(50) NOT NULL , +"NAME" NVARCHAR2(30) NULL , +"KEY_WORD" NVARCHAR2(255) NULL , +"PUNCH_TIME" DATE NULL , +"SALARY_MONEY" NUMBER NULL , +"BONUS_MONEY" NUMBER(10,2) NULL , +"SEX" NVARCHAR2(2) NULL , +"AGE" NUMBER(11) NULL , +"BIRTHDAY" DATE NULL , +"EMAIL" NVARCHAR2(50) NULL , +"CONTENT" NVARCHAR2(1000) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"SYS_ORG_CODE" NVARCHAR2(64) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "DEMO"."ID" IS '主键ID'; +COMMENT ON COLUMN "DEMO"."NAME" IS '姓名'; +COMMENT ON COLUMN "DEMO"."KEY_WORD" IS '关键词'; +COMMENT ON COLUMN "DEMO"."PUNCH_TIME" IS '打卡时间'; +COMMENT ON COLUMN "DEMO"."SALARY_MONEY" IS '工资'; +COMMENT ON COLUMN "DEMO"."BONUS_MONEY" IS '奖金'; +COMMENT ON COLUMN "DEMO"."SEX" IS '性别 {男:1,女:2}'; +COMMENT ON COLUMN "DEMO"."AGE" IS '年龄'; +COMMENT ON COLUMN "DEMO"."BIRTHDAY" IS '生日'; +COMMENT ON COLUMN "DEMO"."EMAIL" IS '邮箱'; +COMMENT ON COLUMN "DEMO"."CONTENT" IS '个人简介'; +COMMENT ON COLUMN "DEMO"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "DEMO"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "DEMO"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "DEMO"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "DEMO"."SYS_ORG_CODE" IS '所属部门编码'; + +-- ---------------------------- +-- Records of DEMO +-- ---------------------------- +INSERT INTO "DEMO" VALUES ('1353563050407936002', '小红帽', null, TO_DATE('2021-01-26 12:39:04', 'YYYY-MM-DD HH24:MI:SS'), null, null, '2', '22', TO_DATE('2021-01-25 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'admin', TO_DATE('2021-01-25 12:39:14', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'A01'); +INSERT INTO "DEMO" VALUES ('1dc29e80be14d1400f165b5c6b30c707', 'zhang daihao', null, null, null, null, '2', null, null, 'zhangdaiscott@163.com', null, null, null, null, null, null); +INSERT INTO "DEMO" VALUES ('304e651dc769d5c9b6e08fb30457a602', '小白兔', null, null, null, null, '2', '28', null, null, null, 'scott', TO_DATE('2019-01-19 13:12:53', 'YYYY-MM-DD HH24:MI:SS'), 'qinfeng', TO_DATE('2019-01-19 13:13:12', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "DEMO" VALUES ('4', 'Sandy', '开源,很好', TO_DATE('2018-12-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, '2', '21', TO_DATE('2018-12-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'test4@baomidou.com', '聪明00', null, null, 'admin', TO_DATE('2019-02-25 16:29:27', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "DEMO" VALUES ('4981637bf71b0c1ed1365241dfcfa0ea', '小虎', null, null, null, null, '2', '28', null, null, null, 'scott5', TO_DATE('2019-01-19 13:12:53', 'YYYY-MM-DD HH24:MI:SS'), 'qinfeng', TO_DATE('2019-01-19 13:13:12', 'YYYY-MM-DD HH24:MI:SS'), 'A02'); +INSERT INTO "DEMO" VALUES ('7', 'zhangdaiscott', null, null, null, null, '1', null, TO_DATE('2019-01-03 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, null, null, null, 'A02A01A01'); +INSERT INTO "DEMO" VALUES ('73bc58611012617ca446d8999379e4ac', '郭靖', '777', TO_DATE('2018-12-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, '1', null, null, null, null, 'jero-boot', TO_DATE('2019-03-28 18:16:39', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-02 18:14:14', 'YYYY-MM-DD HH24:MI:SS'), 'A02A01A02'); +INSERT INTO "DEMO" VALUES ('917e240eaa0b1b2d198ae869b64a81c3', 'zhang daihao', null, null, null, null, '2', '0', TO_DATE('2018-11-29 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'zhangdaiscott@163.com', null, null, null, null, null, 'A02'); +INSERT INTO "DEMO" VALUES ('94420c5d8fc4420dde1e7196154b3a24', '秦风', null, null, null, null, '2', null, null, null, null, 'scott', TO_DATE('2019-01-19 12:54:58', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-02 18:14:33', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "DEMO" VALUES ('b86897900c770503771c7bb88e5d1e9b', 'scott1', '开源、很好、hello', null, null, null, '1', null, null, 'zhangdaiscott@163.com', null, 'scott', TO_DATE('2019-01-19 12:22:34', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "DEMO" VALUES ('c28fa8391ef81d6fabd8bd894a7615aa', '小麦', null, null, null, null, '2', null, null, 'zhangdaiscott@163.com', null, 'jero-boot', TO_DATE('2019-04-04 17:18:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "DEMO" VALUES ('c2c0d49e3c01913067cf8d1fb3c971d2', 'zhang daihao', null, null, null, null, '2', null, null, 'zhangdaiscott@163.com', null, 'admin', TO_DATE('2019-01-19 23:37:18', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-01-21 16:49:06', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "DEMO" VALUES ('c96279c666b4b82e3ef1e4e2978701ce', '报名时间', null, null, null, null, null, null, null, null, null, 'jero-boot', TO_DATE('2019-03-28 18:00:52', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "DEMO" VALUES ('d24668721446e8478eeeafe4db66dcff', 'zhang daihao999', null, null, null, null, '1', null, null, 'zhangdaiscott@163.com', null, null, null, null, null, null); +INSERT INTO "DEMO" VALUES ('eaa6c1116b41dc10a94eae34cf990133', 'zhang daihao', null, null, null, null, null, null, null, 'zhangdaiscott@163.com', null, null, null, null, null, null); + +-- ---------------------------- +-- Table structure for JERO_ORDER_CUSTOMER +-- ---------------------------- +DROP TABLE "JERO_ORDER_CUSTOMER"; +CREATE TABLE "JERO_ORDER_CUSTOMER" ( +"ID" NVARCHAR2(32) NOT NULL , +"NAME" NVARCHAR2(100) NOT NULL , +"SEX" NVARCHAR2(4) NULL , +"IDCARD" NVARCHAR2(18) NULL , +"IDCARD_PIC" NVARCHAR2(500) NULL , +"TELPHONE" NVARCHAR2(32) NULL , +"ORDER_ID" NVARCHAR2(32) NOT NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."ID" IS '主键'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."NAME" IS '客户名'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."SEX" IS '性别'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."IDCARD" IS '身份证号码'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."IDCARD_PIC" IS '身份证扫描件'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."TELPHONE" IS '电话1'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."ORDER_ID" IS '外键'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "JERO_ORDER_CUSTOMER"."UPDATE_TIME" IS '修改时间'; + +-- ---------------------------- +-- Records of JERO_ORDER_CUSTOMER +-- ---------------------------- +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('1256527640480821249', 'scott', '2', null, null, null, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', TO_DATE('2020-05-02 18:15:09', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('1256527640531152898', 'x秦风', '1', null, null, null, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', TO_DATE('2020-05-02 18:15:09', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('1256527874216800257', '小王1', '1', null, null, null, '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', TO_DATE('2020-05-02 18:17:37', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('15538561502720', '3333', '1', null, null, null, '0d4a2e67b538ee1bc881e5ed34f670f0', 'jero-boot', TO_DATE('2019-03-29 18:42:55', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('15538561512681', '3332333', '2', null, null, null, '0d4a2e67b538ee1bc881e5ed34f670f0', 'jero-boot', TO_DATE('2019-03-29 18:42:55', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-29 18:43:12', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('15538561550142', '4442', '2', null, null, null, '0d4a2e67b538ee1bc881e5ed34f670f0', 'jero-boot', TO_DATE('2019-03-29 18:42:55', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('15541168497342', '444', null, null, null, null, 'f71f7f8930b5b6b1703d9948d189982b', 'admin', TO_DATE('2019-04-01 19:08:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('15541168499553', '5555', null, null, null, null, 'f71f7f8930b5b6b1703d9948d189982b', 'admin', TO_DATE('2019-04-01 19:08:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('18dc5eb1068ccdfe90e358951ca1a3d6', 'dr2', null, null, null, null, '8ab1186410a65118c4d746eb085d3bed', 'admin', TO_DATE('2019-04-04 17:25:33', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('195d280490fe88ca1475512ddcaf2af9', '12', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('217a2bf83709775d2cd85bf598392327', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('22bc052ae53ed09913b946abba93fa89', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('23bafeae88126c3bf3322a29a04f0d5e', 'x秦风', null, null, null, null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('25c4a552c6843f36fad6303bfa99a382', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('2d32144e2bee63264f3f16215c258381', '33333', '2', null, null, null, 'd908bfee3377e946e59220c4a4eb414a', 'admin', TO_DATE('2019-04-01 16:27:03', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('2d43170d6327f941bd1a017999495e25', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('2e5f62a8b6e0a0ce19b52a6feae23d48', '3', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('34a1c5cf6cee360ed610ed0bed70e0f9', '导入秦风', null, null, null, null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('3c87400f8109b4cf43c5598f0d40e34d', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('40964bcbbecb38e5ac15e6d08cf3cd43', '233', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('41e3dee0b0b6e6530eccb7fbb22fd7a3', '4555', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('4808ae8344c7679a4a2f461db5dc3a70', '44', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('4b6cef12f195fad94d57279b2241770d', 'dr12', null, null, null, null, '8ab1186410a65118c4d746eb085d3bed', 'admin', TO_DATE('2019-04-04 17:25:33', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('524e695283f8e8c256cc24f39d6d8542', '小王', '2', '370285198604033222', null, '18611788674', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', TO_DATE('2019-02-25 16:29:41', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('57c2a8367db34016114cbc9fa368dba0', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('5df36a1608b8c7ac99ad9bc408fe54bf', '4', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('6c6fd2716c2dcd044ed03c2c95d261f8', '李四', '2', '370285198602058833', null, '18611788676', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', TO_DATE('2019-04-01 19:08:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('742d008214dee0afff2145555692973e', '秦风', '1', '370285198602058822', null, '18611788676', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('7469c3e5d371767ff90a739d297689b5', '导入秦风', '2', null, null, null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-08 17:35:02', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('7a96e2c7b24847d4a29940dbc0eda6e5', 'drscott', null, null, null, null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('7f5a40818e225ee18bda6da7932ac5f9', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('8011575abfd7c8085e71ff66df1124b9', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('8404f31d7196221a573c9bd6c8f15003', '小张', '1', '370285198602058211', null, '18611788676', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', TO_DATE('2019-02-25 16:29:41', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('859020e10a2f721f201cdbff78cf7b9f', 'scott', null, null, null, null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('8cc3c4d26e3060975df3a2adb781eeb4', 'dr33', null, null, null, null, 'b2feb454e43c46b2038768899061e464', 'jero-boot', TO_DATE('2019-04-04 17:23:09', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('8d1725c23a6a50685ff0dedfd437030d', '4', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('933cae3a79f60a93922d59aace5346ce', '小王', null, '370285198604033222', null, '18611788674', '6a719071a29927a14f19482f8693d69a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('9bdb5400b709ba4eaf3444de475880d7', 'dr22', null, null, null, null, '22c17790dcd04b296c4a2a089f71895f', 'jero-boot', TO_DATE('2019-04-04 17:23:09', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('9f87677f70e5f864679314389443a3eb', '33', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('a2c2b7101f75c02deb328ba777137897', '44', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('ab4d002dc552c326147e318c87d3bed4', '小红1', '1', '370285198604033222', null, '18611755848', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', TO_DATE('2020-05-02 18:17:37', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('ad116f722a438e5f23095a0b5fcc8e89', 'dr秦风', null, null, null, null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('b1ba147b75f5eaa48212586097fc3fd1', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('b43bf432c251f0e6b206e403b8ec29bc', 'lisi', null, null, null, null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('bcdd300a7d44c45a66bdaac14903c801', '33', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('beb983293e47e2dc1a9b3d649aa3eb34', 'ddd3', null, null, null, null, 'd908bfee3377e946e59220c4a4eb414a', 'admin', TO_DATE('2019-04-01 16:27:03', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('c219808196406f1b8c7f1062589de4b5', '44', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('c8ed061d4b27c0c7a64e100f2b1c8ab5', '张经理', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('cc5de4af7f06cd6d250965ebe92a0395', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('cf8817bd703bf7c7c77a2118edc26cc7', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('d72b26fae42e71270fce2097a88da58a', '导入scott', null, 'www', null, null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-08 17:35:05', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('dbdc60a6ac1a8c43f24afee384039b68', 'xiaowang', null, null, null, null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('dc5883b50466de94d900919ed96d97af', '33', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('deeb73e553ad8dc0a0b3cfd5a338de8e', '3333', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('e2570278bf189ac05df3673231326f47', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('e39cb23bb950b2bdedfc284686c6128a', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('e46fe9111a9100844af582a18a2aa402', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('ee7af0acb9beb9bf8d8b3819a8a7fdc3', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('f5d2605e844192d9e548f9bd240ac908', '小张', null, '370285198602058211', null, '18611788676', '6a719071a29927a14f19482f8693d69a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_CUSTOMER" VALUES ('f6db6547382126613a3e46e7cd58a5f2', '导入scott', null, null, null, null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); + +-- ---------------------------- +-- Table structure for JERO_ORDER_MAIN +-- ---------------------------- +DROP TABLE "JERO_ORDER_MAIN"; +CREATE TABLE "JERO_ORDER_MAIN" ( +"ID" NVARCHAR2(32) NOT NULL , +"ORDER_CODE" NVARCHAR2(50) NULL , +"CTYPE" NVARCHAR2(500) NULL , +"ORDER_DATE" DATE NULL , +"ORDER_MONEY" NUMBER(10,3) NULL , +"CONTENT" NVARCHAR2(500) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."ID" IS '主键'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."ORDER_CODE" IS '订单号'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."CTYPE" IS '订单类型'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."ORDER_DATE" IS '订单日期'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."ORDER_MONEY" IS '订单金额'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."CONTENT" IS '订单备注'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "JERO_ORDER_MAIN"."UPDATE_TIME" IS '修改时间'; + +-- ---------------------------- +-- Records of JERO_ORDER_MAIN +-- ---------------------------- +INSERT INTO "JERO_ORDER_MAIN" VALUES ('163e2efcbc6d7d54eb3f8a137da8a75a', 'B100', null, null, '3000', null, 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('3a867ebf2cebce9bae3f79676d8d86f3', '导入B100', '2222', null, '3000', null, 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-08 17:35:13', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('4cba137333127e8e31df7ad168cc3732', '青岛订单A0001', '2', TO_DATE('2019-04-03 10:56:07', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'admin', TO_DATE('2019-04-03 10:56:11', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('54e739bef5b67569c963c38da52581ec', 'NC911', '1', TO_DATE('2019-02-18 09:58:51', 'YYYY-MM-DD HH24:MI:SS'), '40', null, 'admin', TO_DATE('2019-02-18 09:58:47', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-18 09:58:59', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('6a719071a29927a14f19482f8693d69a', 'c100', null, null, '5000', null, 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('8ab1186410a65118c4d746eb085d3bed', '导入400', '1', TO_DATE('2019-02-18 09:58:51', 'YYYY-MM-DD HH24:MI:SS'), '40', null, 'admin', TO_DATE('2019-02-18 09:58:47', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-18 09:58:59', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('9a57c850e4f68cf94ef7d8585dbaf7e6', 'halou001', '1', TO_DATE('2019-04-04 17:30:32', 'YYYY-MM-DD HH24:MI:SS'), '500', null, 'admin', TO_DATE('2019-04-04 17:30:41', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-02 18:17:36', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('a2cce75872cc8fcc47f78de9ffd378c2', '导入B100', null, null, '3000', null, 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('b190737bd04cca8360e6f87c9ef9ec4e', 'B0018888', '1', null, null, null, 'admin', TO_DATE('2019-02-15 18:39:29', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-02 18:15:09', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('d908bfee3377e946e59220c4a4eb414a', 'SSSS001', null, null, '599', null, 'admin', TO_DATE('2019-04-01 15:43:03', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 16:26:52', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('e73434dad84ebdce2d4e0c2a2f06d8ea', '导入200', null, null, '3000', null, 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('eb13ab35d2946a2b0cfe3452bca1e73f', 'BJ9980', '1', null, '90', null, 'admin', TO_DATE('2019-02-16 17:36:42', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-16 17:46:16', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('f71f7f8930b5b6b1703d9948d189982b', 'BY911', null, TO_DATE('2019-04-06 19:08:39', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'admin', TO_DATE('2019-04-01 16:36:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 16:36:08', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_MAIN" VALUES ('f8889aaef6d1bccffd98d2889c0aafb5', 'A100', null, TO_DATE('2018-10-10 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '6000', null, 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); + +-- ---------------------------- +-- Table structure for JERO_ORDER_TICKET +-- ---------------------------- +DROP TABLE "JERO_ORDER_TICKET"; +CREATE TABLE "JERO_ORDER_TICKET" ( +"ID" NVARCHAR2(32) NOT NULL , +"TICKET_CODE" NVARCHAR2(100) NOT NULL , +"TICKECT_DATE" DATE NULL , +"ORDER_ID" NVARCHAR2(32) NOT NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."ID" IS '主键'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."TICKET_CODE" IS '航班号'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."TICKECT_DATE" IS '航班时间'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."ORDER_ID" IS '外键'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "JERO_ORDER_TICKET"."UPDATE_TIME" IS '修改时间'; + +-- ---------------------------- +-- Records of JERO_ORDER_TICKET +-- ---------------------------- +INSERT INTO "JERO_ORDER_TICKET" VALUES ('0f0e3a40a215958f807eea08a6e1ac0a', '88', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('0fa3bd0bbcf53650c0bb3c0cac6d8cb7', 'ffff', TO_DATE('2019-02-21 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', TO_DATE('2019-02-25 16:29:41', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('1256527640543735810', '222', TO_DATE('2019-02-23 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', TO_DATE('2020-05-02 18:15:09', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('1256527640560513025', '111', TO_DATE('2019-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', TO_DATE('2020-05-02 18:15:09', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('14221afb4f5f749c1deef26ac56fdac3', '33', TO_DATE('2019-03-09 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('15538561502730', '222', null, '0d4a2e67b538ee1bc881e5ed34f670f0', 'jero-boot', TO_DATE('2019-03-29 18:42:55', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('15538561526461', '2244', TO_DATE('2019-03-29 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '0d4a2e67b538ee1bc881e5ed34f670f0', 'jero-boot', TO_DATE('2019-03-29 18:42:55', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-29 18:43:26', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('15541168478913', 'hhhhh', null, 'f71f7f8930b5b6b1703d9948d189982b', 'admin', TO_DATE('2019-04-01 19:08:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('18905bc89ee3851805aab38ed3b505ec', '44', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('1f809cbd26f4e574697e1c10de575d72', 'A100', null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('21051adb51529bdaa8798b5a3dd7f7f7', 'C10029', TO_DATE('2019-02-20 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('269576e766b917f8b6509a2bb0c4d4bd', 'A100', null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('2d473ffc79e5b38a17919e15f8b7078e', '66', TO_DATE('2019-03-29 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('3655b66fca5fef9c6aac6d70182ffda2', 'AA123', TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'd908bfee3377e946e59220c4a4eb414a', 'admin', TO_DATE('2019-04-01 16:27:03', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('365d5919155473ade45840fd626c51a9', 'dddd', TO_DATE('2019-04-04 17:25:29', 'YYYY-MM-DD HH24:MI:SS'), '8ab1186410a65118c4d746eb085d3bed', 'admin', TO_DATE('2019-04-04 17:25:33', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('4889a782e78706ab4306a925cfb163a5', 'C34', TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'd908bfee3377e946e59220c4a4eb414a', 'admin', TO_DATE('2019-04-01 16:35:00', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 16:35:07', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('48d385796382cf87fa4bdf13b42d9a28', '导入A100', null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('541faed56efbeb4be9df581bd8264d3a', '88', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('57a27a7dfd6a48e7d981f300c181b355', '6', TO_DATE('2019-03-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('5ce4dc439c874266e42e6c0ff8dc8b5c', '导入A100', null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('645a06152998a576c051474157625c41', '88', TO_DATE('2019-04-04 17:25:31', 'YYYY-MM-DD HH24:MI:SS'), '8ab1186410a65118c4d746eb085d3bed', 'admin', TO_DATE('2019-04-04 17:25:33', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('6e3562f2571ea9e96b2d24497b5f5eec', '55', TO_DATE('2019-03-23 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('8fd2b389151568738b1cc4d8e27a6110', '导入A100', null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('93f1a84053e546f59137432ff5564cac', '55', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('969ddc5d2e198d50903686917f996470', 'A10029', TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'f71f7f8930b5b6b1703d9948d189982b', 'admin', TO_DATE('2019-04-01 19:08:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('96e7303a8d22a5c384e08d7bcf7ac2bf', 'A100', null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('9e8a3336f6c63f558f2b68ce2e1e666e', '深圳1001', TO_DATE('2020-05-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', TO_DATE('2020-05-02 18:17:37', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('a28db02c810c65660015095cb81ed434', 'A100', null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('b217bb0e4ec6a45b6cbf6db880060c0f', 'A100', null, '6a719071a29927a14f19482f8693d69a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('ba708df70bb2652ed1051a394cfa0bb3', '333', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('beabbfcb195d39bedeeafe8318794562', 'A1345', TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'd908bfee3377e946e59220c4a4eb414a', 'admin', TO_DATE('2019-04-01 16:27:04', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('bf450223cb505f89078a311ef7b6ed16', '777', TO_DATE('2019-03-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('c06165b6603e3e1335db187b3c841eef', '北京2001', TO_DATE('2020-05-23 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', TO_DATE('2020-05-02 18:17:37', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('c113136abc26ace3a6da4e41d7dc1c7e', '44', TO_DATE('2019-03-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('c1abdc2e30aeb25de13ad6ee3488ac24', '77', TO_DATE('2019-03-22 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('c23751a7deb44f553ce50a94948c042a', '33', TO_DATE('2019-03-09 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '8ab1186410a65118c4d746eb085d3bed', 'admin', TO_DATE('2019-04-04 17:25:33', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('c64547666b634b3d6a0feedcf05f25ce', 'C10019', TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'f71f7f8930b5b6b1703d9948d189982b', 'admin', TO_DATE('2019-04-01 19:08:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('c8b8d3217f37da78dddf711a1f7da485', 'A100', null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('cab691c1c1ff7a6dfd7248421917fd3c', 'A100', null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('cca10a9a850b456d9b72be87da7b0883', '77', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('d2fbba11f4814d9b1d3cb1a3f342234a', 'C10019', TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('dbdb07a16826808e4276e84b2aa4731a', '导入A100', null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jero-boot', TO_DATE('2019-03-29 18:43:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('e7075639c37513afc0bbc4bf7b5d98b9', '88', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('fa759dc104d0371f8aa28665b323dab6', '888', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "JERO_ORDER_TICKET" VALUES ('ff197da84a9a3af53878eddc91afbb2e', '33', null, '54e739bef5b67569c963c38da52581ec', 'admin', TO_DATE('2019-03-15 16:50:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); + +-- ---------------------------- +-- Table structure for JOA_DEMO +-- ---------------------------- +DROP TABLE "JOA_DEMO"; +CREATE TABLE "JOA_DEMO" ( +"ID" NVARCHAR2(32) NULL , +"NAME" NVARCHAR2(100) NULL , +"DAYS" NUMBER(11) NULL , +"BEGIN_DATE" DATE NULL , +"END_DATE" DATE NULL , +"REASON" NVARCHAR2(500) NULL , +"BPM_STATUS" NVARCHAR2(50) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "JOA_DEMO" IS '流程测试'; +COMMENT ON COLUMN "JOA_DEMO"."ID" IS 'ID'; +COMMENT ON COLUMN "JOA_DEMO"."NAME" IS '请假人'; +COMMENT ON COLUMN "JOA_DEMO"."DAYS" IS '请假天数'; +COMMENT ON COLUMN "JOA_DEMO"."BEGIN_DATE" IS '开始时间'; +COMMENT ON COLUMN "JOA_DEMO"."END_DATE" IS '请假结束时间'; +COMMENT ON COLUMN "JOA_DEMO"."REASON" IS '请假原因'; +COMMENT ON COLUMN "JOA_DEMO"."BPM_STATUS" IS '流程状态'; +COMMENT ON COLUMN "JOA_DEMO"."CREATE_BY" IS '创建人id'; +COMMENT ON COLUMN "JOA_DEMO"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "JOA_DEMO"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "JOA_DEMO"."UPDATE_BY" IS '修改人id'; + +-- ---------------------------- +-- Records of JOA_DEMO +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_AUTH_DATA +-- ---------------------------- +DROP TABLE "ONL_AUTH_DATA"; +CREATE TABLE "ONL_AUTH_DATA" ( +"ID" NVARCHAR2(32) NOT NULL , +"CGFORM_ID" NVARCHAR2(32) NULL , +"RULE_NAME" NVARCHAR2(50) NULL , +"RULE_COLUMN" NVARCHAR2(50) NULL , +"RULE_OPERATOR" NVARCHAR2(50) NULL , +"RULE_VALUE" NVARCHAR2(255) NULL , +"STATUS" NUMBER(11) NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_AUTH_DATA"."ID" IS '主键'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."CGFORM_ID" IS 'online表ID'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."RULE_NAME" IS '规则名'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."RULE_COLUMN" IS '规则列'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."RULE_OPERATOR" IS '规则条件 大于小于like'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."RULE_VALUE" IS '规则值'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."STATUS" IS '1有效 0无效'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "ONL_AUTH_DATA"."UPDATE_TIME" IS '更新日期'; + +-- ---------------------------- +-- Records of ONL_AUTH_DATA +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_AUTH_PAGE +-- ---------------------------- +DROP TABLE "ONL_AUTH_PAGE"; +CREATE TABLE "ONL_AUTH_PAGE" ( +"ID" NVARCHAR2(32) NOT NULL , +"CGFORM_ID" NVARCHAR2(32) NULL , +"CODE" NVARCHAR2(255) NULL , +"TYPE" NUMBER(11) NULL , +"CONTROL" NUMBER(11) NULL , +"PAGE" NUMBER(11) NULL , +"STATUS" NUMBER(11) NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."ID" IS ' 主键'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."CGFORM_ID" IS 'online表id'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."CODE" IS '字段名/按钮编码'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."TYPE" IS '1字段 2按钮'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."CONTROL" IS '3可编辑 5可见(仅支持两种状态值3,5)'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."PAGE" IS '3列表 5表单(仅支持两种状态值3,5)'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."STATUS" IS '1有效 0无效'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "ONL_AUTH_PAGE"."UPDATE_TIME" IS '更新日期'; + +-- ---------------------------- +-- Records of ONL_AUTH_PAGE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_AUTH_RELATION +-- ---------------------------- +DROP TABLE "ONL_AUTH_RELATION"; +CREATE TABLE "ONL_AUTH_RELATION" ( +"ID" NVARCHAR2(32) NOT NULL , +"ROLE_ID" NVARCHAR2(32) NULL , +"AUTH_ID" NVARCHAR2(32) NULL , +"TYPE" NUMBER(11) NULL , +"CGFORM_ID" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_AUTH_RELATION"."ROLE_ID" IS '角色id'; +COMMENT ON COLUMN "ONL_AUTH_RELATION"."AUTH_ID" IS '权限id'; +COMMENT ON COLUMN "ONL_AUTH_RELATION"."TYPE" IS '1字段 2按钮 3数据权限'; +COMMENT ON COLUMN "ONL_AUTH_RELATION"."CGFORM_ID" IS 'online表单ID'; + +-- ---------------------------- +-- Records of ONL_AUTH_RELATION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_CGFORM_BUTTON +-- ---------------------------- +DROP TABLE "ONL_CGFORM_BUTTON"; +CREATE TABLE "ONL_CGFORM_BUTTON" ( +"ID" NVARCHAR2(32) NOT NULL , +"BUTTON_CODE" NVARCHAR2(50) NULL , +"BUTTON_ICON" NVARCHAR2(20) NULL , +"BUTTON_NAME" NVARCHAR2(50) NULL , +"BUTTON_STATUS" NVARCHAR2(2) NULL , +"BUTTON_STYLE" NVARCHAR2(20) NULL , +"EXP" NVARCHAR2(255) NULL , +"CGFORM_HEAD_ID" NVARCHAR2(32) NULL , +"OPT_TYPE" NVARCHAR2(20) NULL , +"ORDER_NUM" NUMBER(11) NULL , +"OPT_POSITION" NVARCHAR2(3) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "ONL_CGFORM_BUTTON" IS 'Online表单自定义按钮'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."ID" IS '主键ID'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."BUTTON_CODE" IS '按钮编码'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."BUTTON_ICON" IS '按钮图标'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."BUTTON_NAME" IS '按钮名称'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."BUTTON_STATUS" IS '按钮状态'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."BUTTON_STYLE" IS '按钮样式'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."EXP" IS '表达式'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."CGFORM_HEAD_ID" IS '表单ID'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."OPT_TYPE" IS '按钮类型'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."ORDER_NUM" IS '排序'; +COMMENT ON COLUMN "ONL_CGFORM_BUTTON"."OPT_POSITION" IS '按钮位置1侧面 2底部'; + +-- ---------------------------- +-- Records of ONL_CGFORM_BUTTON +-- ---------------------------- +INSERT INTO "ONL_CGFORM_BUTTON" VALUES ('cc1d12de57a1a41d3986ed6d13e3ac11', '链接按钮测试', 'icon-edit', '自定义link', '1', 'link', null, '55103a50b7144fae83997e1cf421f36c', 'js', null, '2'); +INSERT INTO "ONL_CGFORM_BUTTON" VALUES ('ebcc48ef0bde4433a6faf940a5e170c1', 'button按钮测试', 'icon-edit', '自定义button', '1', 'button', null, '55103a50b7144fae83997e1cf421f36c', 'js', null, '2'); + +-- ---------------------------- +-- Table structure for ONL_CGFORM_ENHANCE_JAVA +-- ---------------------------- +DROP TABLE "ONL_CGFORM_ENHANCE_JAVA"; +CREATE TABLE "ONL_CGFORM_ENHANCE_JAVA" ( +"ID" NVARCHAR2(36) NOT NULL , +"BUTTON_CODE" NVARCHAR2(32) NULL , +"CG_JAVA_TYPE" NVARCHAR2(32) NOT NULL , +"CG_JAVA_VALUE" NVARCHAR2(200) NOT NULL , +"CGFORM_HEAD_ID" NVARCHAR2(32) NOT NULL , +"ACTIVE_STATUS" NVARCHAR2(2) NULL , +"EVENT" NVARCHAR2(10) NOT NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JAVA"."BUTTON_CODE" IS '按钮编码'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JAVA"."CG_JAVA_TYPE" IS '类型'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JAVA"."CG_JAVA_VALUE" IS '数值'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JAVA"."CGFORM_HEAD_ID" IS '表单ID'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JAVA"."ACTIVE_STATUS" IS '生效状态'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JAVA"."EVENT" IS '事件状态(end:结束,start:开始)'; + +-- ---------------------------- +-- Records of ONL_CGFORM_ENHANCE_JAVA +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_CGFORM_ENHANCE_JS +-- ---------------------------- +DROP TABLE "ONL_CGFORM_ENHANCE_JS"; +CREATE TABLE "ONL_CGFORM_ENHANCE_JS" ( +"ID" NVARCHAR2(32) NOT NULL , +"CG_JS" NCLOB NULL , +"CG_JS_TYPE" NVARCHAR2(20) NULL , +"CONTENT" NVARCHAR2(1000) NULL , +"CGFORM_HEAD_ID" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JS"."ID" IS '主键ID'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JS"."CG_JS" IS 'JS增强内容'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JS"."CG_JS_TYPE" IS '类型'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JS"."CONTENT" IS '备注'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_JS"."CGFORM_HEAD_ID" IS '表单ID'; + +-- ---------------------------- +-- Records of ONL_CGFORM_ENHANCE_JS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_CGFORM_ENHANCE_SQL +-- ---------------------------- +DROP TABLE "ONL_CGFORM_ENHANCE_SQL"; +CREATE TABLE "ONL_CGFORM_ENHANCE_SQL" ( +"ID" NVARCHAR2(32) NOT NULL , +"BUTTON_CODE" NVARCHAR2(50) NULL , +"CGB_SQL" NCLOB NULL , +"CGB_SQL_NAME" NVARCHAR2(50) NULL , +"CONTENT" NVARCHAR2(1000) NULL , +"CGFORM_HEAD_ID" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_SQL"."ID" IS '主键ID'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_SQL"."BUTTON_CODE" IS '按钮编码'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_SQL"."CGB_SQL" IS 'SQL内容'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_SQL"."CGB_SQL_NAME" IS 'Sql名称'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_SQL"."CONTENT" IS '备注'; +COMMENT ON COLUMN "ONL_CGFORM_ENHANCE_SQL"."CGFORM_HEAD_ID" IS '表单ID'; + +-- ---------------------------- +-- Records of ONL_CGFORM_ENHANCE_SQL +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_CGFORM_FIELD +-- ---------------------------- +DROP TABLE "ONL_CGFORM_FIELD"; +CREATE TABLE "ONL_CGFORM_FIELD" ( +"ID" NVARCHAR2(32) NOT NULL , +"CGFORM_HEAD_ID" NVARCHAR2(32) NOT NULL , +"DB_FIELD_NAME" NVARCHAR2(32) NOT NULL , +"DB_FIELD_TXT" NVARCHAR2(200) NULL , +"DB_FIELD_NAME_OLD" NVARCHAR2(32) NULL , +"DB_IS_KEY" NUMBER(4) NULL , +"DB_IS_NULL" NUMBER(4) NULL , +"DB_TYPE" NVARCHAR2(32) NOT NULL , +"DB_LENGTH" NUMBER(11) NOT NULL , +"DB_POINT_LENGTH" NUMBER(11) NULL , +"DB_DEFAULT_VAL" NVARCHAR2(20) NULL , +"DICT_FIELD" NVARCHAR2(100) NULL , +"DICT_TABLE" NVARCHAR2(255) NULL , +"DICT_TEXT" NVARCHAR2(100) NULL , +"FIELD_SHOW_TYPE" NVARCHAR2(10) NULL , +"FIELD_HREF" NVARCHAR2(200) NULL , +"FIELD_LENGTH" NUMBER(11) NULL , +"FIELD_VALID_TYPE" NVARCHAR2(300) NULL , +"FIELD_MUST_INPUT" NVARCHAR2(2) NULL , +"FIELD_EXTEND_JSON" NVARCHAR2(500) NULL , +"FIELD_DEFAULT_VALUE" NVARCHAR2(100) NULL , +"IS_QUERY" NUMBER(4) NULL , +"IS_SHOW_FORM" NUMBER(4) NULL , +"IS_SHOW_LIST" NUMBER(4) NULL , +"IS_READ_ONLY" NUMBER(4) NULL , +"QUERY_MODE" NVARCHAR2(10) NULL , +"MAIN_TABLE" NVARCHAR2(100) NULL , +"MAIN_FIELD" NVARCHAR2(100) NULL , +"ORDER_NUM" NUMBER(11) NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(255) NULL , +"CONVERTER" NVARCHAR2(255) NULL , +"QUERY_DEF_VAL" NVARCHAR2(50) NULL , +"QUERY_DICT_TEXT" NVARCHAR2(100) NULL , +"QUERY_DICT_FIELD" NVARCHAR2(100) NULL , +"QUERY_DICT_TABLE" NVARCHAR2(500) NULL , +"QUERY_SHOW_TYPE" NVARCHAR2(50) NULL , +"QUERY_CONFIG_FLAG" NVARCHAR2(3) NULL , +"QUERY_VALID_TYPE" NVARCHAR2(50) NULL , +"QUERY_MUST_INPUT" NVARCHAR2(3) NULL , +"SORT_FLAG" NVARCHAR2(3) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."ID" IS '主键ID'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."CGFORM_HEAD_ID" IS '表ID'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_FIELD_NAME" IS '字段名字'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_FIELD_TXT" IS '字段备注'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_FIELD_NAME_OLD" IS '原字段名'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_IS_KEY" IS '是否主键 0否 1是'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_IS_NULL" IS '是否允许为空0否 1是'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_TYPE" IS '数据库字段类型'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_LENGTH" IS '数据库字段长度'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_POINT_LENGTH" IS '小数点'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DB_DEFAULT_VAL" IS '表字段默认值'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DICT_FIELD" IS '字典code'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DICT_TABLE" IS '字典表'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."DICT_TEXT" IS '字典Text'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_SHOW_TYPE" IS '表单控件类型'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_HREF" IS '跳转URL'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_LENGTH" IS '表单控件长度'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_VALID_TYPE" IS '表单字段校验规则'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_MUST_INPUT" IS '字段是否必填'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_EXTEND_JSON" IS '扩展参数JSON'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."FIELD_DEFAULT_VALUE" IS '控件默认值,不同的表达式展示不同的结果。 +1. 纯字符串直接赋给默认值; +2. #{普通变量}; +3. {{ 动态JS表达式 }}; +4. ${填值规则编码}; +填值规则表达式只允许存在一个,且不能和其他规则混用。'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."IS_QUERY" IS '是否查询条件0否 1是'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."IS_SHOW_FORM" IS '表单是否显示0否 1是'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."IS_SHOW_LIST" IS '列表是否显示0否 1是'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."IS_READ_ONLY" IS '是否是只读(1是 0否)'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_MODE" IS '查询模式'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."MAIN_TABLE" IS '外键主表名'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."MAIN_FIELD" IS '外键主键字段'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."ORDER_NUM" IS '排序'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."CONVERTER" IS '自定义值转换器'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_DEF_VAL" IS '查询默认值'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_DICT_TEXT" IS '查询配置字典text'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_DICT_FIELD" IS '查询配置字典code'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_DICT_TABLE" IS '查询配置字典table'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_SHOW_TYPE" IS '查询显示控件'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_CONFIG_FLAG" IS '是否启用查询配置1是0否'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_VALID_TYPE" IS '查询字段校验类型'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."QUERY_MUST_INPUT" IS '查询字段是否必填1是0否'; +COMMENT ON COLUMN "ONL_CGFORM_FIELD"."SORT_FLAG" IS '是否支持排序1是0否'; + +-- ---------------------------- +-- Records of ONL_CGFORM_FIELD +-- ---------------------------- +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('90a822b8a63bbbc1e9575c9f4e21e021', 'd35109c3632c4952a19ecc094943dd71', 'descc', '描述', null, '0', '1', 'string', '500', '0', null, null, null, null, 'umeditor', null, '120', null, '0', null, null, '0', '1', '1', '0', 'single', null, null, '9', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('d4d8cae3cd9ea93e378fc14303eee105', 'd35109c3632c4952a19ecc094943dd71', 'create_by', '创建人登录名称', null, '0', '1', 'string', '50', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '0', '0', '0', '0', 'single', null, null, '2', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('e50b4398731e06572c247993a0dcc38d', 'd35109c3632c4952a19ecc094943dd71', 'name', '用户名', null, '0', '1', 'string', '200', '0', null, null, null, null, 'text', null, '120', '*', '0', null, null, '1', '1', '1', '0', 'single', null, null, '6', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '1'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('f6076d9c662a0adddb39a91cccb4c993', 'd35109c3632c4952a19ecc094943dd71', 'xiamuti', '下拉多选', null, '0', '1', 'string', '100', '0', null, 'sex', null, null, 'list_multi', null, '120', null, '0', null, null, '1', '1', '1', '0', 'single', null, null, '17', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2020-11-26 18:02:20', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, 'text', '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('cb7da49a981a1b0acc5f7e8a0130bdcd', 'd35109c3632c4952a19ecc094943dd71', 'user_code', '用户编码', null, '0', '1', 'String', '32', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '1', '1', '0', '0', 'single', null, null, '11', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-05-11 16:26:37', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('ba17414716b12b51c85f9d1f6f1e5787', 'd35109c3632c4952a19ecc094943dd71', 'chegnshi', '城市', null, '0', '1', 'string', '300', '0', null, null, null, null, 'pca', null, '120', null, '0', null, null, '1', '1', '1', '0', 'single', null, null, '14', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2020-11-26 16:54:45', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, 'text', '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('88de72456c03410c364c80095aaa96eb', 'd35109c3632c4952a19ecc094943dd71', 'pop', '弹窗', null, '0', '1', 'string', '32', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '0', '1', '1', '0', 'single', null, null, '15', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2020-11-26 18:02:20', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, 'text', '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('47fa05530f3537a1be8f9e7a9e98be82', 'd35109c3632c4952a19ecc094943dd71', 'sex', '性别', null, '0', '1', 'string', '32', '0', null, 'sex', null, null, 'list', null, '120', null, '0', null, null, '1', '1', '1', '0', 'single', null, null, '7', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '1'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('509a4f63f02e784bc04499a6a9be8528', 'd35109c3632c4952a19ecc094943dd71', 'update_by', '更新人登录名称', null, '0', '1', 'string', '50', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '0', '0', '0', '0', 'single', null, null, '4', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('be868eed386da3cfcf49ea9afcdadf11', 'd35109c3632c4952a19ecc094943dd71', 'create_time', '创建日期', null, '0', '1', 'Date', '20', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '0', '0', '0', '0', 'single', null, null, '3', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('5b17ba693745c258f6b66380ac851e5f', 'd35109c3632c4952a19ecc094943dd71', 'id', '主键', null, '1', '0', 'string', '36', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '0', '1', '1', '0', 'single', null, null, '1', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('3acd1b022fd8cb6b99534161fa3d6a24', 'd35109c3632c4952a19ecc094943dd71', 'ceck', 'checkbox', null, '0', '1', 'string', '32', '0', null, 'sex', null, null, 'checkbox', null, '120', null, '0', null, null, '1', '1', '1', '0', 'single', null, null, '16', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2020-11-26 18:02:20', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, 'text', '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('04e4185a503e6aaaa31c243829ff4ac7', 'd35109c3632c4952a19ecc094943dd71', 'birthday', '生日', null, '0', '1', 'Date', '32', '0', null, null, null, null, 'date', null, '120', null, '0', null, null, '1', '1', '1', '0', 'single', null, null, '10', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('191705159cea35e8cbacb326f172be94', 'd35109c3632c4952a19ecc094943dd71', 'search_sel', '搜索下拉', null, '0', '1', 'string', '100', '0', null, 'role_code', 'sys_role', 'role_name', 'sel_search', null, '120', null, '0', null, null, '1', '1', '1', '0', 'single', null, null, '18', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2020-11-26 18:02:20', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, 'text', '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('242cc59b23965a92161eca69ffdbf018', 'd35109c3632c4952a19ecc094943dd71', 'age', '年龄', null, '0', '1', 'int', '32', '0', null, null, null, null, 'text', 'http://www.baidu.com', '120', null, '0', null, null, '0', '1', '1', '0', 'single', null, null, '8', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('20ff34fb0466089cb633d73d5a6f08d6', 'd35109c3632c4952a19ecc094943dd71', 'update_time', '更新日期', null, '0', '1', 'Date', '20', '0', null, null, null, null, 'text', null, '120', null, '0', null, null, '0', '0', '0', '0', 'single', null, null, '5', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('3cd2061ea15ce9eeb4b7cf2e544ccb6b', 'd35109c3632c4952a19ecc094943dd71', 'file_kk', '附件', null, '0', '1', 'String', '500', '0', null, null, null, null, 'file', null, '120', null, '0', null, null, '0', '1', '1', '0', 'single', null, null, '13', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-06-10 20:06:57', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); +INSERT INTO "ONL_CGFORM_FIELD" VALUES ('6a30c2e6f01ddd24349da55a37025cc0', 'd35109c3632c4952a19ecc094943dd71', 'top_pic', '头像', null, '0', '1', 'String', '500', '0', null, null, null, null, 'image', null, '120', null, '0', null, null, '0', '1', '1', '0', 'single', null, null, '12', 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-06-10 20:06:56', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null, null, null, null, null, '0', null, null, '0'); + +-- ---------------------------- +-- Table structure for ONL_CGFORM_HEAD +-- ---------------------------- +DROP TABLE "ONL_CGFORM_HEAD"; +CREATE TABLE "ONL_CGFORM_HEAD" ( +"ID" NVARCHAR2(32) NOT NULL , +"TABLE_NAME" NVARCHAR2(50) NOT NULL , +"TABLE_TYPE" NUMBER(11) NOT NULL , +"TABLE_VERSION" NUMBER(11) NULL , +"TABLE_TXT" NVARCHAR2(200) NOT NULL , +"IS_CHECKBOX" NVARCHAR2(5) NOT NULL , +"IS_DB_SYNCH" NVARCHAR2(20) NOT NULL , +"IS_PAGE" NVARCHAR2(5) NOT NULL , +"IS_TREE" NVARCHAR2(5) NOT NULL , +"ID_SEQUENCE" NVARCHAR2(200) NULL , +"ID_TYPE" NVARCHAR2(100) NULL , +"QUERY_MODE" NVARCHAR2(10) NOT NULL , +"RELATION_TYPE" NUMBER(11) NULL , +"SUB_TABLE_STR" NVARCHAR2(1000) NULL , +"TAB_ORDER_NUM" NUMBER(11) NULL , +"TREE_PARENT_ID_FIELD" NVARCHAR2(50) NULL , +"TREE_ID_FIELD" NVARCHAR2(50) NULL , +"TREE_FIELDNAME" NVARCHAR2(50) NULL , +"FORM_CATEGORY" NVARCHAR2(50) NOT NULL , +"FORM_TEMPLATE" NVARCHAR2(50) NULL , +"FORM_TEMPLATE_MOBILE" NVARCHAR2(50) NULL , +"SCROLL" NUMBER(11) NULL , +"COPY_VERSION" NUMBER(11) NULL , +"COPY_TYPE" NUMBER(11) NULL , +"PHYSIC_ID" NVARCHAR2(32) NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"THEME_TEMPLATE" NVARCHAR2(50) NULL , +"IS_DES_FORM" NVARCHAR2(2) NULL , +"DES_FORM_CODE" NVARCHAR2(50) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."ID" IS '主键ID'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TABLE_NAME" IS '表名'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TABLE_TYPE" IS '表类型: 0单表、1主表、2附表'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TABLE_VERSION" IS '表版本'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TABLE_TXT" IS '表说明'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."IS_CHECKBOX" IS '是否带checkbox'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."IS_DB_SYNCH" IS '同步数据库状态'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."IS_PAGE" IS '是否分页'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."IS_TREE" IS '是否是树'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."ID_SEQUENCE" IS '主键生成序列'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."ID_TYPE" IS '主键类型'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."QUERY_MODE" IS '查询模式'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."RELATION_TYPE" IS '映射关系 0一对多 1一对一'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."SUB_TABLE_STR" IS '子表'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TAB_ORDER_NUM" IS '附表排序序号'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TREE_PARENT_ID_FIELD" IS '树形表单父id'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TREE_ID_FIELD" IS '树表主键字段'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."TREE_FIELDNAME" IS '树开表单列字段'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."FORM_CATEGORY" IS '表单分类'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."FORM_TEMPLATE" IS 'PC表单模板'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."FORM_TEMPLATE_MOBILE" IS '表单模板样式(移动端)'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."SCROLL" IS '是否有横向滚动条'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."COPY_VERSION" IS '复制版本号'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."COPY_TYPE" IS '复制表类型1为复制表 0为原始表'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."PHYSIC_ID" IS '原始表ID'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."THEME_TEMPLATE" IS '主题模板'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."IS_DES_FORM" IS '是否用设计器表单'; +COMMENT ON COLUMN "ONL_CGFORM_HEAD"."DES_FORM_CODE" IS '设计器表单编码'; + +-- ---------------------------- +-- Records of ONL_CGFORM_HEAD +-- ---------------------------- +INSERT INTO "ONL_CGFORM_HEAD" VALUES ('d35109c3632c4952a19ecc094943dd71', 'test_demo', '1', '31', '测试用户表', 'Y', 'Y', 'Y', 'N', null, 'UUID', 'group', null, null, null, null, null, null, 'demo', '1', null, '0', null, '0', null, 'admin', TO_DATE('2021-03-19 09:54:26', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-15 14:24:35', 'YYYY-MM-DD HH24:MI:SS'), 'normal', null, null); + +-- ---------------------------- +-- Table structure for ONL_CGFORM_INDEX +-- ---------------------------- +DROP TABLE "ONL_CGFORM_INDEX"; +CREATE TABLE "ONL_CGFORM_INDEX" ( +"ID" NVARCHAR2(36) NOT NULL , +"CGFORM_HEAD_ID" NVARCHAR2(32) NULL , +"INDEX_NAME" NVARCHAR2(100) NULL , +"INDEX_FIELD" NVARCHAR2(500) NULL , +"INDEX_TYPE" NVARCHAR2(32) NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL , +"IS_DB_SYNCH" NVARCHAR2(2) NULL , +"DEL_FLAG" NUMBER(11) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."ID" IS '主键'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."CGFORM_HEAD_ID" IS '主表id'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."INDEX_NAME" IS '索引名称'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."INDEX_FIELD" IS '索引栏位'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."INDEX_TYPE" IS '索引类型'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."IS_DB_SYNCH" IS '是否同步数据库 N未同步 Y已同步'; +COMMENT ON COLUMN "ONL_CGFORM_INDEX"."DEL_FLAG" IS '是否删除 0未删除 1删除'; + +-- ---------------------------- +-- Records of ONL_CGFORM_INDEX +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ONL_CGREPORT_HEAD +-- ---------------------------- +DROP TABLE "ONL_CGREPORT_HEAD"; +CREATE TABLE "ONL_CGREPORT_HEAD" ( +"ID" NVARCHAR2(36) NOT NULL , +"CODE" NVARCHAR2(100) NOT NULL , +"NAME" NVARCHAR2(100) NOT NULL , +"CGR_SQL" NVARCHAR2(1000) NOT NULL , +"RETURN_VAL_FIELD" NVARCHAR2(100) NULL , +"RETURN_TXT_FIELD" NVARCHAR2(100) NULL , +"RETURN_TYPE" NVARCHAR2(2) NULL , +"DB_SOURCE" NVARCHAR2(100) NULL , +"CONTENT" NVARCHAR2(1000) NULL , +"UPDATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."CODE" IS '报表编码'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."NAME" IS '报表名字'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."CGR_SQL" IS '报表SQL'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."RETURN_VAL_FIELD" IS '返回值字段'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."RETURN_TXT_FIELD" IS '返回文本字段'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."RETURN_TYPE" IS '返回类型,单选或多选'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."DB_SOURCE" IS '动态数据源'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."CONTENT" IS '描述'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."UPDATE_BY" IS '修改人id'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "ONL_CGREPORT_HEAD"."CREATE_BY" IS '创建人id'; + +-- ---------------------------- +-- Records of ONL_CGREPORT_HEAD +-- ---------------------------- +INSERT INTO "ONL_CGREPORT_HEAD" VALUES ('1256627801873821698', 'report002', '统计登录每日登录次数-Demo', 'select DATE_FORMAT(create_time, ''%Y-%m-%d'') as date,count(*) as num from sys_log group by DATE_FORMAT(create_time, ''%Y-%m-%d'')', null, null, '1', null, null, TO_DATE('2020-11-26 19:22:04', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-03 00:53:10', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); +INSERT INTO "ONL_CGREPORT_HEAD" VALUES ('1260179852088135681', 'tj_user_report', '统一有效系统用户-Demo', 'select * from sys_user', null, null, '1', null, null, TO_DATE('2020-11-26 19:50:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-12 20:07:44', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); +INSERT INTO "ONL_CGREPORT_HEAD" VALUES ('6c7f59741c814347905a938f06ee003c', 'report_user', '统计在线用户-Demo', 'select * from sys_user', null, null, '1', null, null, TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-25 11:20:45', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); +INSERT INTO "ONL_CGREPORT_HEAD" VALUES ('87b55a515d3441b6b98e48e5b35474a6', 'demo', 'Report-Demo', 'select * from demo', null, null, '1', null, null, TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-12 11:25:16', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); + +-- ---------------------------- +-- Table structure for ONL_CGREPORT_ITEM +-- ---------------------------- +DROP TABLE "ONL_CGREPORT_ITEM"; +CREATE TABLE "ONL_CGREPORT_ITEM" ( +"ID" NVARCHAR2(36) NOT NULL , +"CGRHEAD_ID" NVARCHAR2(36) NOT NULL , +"FIELD_NAME" NVARCHAR2(36) NOT NULL , +"FIELD_TXT" NVARCHAR2(300) NULL , +"FIELD_WIDTH" NUMBER(11) NULL , +"FIELD_TYPE" NVARCHAR2(10) NULL , +"SEARCH_MODE" NVARCHAR2(10) NULL , +"IS_ORDER" NUMBER(11) NULL , +"IS_SEARCH" NUMBER(11) NULL , +"DICT_CODE" NVARCHAR2(500) NULL , +"FIELD_HREF" NVARCHAR2(120) NULL , +"IS_SHOW" NUMBER(11) NULL , +"ORDER_NUM" NUMBER(11) NULL , +"REPLACE_VAL" NVARCHAR2(200) NULL , +"IS_TOTAL" NVARCHAR2(2) NULL , +"GROUP_TITLE" NVARCHAR2(50) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."CGRHEAD_ID" IS '报表ID'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."FIELD_NAME" IS '字段名字'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."FIELD_TXT" IS '字段文本'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."FIELD_TYPE" IS '字段类型'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."SEARCH_MODE" IS '查询模式'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."IS_ORDER" IS '是否排序 0否,1是'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."IS_SEARCH" IS '是否查询 0否,1是'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."DICT_CODE" IS '字典CODE'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."FIELD_HREF" IS '字段跳转URL'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."IS_SHOW" IS '是否显示 0否,1显示'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."ORDER_NUM" IS '排序'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."REPLACE_VAL" IS '取值表达式'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."IS_TOTAL" IS '是否合计 0否,1是(仅对数值有效)'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."GROUP_TITLE" IS '分组标题'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "ONL_CGREPORT_ITEM"."UPDATE_TIME" IS '修改时间'; + +-- ---------------------------- +-- Records of ONL_CGREPORT_ITEM +-- ---------------------------- +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1256627802020622337', '1256627801873821698', 'date', '日期', null, 'String', null, '0', '0', null, null, '1', '1', null, null, null, 'admin', TO_DATE('2020-09-11 14:50:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1256627802075148289', '1256627801873821698', 'num', '登录次数', null, 'String', null, '0', '0', null, null, '1', '2', null, '1', null, 'admin', TO_DATE('2020-09-11 14:50:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1260179881129496577', '1260179852088135681', 'id', 'ID', null, 'String', null, '0', '0', null, null, '0', '1', null, null, null, 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1260179881129496578', '1260179852088135681', 'username', '账号', null, 'String', null, '0', '0', null, null, '1', '2', null, null, '用户信息', 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1260179881129496579', '1260179852088135681', 'realname', '用户名字', null, 'String', null, '0', '0', null, null, '1', '3', null, null, '用户信息', 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1260179881129496584', '1260179852088135681', 'sex', '性别', null, 'String', null, '0', '1', 'sex', null, '1', '4', null, null, '用户信息', 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1260179881129496585', '1260179852088135681', 'email', '邮箱', null, 'String', 'single', '0', '1', null, null, '1', '5', null, null, null, 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1260179881129496586', '1260179852088135681', 'phone', '电话', null, 'String', null, '0', '0', null, null, '1', '6', null, null, null, 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('15884396588465896672', '87b55a515d3441b6b98e48e5b35474a6', 'id', 'ID', null, 'String', null, '0', '0', null, null, '0', '1', null, null, null, 'admin', TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('15892858611256977947', '1260179852088135681', 'birthday', '生日', null, 'Date', null, '0', '0', null, null, '1', '7', null, null, null, 'admin', TO_DATE('2020-09-11 14:07:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1740bb02519db90c44cb2cba8b755136', '6c7f59741c814347905a938f06ee003c', 'realname', '用户名称', null, 'String', null, '0', '0', null, 'https://www.baidu.com', '1', '1', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('1b181e6d2813bcb263adc39737f9df46', '87b55a515d3441b6b98e48e5b35474a6', 'name', '用户名', null, 'String', 'single', '0', '1', null, null, '1', '2', null, null, null, 'admin', TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('61ef5b323134938fdd07ad5e3ea16cd3', '87b55a515d3441b6b98e48e5b35474a6', 'key_word', '关键词', null, 'String', 'single', '0', '1', null, null, '1', '3', null, null, null, 'admin', TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('627768efd9ba2c41e905579048f21000', '6c7f59741c814347905a938f06ee003c', 'username', '用户账号', null, 'String', 'single', '0', '1', null, null, '1', '2', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('8bb087a9aa2000bcae17a1b3f5768435', '6c7f59741c814347905a938f06ee003c', 'sex', '性别', null, 'String', 'single', '0', '1', 'sex', null, '1', '3', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('90d4fa57d301801abb26a9b86b6b94c4', '6c7f59741c814347905a938f06ee003c', 'birthday', '生日', null, 'Date', 'single', '0', '0', null, null, '1', '4', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('a4ac355f07a05218854e5f23e2930163', '6c7f59741c814347905a938f06ee003c', 'avatar', '头像', null, 'String', null, '0', '0', null, null, '0', '5', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('d6e86b5ffd096ddcc445c0f320a45004', '6c7f59741c814347905a938f06ee003c', 'phone', '手机号', null, 'String', null, '0', '0', null, null, '1', '6', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('df365cd357699eea96c29763d1dd7f9d', '6c7f59741c814347905a938f06ee003c', 'email', '邮箱', null, 'String', null, '0', '0', null, null, '1', '7', null, null, null, 'admin', TO_DATE('2020-05-03 02:35:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('edf9932912b81ad01dd557d3d593a559', '87b55a515d3441b6b98e48e5b35474a6', 'age', '年龄', null, 'String', null, '0', '0', null, null, '1', '4', null, null, null, 'admin', TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('f985883e509a6faaaf62ca07fd24a73c', '87b55a515d3441b6b98e48e5b35474a6', 'birthday', '生日', null, 'Date', 'single', '0', '1', null, null, '1', '5', null, null, null, 'admin', TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "ONL_CGREPORT_ITEM" VALUES ('fce83e4258de3e2f114ab3116397670c', '87b55a515d3441b6b98e48e5b35474a6', 'punch_time', '发布时间', null, 'String', null, '0', '0', null, null, '1', '6', null, null, null, 'admin', TO_DATE('2020-05-03 01:14:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); + +-- ---------------------------- +-- Table structure for ONL_CGREPORT_PARAM +-- ---------------------------- +DROP TABLE "ONL_CGREPORT_PARAM"; +CREATE TABLE "ONL_CGREPORT_PARAM" ( +"ID" NVARCHAR2(36) NOT NULL , +"CGRHEAD_ID" NVARCHAR2(36) NOT NULL , +"PARAM_NAME" NVARCHAR2(32) NOT NULL , +"PARAM_TXT" NVARCHAR2(32) NULL , +"PARAM_VALUE" NVARCHAR2(32) NULL , +"ORDER_NUM" NUMBER(11) NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."CGRHEAD_ID" IS '动态报表ID'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."PARAM_NAME" IS '参数字段'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."PARAM_TXT" IS '参数文本'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."PARAM_VALUE" IS '参数默认值'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."ORDER_NUM" IS '排序'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "ONL_CGREPORT_PARAM"."UPDATE_TIME" IS '更新日期'; + +-- ---------------------------- +-- Records of ONL_CGREPORT_PARAM +-- ---------------------------- + +-- ---------------------------- +-- Table structure for OSS_FILE +-- ---------------------------- +DROP TABLE "OSS_FILE"; +CREATE TABLE "OSS_FILE" ( +"ID" NVARCHAR2(32) NOT NULL , +"FILE_NAME" NVARCHAR2(255) NULL , +"URL" NVARCHAR2(255) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "OSS_FILE" IS 'Oss File'; +COMMENT ON COLUMN "OSS_FILE"."ID" IS '主键id'; +COMMENT ON COLUMN "OSS_FILE"."FILE_NAME" IS '文件名称'; +COMMENT ON COLUMN "OSS_FILE"."URL" IS '文件地址'; +COMMENT ON COLUMN "OSS_FILE"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "OSS_FILE"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "OSS_FILE"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "OSS_FILE"."UPDATE_TIME" IS '更新日期'; + +-- ---------------------------- +-- Records of OSS_FILE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_BLOB_TRIGGERS"; +CREATE TABLE "QRTZ_BLOB_TRIGGERS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"BLOB_DATA" BLOB NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +DROP TABLE "QRTZ_CALENDARS"; +CREATE TABLE "QRTZ_CALENDARS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"CALENDAR_NAME" VARCHAR2(200 BYTE) NOT NULL , +"CALENDAR" BLOB NOT NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_CRON_TRIGGERS"; +CREATE TABLE "QRTZ_CRON_TRIGGERS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"CRON_EXPRESSION" VARCHAR2(120 BYTE) NOT NULL , +"TIME_ZONE_ID" VARCHAR2(80 BYTE) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +INSERT INTO "QRTZ_CRON_TRIGGERS" VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', '0/1 * * * * ?', 'Asia/Shanghai'); +INSERT INTO "QRTZ_CRON_TRIGGERS" VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', '0/1 * * * * ?', 'Asia/Shanghai'); + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_FIRED_TRIGGERS"; +CREATE TABLE "QRTZ_FIRED_TRIGGERS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"ENTRY_ID" VARCHAR2(95 BYTE) NOT NULL , +"TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"INSTANCE_NAME" VARCHAR2(200 BYTE) NOT NULL , +"FIRED_TIME" NUMBER(13) NOT NULL , +"SCHED_TIME" NUMBER(13) NOT NULL , +"PRIORITY" NUMBER(13) NOT NULL , +"STATE" VARCHAR2(16 BYTE) NOT NULL , +"JOB_NAME" VARCHAR2(200 BYTE) NULL , +"JOB_GROUP" VARCHAR2(200 BYTE) NULL , +"IS_NONCONCURRENT" VARCHAR2(1 BYTE) NULL , +"REQUESTS_RECOVERY" VARCHAR2(1 BYTE) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +DROP TABLE "QRTZ_JOB_DETAILS"; +CREATE TABLE "QRTZ_JOB_DETAILS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"JOB_NAME" VARCHAR2(200 BYTE) NOT NULL , +"JOB_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"DESCRIPTION" VARCHAR2(250 BYTE) NULL , +"JOB_CLASS_NAME" VARCHAR2(250 BYTE) NOT NULL , +"IS_DURABLE" VARCHAR2(1 BYTE) NOT NULL , +"IS_NONCONCURRENT" VARCHAR2(1 BYTE) NOT NULL , +"IS_UPDATE_DATA" VARCHAR2(1 BYTE) NOT NULL , +"REQUESTS_RECOVERY" VARCHAR2(1 BYTE) NOT NULL , +"JOB_DATA" BLOB NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +INSERT INTO "QRTZ_JOB_DETAILS" VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', null, 'com.jero.modules.quartz.job.SampleJob', '0', '0', '0', '0', HexToRaw('30784143454430303035373337323030313536463732363732453731373536313732373437413245344136463632343436313734363134443631373039464230383345384246413942304342303230303030373837323030323636463732363732453731373536313732373437413245373537343639364337333245353337343732363936453637344236353739343436393732373437393436364336313637344436313730383230384538433346424335354432383032303030313541303031333631364336433646373737333534373236313645373336393635364537343434363137343631373837323030314436463732363732453731373536313732373437413245373537343639364337333245343436393732373437393436364336313637344436313730313345363245414432383736304143453032303030323541303030353634363937323734373934433030303336443631373037343030304634433641363137363631324637353734363936433246344436313730334237383730303137333732303031313641363137363631324537353734363936433245343836313733363834443631373030353037444143314333313636304431303330303032343630303041364336463631363434363631363337343646373234393030303937343638373236353733363836463643363437383730334634303030303030303030303030433737303830303030303031303030303030303031373430303039373036313732363136443635373436353732373037383030')); +INSERT INTO "QRTZ_JOB_DETAILS" VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', null, 'com.jero.modules.quartz.job.SampleParamJob', '0', '0', '0', '0', HexToRaw('307841434544303030353733373230303135364637323637324537313735363137323734374132453441364636323434363137343631344436313730394642303833453842464139423043423032303030303738373230303236364637323637324537313735363137323734374132453735373436393643373332453533373437323639364536373442363537393434363937323734373934363643363136373444363137303832303845384333464243353544323830323030303135413030313336313643364336463737373335343732363136453733363936353645373434343631373436313738373230303144364637323637324537313735363137323734374132453735373436393643373332453434363937323734373934363643363136373444363137303133453632454144323837363041434530323030303235413030303536343639373237343739344330303033364436313730373430303046344336413631373636313246373537343639364332463444363137303342373837303031373337323030313136413631373636313245373537343639364332453438363137333638344436313730303530374441433143333136363044313033303030323436303030413643364636313634343636313633373436463732343930303039373436383732363537333638364636433634373837303346343030303030303030303030304337373038303030303030313030303030303030313734303030393730363137323631364436353734363537323734303030353733363336463734373437383030')); + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +DROP TABLE "QRTZ_LOCKS"; +CREATE TABLE "QRTZ_LOCKS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"LOCK_NAME" VARCHAR2(40 BYTE) NOT NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +INSERT INTO "QRTZ_LOCKS" VALUES ('MyScheduler', 'STATE_ACCESS'); +INSERT INTO "QRTZ_LOCKS" VALUES ('MyScheduler', 'TRIGGER_ACCESS'); +INSERT INTO "QRTZ_LOCKS" VALUES ('quartzScheduler', 'TRIGGER_ACCESS'); + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +DROP TABLE "QRTZ_PAUSED_TRIGGER_GRPS"; +CREATE TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +DROP TABLE "QRTZ_SCHEDULER_STATE"; +CREATE TABLE "QRTZ_SCHEDULER_STATE" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"INSTANCE_NAME" VARCHAR2(200 BYTE) NOT NULL , +"LAST_CHECKIN_TIME" NUMBER(13) NOT NULL , +"CHECKIN_INTERVAL" NUMBER(13) NOT NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +INSERT INTO "QRTZ_SCHEDULER_STATE" VALUES ('MyScheduler', 'mmmmmm1616114494533', '1616135809090', '10000'); + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_SIMPLE_TRIGGERS"; +CREATE TABLE "QRTZ_SIMPLE_TRIGGERS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"REPEAT_COUNT" NUMBER(7) NOT NULL , +"REPEAT_INTERVAL" NUMBER(12) NOT NULL , +"TIMES_TRIGGERED" NUMBER(10) NOT NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_SIMPROP_TRIGGERS"; +CREATE TABLE "QRTZ_SIMPROP_TRIGGERS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"STR_PROP_1" VARCHAR2(512 BYTE) NULL , +"STR_PROP_2" VARCHAR2(512 BYTE) NULL , +"STR_PROP_3" VARCHAR2(512 BYTE) NULL , +"INT_PROP_1" NUMBER(10) NULL , +"INT_PROP_2" NUMBER(10) NULL , +"LONG_PROP_1" NUMBER(13) NULL , +"LONG_PROP_2" NUMBER(13) NULL , +"DEC_PROP_1" NUMBER(13,4) NULL , +"DEC_PROP_2" NUMBER(13,4) NULL , +"BOOL_PROP_1" VARCHAR2(1 BYTE) NULL , +"BOOL_PROP_2" VARCHAR2(1 BYTE) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_TRIGGERS"; +CREATE TABLE "QRTZ_TRIGGERS" ( +"SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL , +"TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL , +"TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"JOB_NAME" VARCHAR2(200 BYTE) NOT NULL , +"JOB_GROUP" VARCHAR2(200 BYTE) NOT NULL , +"DESCRIPTION" VARCHAR2(250 BYTE) NULL , +"NEXT_FIRE_TIME" NUMBER(13) NULL , +"PREV_FIRE_TIME" NUMBER(13) NULL , +"PRIORITY" NUMBER(13) NULL , +"TRIGGER_STATE" VARCHAR2(16 BYTE) NOT NULL , +"TRIGGER_TYPE" VARCHAR2(8 BYTE) NOT NULL , +"START_TIME" NUMBER(13) NOT NULL , +"END_TIME" NUMBER(13) NULL , +"CALENDAR_NAME" VARCHAR2(200 BYTE) NULL , +"MISFIRE_INSTR" NUMBER(2) NULL , +"JOB_DATA" BLOB NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +INSERT INTO "QRTZ_TRIGGERS" VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', 'com.jero.modules.quartz.job.SampleJob', 'DEFAULT', null, '1588405730000', '1588405729000', '5', 'PAUSED', 'CRON', '1588405237000', '0', null, '0', null); +INSERT INTO "QRTZ_TRIGGERS" VALUES ('MyScheduler', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', 'com.jero.modules.quartz.job.SampleParamJob', 'DEFAULT', null, '1588405236000', '1588405235000', '5', 'PAUSED', 'CRON', '1588405221000', '0', null, '0', null); + +-- ---------------------------- +-- Table structure for SYS_ANNOUNCEMENT +-- ---------------------------- +DROP TABLE "SYS_ANNOUNCEMENT"; +CREATE TABLE "SYS_ANNOUNCEMENT" ( +"ID" NVARCHAR2(32) NOT NULL , +"TITILE" NVARCHAR2(100) NULL , +"MSG_CONTENT" NCLOB NULL , +"START_TIME" DATE NULL , +"END_TIME" DATE NULL , +"SENDER" NVARCHAR2(100) NULL , +"PRIORITY" NVARCHAR2(255) NULL , +"MSG_CATEGORY" NVARCHAR2(10) NOT NULL , +"MSG_TYPE" NVARCHAR2(10) NULL , +"SEND_STATUS" NVARCHAR2(10) NULL , +"SEND_TIME" DATE NULL , +"CANCEL_TIME" DATE NULL , +"DEL_FLAG" NVARCHAR2(1) NULL , +"BUS_TYPE" NVARCHAR2(20) NULL , +"BUS_ID" NVARCHAR2(50) NULL , +"OPEN_TYPE" NVARCHAR2(20) NULL , +"OPEN_PAGE" NVARCHAR2(255) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"USER_IDS" NCLOB NULL , +"MSG_ABSTRACT" NCLOB NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_ANNOUNCEMENT" IS '系统通告表'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."TITILE" IS '标题'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."MSG_CONTENT" IS '内容'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."START_TIME" IS '开始时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."END_TIME" IS '结束时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."SENDER" IS '发布人'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."PRIORITY" IS '优先级(L低,M中,H高)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."MSG_CATEGORY" IS '消息类型1:通知公告2:系统消息'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."MSG_TYPE" IS '通告对象类型(USER:指定用户,ALL:全体用户)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."SEND_STATUS" IS '发布状态(0未发布,1已发布,2已撤销)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."SEND_TIME" IS '发布时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."CANCEL_TIME" IS '撤销时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."DEL_FLAG" IS '删除状态(0,正常,1已删除)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."BUS_TYPE" IS '业务类型(email:邮件 bpm:流程)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."BUS_ID" IS '业务id'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."OPEN_TYPE" IS '打开方式(组件:component 路由:url)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."OPEN_PAGE" IS '组件/路由 地址'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."USER_IDS" IS '指定用户'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT"."MSG_ABSTRACT" IS '摘要'; + +-- ---------------------------- +-- Records of SYS_ANNOUNCEMENT +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_ANNOUNCEMENT_SEND +-- ---------------------------- +DROP TABLE "SYS_ANNOUNCEMENT_SEND"; +CREATE TABLE "SYS_ANNOUNCEMENT_SEND" ( +"ID" NVARCHAR2(32) NULL , +"ANNT_ID" NVARCHAR2(32) NULL , +"USER_ID" NVARCHAR2(32) NULL , +"READ_FLAG" NVARCHAR2(10) NULL , +"READ_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_ANNOUNCEMENT_SEND" IS '用户通告阅读标记表'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."ANNT_ID" IS '通告ID'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."USER_ID" IS '用户id'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."READ_FLAG" IS '阅读状态(0未读,1已读)'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."READ_TIME" IS '阅读时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_ANNOUNCEMENT_SEND"."UPDATE_TIME" IS '更新时间'; + +-- ---------------------------- +-- Records of SYS_ANNOUNCEMENT_SEND +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_CATEGORY +-- ---------------------------- +DROP TABLE "SYS_CATEGORY"; +CREATE TABLE "SYS_CATEGORY" ( +"ID" NVARCHAR2(36) NOT NULL , +"PID" NVARCHAR2(36) NULL , +"NAME" NVARCHAR2(100) NULL , +"CODE" NVARCHAR2(100) NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL , +"SYS_ORG_CODE" NVARCHAR2(64) NULL , +"HAS_CHILD" NVARCHAR2(3) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_CATEGORY"."PID" IS '父级节点'; +COMMENT ON COLUMN "SYS_CATEGORY"."NAME" IS '类型名称'; +COMMENT ON COLUMN "SYS_CATEGORY"."CODE" IS '类型编码'; +COMMENT ON COLUMN "SYS_CATEGORY"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_CATEGORY"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_CATEGORY"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_CATEGORY"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "SYS_CATEGORY"."SYS_ORG_CODE" IS '所属部门'; +COMMENT ON COLUMN "SYS_CATEGORY"."HAS_CHILD" IS '是否有子节点'; + +-- ---------------------------- +-- Records of SYS_CATEGORY +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_CHECK_RULE +-- ---------------------------- +DROP TABLE "SYS_CHECK_RULE"; +CREATE TABLE "SYS_CHECK_RULE" ( +"ID" NVARCHAR2(32) NOT NULL , +"RULE_NAME" NVARCHAR2(100) NULL , +"RULE_CODE" NVARCHAR2(100) NULL , +"RULE_JSON" NCLOB NULL , +"RULE_DESCRIPTION" NVARCHAR2(200) NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_CHECK_RULE"."ID" IS '主键id'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."RULE_NAME" IS '规则名称'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."RULE_CODE" IS '规则Code'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."RULE_JSON" IS '规则JSON'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."RULE_DESCRIPTION" IS '规则描述'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_CHECK_RULE"."CREATE_TIME" IS '创建时间'; + +-- ---------------------------- +-- Records of SYS_CHECK_RULE +-- ---------------------------- +INSERT INTO "SYS_CHECK_RULE" VALUES ('1224980593992388610', '通用编码规则-Demo', 'common', '[{"digits":"1","pattern":"^[a-z|A-Z]$","message":"第一位只能是字母"},{"digits":"*","pattern":"^[0-9|a-z|A-Z|_]{0,}$","message":"只能填写数字、大小写字母、下划线"},{"digits":"*","pattern":"^.{3,}$","message":"最少输入3位数"},{"digits":"*","pattern":"^.{3,12}$","message":"最多输入12位数"}]', '规则:1、首位只能是字母;2、只能填写数字、大小写字母、下划线;3、最少3位数,最多12位数。', 'admin', TO_DATE('2021-03-18 15:45:01', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-05 16:58:27', 'YYYY-MM-DD HH24:MI:SS')); + +-- ---------------------------- +-- Table structure for SYS_DATA_LOG +-- ---------------------------- +DROP TABLE "SYS_DATA_LOG"; +CREATE TABLE "SYS_DATA_LOG" ( +"ID" NVARCHAR2(32) NOT NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"DATA_TABLE" NVARCHAR2(32) NULL , +"DATA_ID" NVARCHAR2(32) NULL , +"DATA_CONTENT" NCLOB NULL , +"DATA_VERSION" NUMBER(11) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_DATA_LOG"."ID" IS 'id'; +COMMENT ON COLUMN "SYS_DATA_LOG"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "SYS_DATA_LOG"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_DATA_LOG"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "SYS_DATA_LOG"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "SYS_DATA_LOG"."DATA_TABLE" IS '表名'; +COMMENT ON COLUMN "SYS_DATA_LOG"."DATA_ID" IS '数据ID'; +COMMENT ON COLUMN "SYS_DATA_LOG"."DATA_CONTENT" IS '数据内容'; +COMMENT ON COLUMN "SYS_DATA_LOG"."DATA_VERSION" IS '版本号'; + +-- ---------------------------- +-- Records of SYS_DATA_LOG +-- ---------------------------- +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab0d198015ab12274bf0006', 'admin', TO_DATE('2017-03-09 11:35:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef81550c1a7901550c1cd6e70001', '{"mobilePhone":"","officePhone":"","email":"","createDate":"Jun 23, 2016 12:00:00 PM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"9001","status":"1","content":"111","id":"4028ef81550c1a7901550c1cd6e70001"}', '3'); +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab6d12b015ab700bead0009', 'admin', TO_DATE('2017-03-10 14:56:03', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '402880f05ab6d12b015ab700be8d0008', '{"mobilePhone":"","officePhone":"","email":"","createDate":"Mar 10, 2017 2:56:03 PM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"111","status":"0","id":"402880f05ab6d12b015ab700be8d0008"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab6d12b015ab705a23f000d', 'admin', TO_DATE('2017-03-10 15:01:24', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '402880f05ab6d12b015ab705a233000c', '{"mobilePhone":"","officePhone":"11","email":"","createDate":"Mar 10, 2017 3:01:24 PM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"11","status":"0","id":"402880f05ab6d12b015ab705a233000c"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab6d12b015ab712a6420013', 'admin', TO_DATE('2017-03-10 15:15:37', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '402880f05ab6d12b015ab712a6360012', '{"mobilePhone":"","officePhone":"","email":"","createDate":"Mar 10, 2017 3:15:37 PM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"小王","status":"0","id":"402880f05ab6d12b015ab712a6360012"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab6d12b015ab712d0510015', 'admin', TO_DATE('2017-03-10 15:15:47', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '402880f05ab6d12b015ab712a6360012', '{"mobilePhone":"18611788525","officePhone":"","email":"","createDate":"Mar 10, 2017 3:15:37 AM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"小王","status":"0","id":"402880f05ab6d12b015ab712a6360012"}', '2'); +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab6d12b015ab71308240018', 'admin', TO_DATE('2017-03-10 15:16:02', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '8a8ab0b246dc81120146dc81860f016f', '{"mobilePhone":"13111111111","officePhone":"66666666","email":"demo@jero.com","age":12,"salary":10.00,"birthday":"Feb 14, 2014 12:00:00 AM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"小明","status":"","content":"","id":"8a8ab0b246dc81120146dc81860f016f"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('402880f05ab6d12b015ab72806c3001b', 'admin', TO_DATE('2017-03-10 15:38:58', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '8a8ab0b246dc81120146dc81860f016f', '{"mobilePhone":"18611788888","officePhone":"66666666","email":"demo@jero.com","age":12,"salary":10.00,"birthday":"Feb 14, 2014 12:00:00 AM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"小明","status":"","content":"","id":"8a8ab0b246dc81120146dc81860f016f"}', '2'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef815318148a0153181567690001', 'admin', TO_DATE('2016-02-25 18:59:29', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef815318148a0153181566270000', '{"mobilePhone":"13423423423","officePhone":"1","email":"","age":1,"salary":1,"birthday":"Feb 25, 2016 12:00:00 AM","createDate":"Feb 25, 2016 6:59:24 PM","depId":"402880e447e9a9570147e9b6a3be0005","userName":"1","status":"0","id":"4028ef815318148a0153181566270000"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef815318148a01531815ec5c0003', 'admin', TO_DATE('2016-02-25 19:00:03', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef815318148a0153181566270000', '{"mobilePhone":"13426498659","officePhone":"1","email":"","age":1,"salary":1.00,"birthday":"Feb 25, 2016 12:00:00 AM","createDate":"Feb 25, 2016 6:59:24 AM","depId":"402880e447e9a9570147e9b6a3be0005","userName":"1","status":"0","id":"4028ef815318148a0153181566270000"}', '2'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef8153c028db0153c0502e6b0003', 'admin', TO_DATE('2016-03-29 10:59:53', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef8153c028db0153c0502d420002', '{"mobilePhone":"18455477548","officePhone":"123","email":"","createDate":"Mar 29, 2016 10:59:53 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"123","status":"0","id":"4028ef8153c028db0153c0502d420002"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef8153c028db0153c0509aa40006', 'admin', TO_DATE('2016-03-29 11:00:21', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef8153c028db0153c0509a3e0005', '{"mobilePhone":"13565486458","officePhone":"","email":"","createDate":"Mar 29, 2016 11:00:21 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"22","status":"0","id":"4028ef8153c028db0153c0509a3e0005"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef8153c028db0153c051c4a70008', 'admin', TO_DATE('2016-03-29 11:01:37', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef8153c028db0153c0509a3e0005', '{"mobilePhone":"13565486458","officePhone":"","email":"","createDate":"Mar 29, 2016 11:00:21 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"22","status":"0","id":"4028ef8153c028db0153c0509a3e0005"}', '2'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef8153c028db0153c051d4b5000a', 'admin', TO_DATE('2016-03-29 11:01:41', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef8153c028db0153c0502d420002', '{"mobilePhone":"13565486458","officePhone":"123","email":"","createDate":"Mar 29, 2016 10:59:53 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"123","status":"0","id":"4028ef8153c028db0153c0502d420002"}', '2'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef8153c028db0153c07033d8000d', 'admin', TO_DATE('2016-03-29 11:34:52', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef8153c028db0153c0502d420002', '{"mobilePhone":"13565486458","officePhone":"123","email":"","age":23,"createDate":"Mar 29, 2016 10:59:53 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"123","status":"0","id":"4028ef8153c028db0153c0502d420002"}', '3'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef8153c028db0153c070492e000f', 'admin', TO_DATE('2016-03-29 11:34:57', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef8153c028db0153c0509a3e0005', '{"mobilePhone":"13565486458","officePhone":"","email":"","age":22,"createDate":"Mar 29, 2016 11:00:21 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"22","status":"0","id":"4028ef8153c028db0153c0509a3e0005"}', '3'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef81550c1a7901550c1cd7850002', 'admin', TO_DATE('2016-06-01 21:17:44', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef81550c1a7901550c1cd6e70001', '{"mobilePhone":"","officePhone":"","email":"","createDate":"Jun 1, 2016 9:17:44 PM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"121221","status":"0","id":"4028ef81550c1a7901550c1cd6e70001"}', '1'); +INSERT INTO "SYS_DATA_LOG" VALUES ('4028ef81568c31ec01568c3307080004', 'admin', TO_DATE('2016-08-15 11:16:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'jero_demo', '4028ef81550c1a7901550c1cd6e70001', '{"mobilePhone":"","officePhone":"","email":"","createDate":"Jun 23, 2016 12:00:00 PM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"9001","status":"1","content":"111","id":"4028ef81550c1a7901550c1cd6e70001"}', '2'); + +-- ---------------------------- +-- Table structure for SYS_DATA_SOURCE +-- ---------------------------- +DROP TABLE "SYS_DATA_SOURCE"; +CREATE TABLE "SYS_DATA_SOURCE" ( +"ID" NVARCHAR2(36) NOT NULL , +"CODE" NVARCHAR2(100) NULL , +"NAME" NVARCHAR2(100) NULL , +"REMARK" NVARCHAR2(200) NULL , +"DB_TYPE" NVARCHAR2(10) NULL , +"DB_DRIVER" NVARCHAR2(100) NULL , +"DB_URL" NVARCHAR2(500) NULL , +"DB_NAME" NVARCHAR2(100) NULL , +"DB_USERNAME" NVARCHAR2(100) NULL , +"DB_PASSWORD" NVARCHAR2(100) NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL , +"SYS_ORG_CODE" NVARCHAR2(64) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."CODE" IS '数据源编码'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."NAME" IS '数据源名称'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."DB_TYPE" IS '数据库类型'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."DB_DRIVER" IS '驱动类'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."DB_URL" IS '数据源地址'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."DB_NAME" IS '数据库名称'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."DB_USERNAME" IS '用户名'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."DB_PASSWORD" IS '密码'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "SYS_DATA_SOURCE"."SYS_ORG_CODE" IS '所属部门'; + +-- ---------------------------- +-- Records of SYS_DATA_SOURCE +-- ---------------------------- +INSERT INTO "SYS_DATA_SOURCE" VALUES ('1209779538310004737', 'local_mysql', 'MySQL5.7-Demo', '本地数据库MySQL5.7', '4', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai', 'jero-boot', 'jero-boot', 'c0e5dbdaede24c84091fb7dc0db47ccb', 'admin', TO_DATE('2019-12-25 18:14:53', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 16:44:03', 'YYYY-MM-DD HH24:MI:SS'), 'A01'); + +-- ---------------------------- +-- Table structure for SYS_DEPART +-- ---------------------------- +DROP TABLE "SYS_DEPART"; +CREATE TABLE "SYS_DEPART" ( +"ID" NVARCHAR2(32) NOT NULL , +"PARENT_ID" NVARCHAR2(32) NULL , +"DEPART_NAME" NVARCHAR2(100) NOT NULL , +"DEPART_NAME_EN" NVARCHAR2(500) NULL , +"DEPART_NAME_ABBR" NVARCHAR2(500) NULL , +"DEPART_ORDER" NUMBER(11) NULL , +"DESCRIPTION" NVARCHAR2(500) NULL , +"ORG_CATEGORY" NVARCHAR2(10) NOT NULL , +"ORG_TYPE" NVARCHAR2(10) NULL , +"ORG_CODE" NVARCHAR2(64) NOT NULL , +"MOBILE" NVARCHAR2(32) NULL , +"FAX" NVARCHAR2(32) NULL , +"ADDRESS" NVARCHAR2(100) NULL , +"MEMO" NVARCHAR2(500) NULL , +"STATUS" NVARCHAR2(1) NULL , +"DEL_FLAG" NVARCHAR2(1) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_DEPART" IS '组织机构表'; +COMMENT ON COLUMN "SYS_DEPART"."ID" IS 'ID'; +COMMENT ON COLUMN "SYS_DEPART"."PARENT_ID" IS '父机构ID'; +COMMENT ON COLUMN "SYS_DEPART"."DEPART_NAME" IS '机构/部门名称'; +COMMENT ON COLUMN "SYS_DEPART"."DEPART_NAME_EN" IS '英文名'; +COMMENT ON COLUMN "SYS_DEPART"."DEPART_NAME_ABBR" IS '缩写'; +COMMENT ON COLUMN "SYS_DEPART"."DEPART_ORDER" IS '排序'; +COMMENT ON COLUMN "SYS_DEPART"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_DEPART"."ORG_CATEGORY" IS '机构类别 1公司,2组织机构,2岗位'; +COMMENT ON COLUMN "SYS_DEPART"."ORG_TYPE" IS '机构类型 1一级部门 2子部门'; +COMMENT ON COLUMN "SYS_DEPART"."ORG_CODE" IS '机构编码'; +COMMENT ON COLUMN "SYS_DEPART"."MOBILE" IS '手机号'; +COMMENT ON COLUMN "SYS_DEPART"."FAX" IS '传真'; +COMMENT ON COLUMN "SYS_DEPART"."ADDRESS" IS '地址'; +COMMENT ON COLUMN "SYS_DEPART"."MEMO" IS '备注'; +COMMENT ON COLUMN "SYS_DEPART"."STATUS" IS '状态(1启用,0不启用)'; +COMMENT ON COLUMN "SYS_DEPART"."DEL_FLAG" IS '删除状态(0,正常,1已删除)'; +COMMENT ON COLUMN "SYS_DEPART"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_DEPART"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_DEPART"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_DEPART"."UPDATE_TIME" IS '更新日期'; + +-- ---------------------------- +-- Records of SYS_DEPART +-- ---------------------------- +INSERT INTO "SYS_DEPART" VALUES ('c6d7cb4deeac411cb3384b1b31278596', null, '公司总部', null, null, '0', null, '1', '1', 'A01', null, null, null, null, null, '0', 'admin', TO_DATE('2019-02-11 14:21:51', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 14:19:08', 'YYYY-MM-DD HH24:MI:SS')); + +-- ---------------------------- +-- Table structure for SYS_DEPART_PERMISSION +-- ---------------------------- +DROP TABLE "SYS_DEPART_PERMISSION"; +CREATE TABLE "SYS_DEPART_PERMISSION" ( +"ID" NVARCHAR2(32) NOT NULL , +"DEPART_ID" NVARCHAR2(32) NULL , +"PERMISSION_ID" NVARCHAR2(32) NULL , +"DATA_RULE_IDS" NVARCHAR2(1000) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_DEPART_PERMISSION" IS '部门权限表'; +COMMENT ON COLUMN "SYS_DEPART_PERMISSION"."DEPART_ID" IS '部门id'; +COMMENT ON COLUMN "SYS_DEPART_PERMISSION"."PERMISSION_ID" IS '权限id'; +COMMENT ON COLUMN "SYS_DEPART_PERMISSION"."DATA_RULE_IDS" IS '数据规则id'; + +-- ---------------------------- +-- Records of SYS_DEPART_PERMISSION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_DEPART_ROLE +-- ---------------------------- +DROP TABLE "SYS_DEPART_ROLE"; +CREATE TABLE "SYS_DEPART_ROLE" ( +"ID" NVARCHAR2(32) NOT NULL , +"DEPART_ID" NVARCHAR2(32) NULL , +"ROLE_NAME" NVARCHAR2(200) NULL , +"ROLE_CODE" NVARCHAR2(100) NULL , +"DESCRIPTION" NVARCHAR2(255) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_DEPART_ROLE" IS '部门角色表'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."DEPART_ID" IS '部门id'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."ROLE_NAME" IS '部门角色名称'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."ROLE_CODE" IS '部门角色编码'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_DEPART_ROLE"."UPDATE_TIME" IS '更新时间'; + +-- ---------------------------- +-- Records of SYS_DEPART_ROLE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_DEPART_ROLE_PERMISSION +-- ---------------------------- +DROP TABLE "SYS_DEPART_ROLE_PERMISSION"; +CREATE TABLE "SYS_DEPART_ROLE_PERMISSION" ( +"ID" NVARCHAR2(32) NOT NULL , +"DEPART_ID" NVARCHAR2(32) NULL , +"ROLE_ID" NVARCHAR2(32) NULL , +"PERMISSION_ID" NVARCHAR2(32) NULL , +"DATA_RULE_IDS" NVARCHAR2(1000) NULL , +"OPERATE_DATE" DATE NULL , +"OPERATE_IP" NVARCHAR2(20) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_DEPART_ROLE_PERMISSION" IS '部门角色权限表'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_PERMISSION"."DEPART_ID" IS '部门id'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_PERMISSION"."ROLE_ID" IS '角色id'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_PERMISSION"."PERMISSION_ID" IS '权限id'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_PERMISSION"."DATA_RULE_IDS" IS '数据权限ids'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_PERMISSION"."OPERATE_DATE" IS '操作时间'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_PERMISSION"."OPERATE_IP" IS '操作ip'; + +-- ---------------------------- +-- Records of SYS_DEPART_ROLE_PERMISSION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_DEPART_ROLE_USER +-- ---------------------------- +DROP TABLE "SYS_DEPART_ROLE_USER"; +CREATE TABLE "SYS_DEPART_ROLE_USER" ( +"ID" NVARCHAR2(32) NOT NULL , +"USER_ID" NVARCHAR2(32) NULL , +"DROLE_ID" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_DEPART_ROLE_USER" IS '部门角色用户表'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_USER"."ID" IS '主键id'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_USER"."USER_ID" IS '用户id'; +COMMENT ON COLUMN "SYS_DEPART_ROLE_USER"."DROLE_ID" IS '角色id'; + +-- ---------------------------- +-- Records of SYS_DEPART_ROLE_USER +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_DICT +-- ---------------------------- +DROP TABLE "SYS_DICT"; +CREATE TABLE "SYS_DICT" ( +"ID" NVARCHAR2(32) NOT NULL , +"DICT_NAME" NVARCHAR2(100) NOT NULL , +"DICT_CODE" NVARCHAR2(100) NOT NULL , +"DESCRIPTION" NVARCHAR2(255) NULL , +"DEL_FLAG" NUMBER(11) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"TYPE" NUMBER(11) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_DICT"."DICT_NAME" IS '字典名称'; +COMMENT ON COLUMN "SYS_DICT"."DICT_CODE" IS '字典编码'; +COMMENT ON COLUMN "SYS_DICT"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_DICT"."DEL_FLAG" IS '删除状态'; +COMMENT ON COLUMN "SYS_DICT"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_DICT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_DICT"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_DICT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYS_DICT"."TYPE" IS '字典类型0为string,1为number'; + +-- ---------------------------- +-- Records of SYS_DICT +-- ---------------------------- +INSERT INTO "SYS_DICT" VALUES ('0b5d19e1fce4b2e6647e6b4a17760c14', '通告类型', 'msg_category', '消息类型1:通知公告2:系统消息', '0', 'admin', TO_DATE('2019-04-22 18:01:35', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('1174511106530525185', '机构类型', 'org_category', '机构类型 1公司,2部门 3岗位', '0', 'admin', TO_DATE('2019-09-19 10:30:43', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('1209733563293962241', '数据库类型', 'database_type', null, '0', 'admin', TO_DATE('2019-12-25 15:12:12', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('1232913193820581889', 'Online表单业务分类', 'ol_form_biz_type', null, '0', 'admin', TO_DATE('2020-02-27 14:19:46', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-27 14:20:23', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('1250687930947620866', '定时任务状态', 'quartz_status', null, '0', 'admin', TO_DATE('2020-04-16 15:30:14', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "SYS_DICT" VALUES ('1280401766745718786', '租户状态', 'tenant_status', '租户状态', '0', 'admin', TO_DATE('2020-07-07 15:22:25', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('236e8a4baff0db8c62c00dd95632834f', '同步工作流引擎', 'activiti_sync', '同步工作流引擎', '0', 'admin', TO_DATE('2019-05-15 15:27:33', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('2e02df51611a4b9632828ab7e5338f00', '权限策略', 'perms_type', '权限策略', '0', 'admin', TO_DATE('2019-04-26 18:26:55', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', null, '0', 'admin', TO_DATE('2019-03-17 21:21:32', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-26 19:57:45', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', null, '0', 'admin', TO_DATE('2019-01-18 21:46:26', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-30 11:17:11', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', null, '0', null, TO_DATE('2019-01-04 14:56:32', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-30 11:28:27', 'YYYY-MM-DD HH24:MI:SS'), '1'); +INSERT INTO "SYS_DICT" VALUES ('4274efc2292239b6f000b153f50823ff', '全局权限策略', 'global_perms_type', '全局权限策略', '0', 'admin', TO_DATE('2019-05-10 17:54:05', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', null, '0', 'admin', TO_DATE('2020-06-18 23:18:42', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-30 19:33:52', 'YYYY-MM-DD HH24:MI:SS'), '1'); +INSERT INTO "SYS_DICT" VALUES ('4d7fec1a7799a436d26d02325eff295e', '优先级', 'priority', '优先级', '0', 'admin', TO_DATE('2019-03-16 17:03:34', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-16 17:39:23', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', null, '0', 'admin', TO_DATE('2019-04-01 10:15:03', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 10:30:47', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', null, '0', 'admin', TO_DATE('2019-04-11 14:27:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('68168534ff5065a152bfab275c2136f8', '有效无效状态', 'valid_status', '有效无效状态', '0', 'admin', TO_DATE('2020-09-26 19:21:14', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-26 19:21:23', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', null, '0', 'admin', TO_DATE('2019-01-27 10:13:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-30 11:37:36', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('78bda155fe380b1b3f175f1e88c284c6', '流程状态', 'bpm_status', '流程状态', '0', 'admin', TO_DATE('2019-05-09 16:31:52', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', null, '0', 'admin', TO_DATE('2019-03-18 23:22:19', 'YYYY-MM-DD HH24:MI:SS'), null, null, '1'); +INSERT INTO "SYS_DICT" VALUES ('845da5006c97754728bf48b6a10f79cc', '状态', 'status', null, '0', 'admin', TO_DATE('2019-03-18 21:45:25', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-18 21:58:25', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYS_DICT" VALUES ('880a895c98afeca9d9ac39f29e67c13e', '操作类型', 'operate_type', '操作类型', '0', 'admin', TO_DATE('2019-07-22 10:54:29', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('8dfe32e2d29ea9430a988b3b558bf233', '发布状态', 'send_status', '发布状态', '0', 'admin', TO_DATE('2019-04-16 17:40:42', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('a7adbcd86c37f7dbc9b66945c82ef9e6', '1是0否', 'yn', null, '0', 'admin', TO_DATE('2019-05-22 19:29:29', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', null, '0', 'admin', TO_DATE('2019-04-12 18:18:17', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', null, '0', 'admin', TO_DATE('2020-12-18 23:24:32', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 15:27:06', 'YYYY-MM-DD HH24:MI:SS'), '1'); +INSERT INTO "SYS_DICT" VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', null, '0', 'admin', TO_DATE('2019-03-18 21:59:51', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0'); +INSERT INTO "SYS_DICT" VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', null, '0', 'admin', TO_DATE('2019-03-18 21:57:25', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-18 23:11:58', 'YYYY-MM-DD HH24:MI:SS'), '1'); + +-- ---------------------------- +-- Table structure for SYS_DICT_ITEM +-- ---------------------------- +DROP TABLE "SYS_DICT_ITEM"; +CREATE TABLE "SYS_DICT_ITEM" ( +"ID" NVARCHAR2(32) NOT NULL , +"DICT_ID" NVARCHAR2(32) NULL , +"ITEM_TEXT" NVARCHAR2(100) NOT NULL , +"ITEM_VALUE" NVARCHAR2(100) NOT NULL , +"DESCRIPTION" NVARCHAR2(255) NULL , +"SORT_ORDER" NUMBER(11) NULL , +"STATUS" NUMBER(11) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_DICT_ITEM"."DICT_ID" IS '字典id'; +COMMENT ON COLUMN "SYS_DICT_ITEM"."ITEM_TEXT" IS '字典项文本'; +COMMENT ON COLUMN "SYS_DICT_ITEM"."ITEM_VALUE" IS '字典项值'; +COMMENT ON COLUMN "SYS_DICT_ITEM"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_DICT_ITEM"."SORT_ORDER" IS '排序'; +COMMENT ON COLUMN "SYS_DICT_ITEM"."STATUS" IS '状态(1启用 0不启用)'; + +-- ---------------------------- +-- Records of SYS_DICT_ITEM +-- ---------------------------- +INSERT INTO "SYS_DICT_ITEM" VALUES ('0072d115e07c875d76c9b022e2179128', '4d7fec1a7799a436d26d02325eff295e', '低', 'L', '低', '3', '1', 'admin', TO_DATE('2019-04-16 17:04:59', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', null, null, '1', 'admin', TO_DATE('2025-10-18 21:46:56', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-28 22:23:20', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', null, null, '1', 'admin', TO_DATE('2019-03-17 21:22:19', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-17 21:22:28', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', null, '3', '1', 'admin', TO_DATE('2019-03-27 10:13:43', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1030a2652608f5eac3b49d70458b8532', '2e02df51611a4b9632828ab7e5338f00', '禁用', '2', '禁用', '2', '1', 'admin', TO_DATE('2021-03-26 18:27:28', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-26 18:39:11', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1174509082208395266', '1174511106530525185', '岗位', '3', '岗位', '1', '1', 'admin', TO_DATE('2019-09-19 10:31:16', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1174511197735665665', '1174511106530525185', '公司', '1', '公司', '1', '1', 'admin', TO_DATE('2019-09-19 10:31:05', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1174511244036587521', '1174511106530525185', '部门', '2', '部门', '1', '1', 'admin', TO_DATE('2019-09-19 10:31:16', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1199607547704647681', '4f69be5f507accea8d5df5f11346181a', '系统', '4', null, '1', '1', 'admin', TO_DATE('2019-11-27 16:35:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-11-27 19:37:46', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1209733775114702850', '1209733563293962241', 'MySQL5.5', '1', null, '1', '1', 'admin', TO_DATE('2019-12-25 15:13:02', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1209733839933476865', '1209733563293962241', 'Oracle', '2', null, '3', '1', 'admin', TO_DATE('2019-12-25 15:13:18', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1209733903020003330', '1209733563293962241', 'SQLServer', '3', null, '4', '1', 'admin', TO_DATE('2019-12-25 15:13:33', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1232913424813486081', '1232913193820581889', '官方示例', 'demo', null, '1', '1', 'admin', TO_DATE('2020-02-27 14:20:42', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-27 14:21:37', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1232913493717512194', '1232913193820581889', '流程表单', 'bpm', null, '2', '1', 'admin', TO_DATE('2020-02-27 14:20:58', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-27 14:22:20', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1232913605382467585', '1232913193820581889', '测试表单', 'temp', null, '4', '1', 'admin', TO_DATE('2020-02-27 14:21:25', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-27 14:22:16', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1232914232372195330', '1232913193820581889', '导入表单', 'bdfl_include', null, '5', '1', 'admin', TO_DATE('2020-02-27 14:23:54', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1234371726545010689', '4e4602b3e3686f0911384e188dc7efb4', '左模糊', 'LEFT_LIKE', '左模糊', '7', '1', 'admin', TO_DATE('2020-03-02 14:55:27', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1234371809495760898', '4e4602b3e3686f0911384e188dc7efb4', '右模糊', 'RIGHT_LIKE', '右模糊', '7', '1', 'admin', TO_DATE('2020-03-02 14:55:47', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1250688147579228161', '1250687930947620866', '正常', '0', null, '1', '1', 'admin', TO_DATE('2020-04-16 15:31:05', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1250688201064992770', '1250687930947620866', '停止', '-1', null, '1', '1', 'admin', TO_DATE('2020-04-16 15:31:18', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1280401815068295170', '1280401766745718786', '正常', '1', null, '1', '1', 'admin', TO_DATE('2020-07-07 15:22:36', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1280401847607705602', '1280401766745718786', '冻结', '0', null, '1', '1', 'admin', TO_DATE('2020-07-07 15:22:44', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', null, '1', '1', 'admin', TO_DATE('2020-12-03 18:16:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-12-03 18:16:02', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('222705e11ef0264d4214affff1fb4ff9', '4f69be5f507accea8d5df5f11346181a', '短信', '1', null, '1', '1', 'admin', TO_DATE('2023-02-28 10:50:36', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-28 10:58:11', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', '不等于', '3', '1', 'admin', TO_DATE('2019-04-01 16:46:15', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:48:40', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', '小于等于', '6', '1', 'admin', TO_DATE('2019-04-01 16:44:34', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:49:10', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('2d51376643f220afdeb6d216a8ac2c01', '68168534ff5065a152bfab275c2136f8', '有效', '1', '有效', '2', '1', 'admin', TO_DATE('2019-04-26 19:22:01', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('308c8aadf0c37ecdde188b97ca9833f5', '8dfe32e2d29ea9430a988b3b558bf233', '已发布', '1', '已发布', '2', '1', 'admin', TO_DATE('2019-04-16 17:41:24', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('333e6b2196e01ef9a5f76d74e86a6e33', '8dfe32e2d29ea9430a988b3b558bf233', '未发布', '0', '未发布', '1', '1', 'admin', TO_DATE('2019-04-16 17:41:12', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', null, '3', '1', 'admin', TO_DATE('2019-04-12 18:20:02', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('3fbc03d6c994ae06d083751248037c0e', '78bda155fe380b1b3f175f1e88c284c6', '已完成', '3', '已完成', '3', '1', 'admin', TO_DATE('2019-05-09 16:33:25', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('41d7aaa40c9b61756ffb1f28da5ead8e', '0b5d19e1fce4b2e6647e6b4a17760c14', '通知公告', '1', null, '1', '1', 'admin', TO_DATE('2019-04-22 18:01:57', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', '等于', '4', '1', 'admin', TO_DATE('2019-04-01 16:45:24', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:49:00', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('43d2295b8610adce9510ff196a49c6e9', '845da5006c97754728bf48b6a10f79cc', '正常', '1', null, null, '1', 'admin', TO_DATE('2019-03-18 21:45:51', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', null, null, '1', 'admin', TO_DATE('2019-03-18 23:22:49', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('51222413e5906cdaf160bb5c86fb827c', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '是', '1', null, '1', '1', 'admin', TO_DATE('2019-05-22 19:29:45', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('538fca35afe004972c5f3947c039e766', '2e02df51611a4b9632828ab7e5338f00', '显示', '1', '显示', '1', '1', 'admin', TO_DATE('2025-03-26 18:27:13', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-26 18:39:07', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL表达式', 'USE_SQL_RULES', '自定义SQL表达式', '9', '1', 'admin', TO_DATE('2019-04-01 10:45:24', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:49:27', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', null, '2', '1', 'admin', TO_DATE('2019-03-27 10:13:36', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', null, null, '1', 'admin', TO_DATE('2020-10-17 21:22:43', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-28 22:17:09', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('5d833f69296f691843ccdd0c91212b6b', '880a895c98afeca9d9ac39f29e67c13e', '修改', '3', null, '3', '1', 'admin', TO_DATE('2019-07-22 10:55:07', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-07-22 10:55:41', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', null, '2', '1', null, TO_DATE('2019-01-04 14:56:56', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2019-01-04 17:38:12', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', '大于', '1', '1', 'admin', TO_DATE('2019-04-01 10:45:46', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:48:29', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', null, '1', '1', 'admin', TO_DATE('2019-04-12 18:19:23', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('6a7a9e1403a7943aba69e54ebeff9762', '4f69be5f507accea8d5df5f11346181a', '邮件', '2', null, '2', '1', 'admin', TO_DATE('2031-02-28 10:50:44', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-28 10:59:03', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', null, '1', '1', 'admin', TO_DATE('2019-03-27 10:13:29', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', '模糊', '7', '1', 'admin', TO_DATE('2019-04-01 16:46:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:49:20', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('6d4e26e78e1a09699182e08516c49fc4', '4d7fec1a7799a436d26d02325eff295e', '高', 'H', '高', '1', '1', 'admin', TO_DATE('2019-04-16 17:04:24', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', null, null, '1', 'admin', TO_DATE('2019-03-18 23:29:41', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-18 23:29:54', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', null, null, '1', 'admin', TO_DATE('2019-03-18 23:29:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', null, null, '1', 'admin', TO_DATE('2019-03-18 23:30:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', null, null, '1', 'admin', TO_DATE('2019-03-18 23:25:40', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', null, null, '1', 'admin', TO_DATE('2019-03-18 23:30:37', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', null, '1', '1', 'admin', TO_DATE('2019-05-10 17:54:51', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', '5', '1', 'admin', TO_DATE('2019-04-01 10:46:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:49:05', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('84dfc178dd61b95a72900fcdd624c471', '78bda155fe380b1b3f175f1e88c284c6', '处理中', '2', '处理中', '2', '1', 'admin', TO_DATE('2019-05-09 16:33:01', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', null, null, '1', 'admin', TO_DATE('2019-03-18 23:25:27', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('8bccb963e1cd9e8d42482c54cc609ca2', '4f69be5f507accea8d5df5f11346181a', '微信', '3', null, '3', '1', 'admin', TO_DATE('2021-05-11 14:29:12', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-11 14:29:31', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', null, '0', '1', 'admin', TO_DATE('2020-07-18 23:19:27', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-05-17 14:51:18', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('8cdf08045056671efd10677b8456c999', '4274efc2292239b6f000b153f50823ff', '可编辑(未授权时禁用)', '2', null, '2', '1', 'admin', TO_DATE('2019-05-10 17:55:38', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('8ff48e657a7c5090d4f2a59b37d1b878', '4d7fec1a7799a436d26d02325eff295e', '中', 'M', '中', '2', '1', 'admin', TO_DATE('2019-04-16 17:04:40', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('948923658baa330319e59b2213cda97c', '880a895c98afeca9d9ac39f29e67c13e', '添加', '2', null, '2', '1', 'admin', TO_DATE('2019-07-22 10:54:59', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-07-22 10:55:36', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', null, '1', '1', 'admin', TO_DATE('2019-03-18 23:19:53', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('a1e7d1ca507cff4a480c8caba7c1339e', '880a895c98afeca9d9ac39f29e67c13e', '导出', '6', null, '6', '1', 'admin', TO_DATE('2019-07-22 12:06:50', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('a2be752dd4ec980afaec1efd1fb589af', '8dfe32e2d29ea9430a988b3b558bf233', '已撤销', '2', '已撤销', '3', '1', 'admin', TO_DATE('2019-04-16 17:41:39', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', null, null, '1', 'admin', TO_DATE('2019-03-18 23:24:52', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', '包含', '8', '1', 'admin', TO_DATE('2019-04-01 16:45:47', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:49:24', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('b029a41a851465332ee4ee69dcf0a4c2', '0b5d19e1fce4b2e6647e6b4a17760c14', '系统消息', '2', null, '1', '1', 'admin', TO_DATE('2019-02-22 18:02:08', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-22 18:02:13', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', null, null, '1', 'admin', TO_DATE('2022-10-18 21:46:48', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-28 22:22:20', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('b5f3bd5f66bb9a83fecd89228c0d93d1', '68168534ff5065a152bfab275c2136f8', '无效', '0', '无效', '1', '1', 'admin', TO_DATE('2019-04-26 19:21:49', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('b9fbe2a3602d4a27b45c100ac5328484', '78bda155fe380b1b3f175f1e88c284c6', '待提交', '1', '待提交', '1', '1', 'admin', TO_DATE('2019-05-09 16:32:35', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('ba27737829c6e0e582e334832703d75e', '236e8a4baff0db8c62c00dd95632834f', '同步', '1', '同步', '1', '1', 'admin', TO_DATE('2019-05-15 15:28:15', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('bcec04526b04307e24a005d6dcd27fd6', '880a895c98afeca9d9ac39f29e67c13e', '导入', '5', null, '5', '1', 'admin', TO_DATE('2019-07-22 12:06:41', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('c53da022b9912e0aed691bbec3c78473', '880a895c98afeca9d9ac39f29e67c13e', '查询', '1', null, '1', '1', 'admin', TO_DATE('2019-07-22 10:54:51', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('c5700a71ad08994d18ad1dacc37a71a9', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '否', '0', null, '1', '1', 'admin', TO_DATE('2019-05-22 19:29:55', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', null, '1', '1', null, TO_DATE('2027-08-04 14:56:49', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-23 22:44:44', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', '小于', '2', '1', 'admin', TO_DATE('2019-04-01 16:44:15', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-01 17:48:34', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('e94eb7af89f1dbfa0d823580a7a6e66a', '236e8a4baff0db8c62c00dd95632834f', '不同步', '0', '不同步', '2', '1', 'admin', TO_DATE('2019-05-15 15:28:28', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', null, '2', '1', 'admin', TO_DATE('2019-04-12 18:19:43', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('f2a7920421f3335afdf6ad2b342f6b5d', '845da5006c97754728bf48b6a10f79cc', '冻结', '2', null, null, '1', 'admin', TO_DATE('2019-03-18 21:46:02', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', null, null, '1', 'admin', TO_DATE('2019-03-18 23:22:37', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "SYS_DICT_ITEM" VALUES ('f80a8f6838215753b05e1a5ba3346d22', '880a895c98afeca9d9ac39f29e67c13e', '删除', '4', null, '4', '1', 'admin', TO_DATE('2019-07-22 10:55:14', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-07-22 10:55:30', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_DICT_ITEM" VALUES ('fe50b23ae5e68434def76f67cef35d2d', '78bda155fe380b1b3f175f1e88c284c6', '已作废', '4', '已作废', '4', '1', 'admin', TO_DATE('2021-09-09 16:33:43', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2019-05-09 16:34:40', 'YYYY-MM-DD HH24:MI:SS')); + +-- ---------------------------- +-- Table structure for SYS_FILL_RULE +-- ---------------------------- +DROP TABLE "SYS_FILL_RULE"; +CREATE TABLE "SYS_FILL_RULE" ( +"ID" NVARCHAR2(32) NOT NULL , +"RULE_NAME" NVARCHAR2(100) NULL , +"RULE_CODE" NVARCHAR2(100) NULL , +"RULE_CLASS" NVARCHAR2(100) NULL , +"RULE_PARAMS" NVARCHAR2(200) NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_FILL_RULE"."ID" IS '主键ID'; +COMMENT ON COLUMN "SYS_FILL_RULE"."RULE_NAME" IS '规则名称'; +COMMENT ON COLUMN "SYS_FILL_RULE"."RULE_CODE" IS '规则Code'; +COMMENT ON COLUMN "SYS_FILL_RULE"."RULE_CLASS" IS '规则实现类'; +COMMENT ON COLUMN "SYS_FILL_RULE"."RULE_PARAMS" IS '规则参数'; +COMMENT ON COLUMN "SYS_FILL_RULE"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "SYS_FILL_RULE"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SYS_FILL_RULE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_FILL_RULE"."CREATE_TIME" IS '创建时间'; + +-- ---------------------------- +-- Records of SYS_FILL_RULE +-- ---------------------------- +INSERT INTO "SYS_FILL_RULE" VALUES ('1202551334738382850', '机构编码生成', 'org_num_role', 'com.jero.modules.system.rule.OrgCodeRule', '{"parentId":"c6d7cb4deeac411cb3384b1b31278596"}', 'admin', TO_DATE('2019-12-09 10:37:06', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-05 19:32:35', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "SYS_FILL_RULE" VALUES ('1202787623203065858', '分类字典编码生成', 'category_code_rule', 'com.jero.modules.system.rule.CategoryCodeRule', '{"pid":""}', 'admin', TO_DATE('2019-12-09 10:36:54', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-06 11:11:31', 'YYYY-MM-DD HH24:MI:SS')); + +-- ---------------------------- +-- Table structure for SYS_GATEWAY_ROUTE +-- ---------------------------- +DROP TABLE "SYS_GATEWAY_ROUTE"; +CREATE TABLE "SYS_GATEWAY_ROUTE" ( +"ID" NVARCHAR2(36) NOT NULL , +"ROUTER_ID" NVARCHAR2(50) NULL , +"NAME" NVARCHAR2(32) NULL , +"URI" NVARCHAR2(32) NULL , +"PREDICATES" NCLOB NULL , +"FILTERS" NCLOB NULL , +"RETRYABLE" NUMBER(11) NULL , +"STRIP_PREFIX" NUMBER(11) NULL , +"PERSISTABLE" NUMBER(11) NULL , +"SHOW_API" NUMBER(11) NULL , +"STATUS" NUMBER(11) NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL , +"SYS_ORG_CODE" NVARCHAR2(64) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."ROUTER_ID" IS '路由ID'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."NAME" IS '服务名'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."URI" IS '服务地址'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."PREDICATES" IS '断言'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."FILTERS" IS '过滤器'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."RETRYABLE" IS '是否重试:0-否 1-是'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."STRIP_PREFIX" IS '是否忽略前缀0-否 1-是'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."PERSISTABLE" IS '是否为保留数据:0-否 1-是'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."SHOW_API" IS '是否在接口文档中展示:0-否 1-是'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."STATUS" IS '状态:0-无效 1-有效'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "SYS_GATEWAY_ROUTE"."SYS_ORG_CODE" IS '所属部门'; + +-- ---------------------------- +-- Records of SYS_GATEWAY_ROUTE +-- ---------------------------- +INSERT INTO "SYS_GATEWAY_ROUTE" VALUES ('1331051599401857026', 'jero-demo-websocket', 'jero-demo-websocket', 'lb:ws://jero-demo', '[{"args":["/vxeSocket/**"],"name":"Path"}]', '[]', null, null, null, null, '1', 'admin', TO_DATE('2020-11-24 09:46:46', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "SYS_GATEWAY_ROUTE" VALUES ('jero-cloud-websocket', 'jero-system-websocket', 'jero-system-websocket', 'lb:ws://jero-system', '[{"args":["/websocket/**","/eoaSocket/**","/newsWebsocket/**"],"name":"Path"}]', '[]', null, null, null, null, '1', 'admin', TO_DATE('2020-11-16 19:41:51', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "SYS_GATEWAY_ROUTE" VALUES ('jero-demo', 'jero-demo', 'jero-demo', 'lb://jero-demo', '[{"args":["/mock/**","/test/**","/bigscreen/template1/**","/bigscreen/template2/**"],"name":"Path"}]', '[]', null, null, null, null, '1', 'admin', TO_DATE('2020-11-16 19:41:51', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); +INSERT INTO "SYS_GATEWAY_ROUTE" VALUES ('jero-system', 'jero-system', 'jero-system', 'lb://jero-system', '[{"args":["/sys/**","/eoa/**","/joa/**","/online/**","/bigscreen/**","/jmreport/**","/desform/**","/process/**","/act/**","/plug-in/***/","/druid/**","/generic/**"],"name":"Path"}]', '[]', null, null, null, null, '1', 'admin', TO_DATE('2020-11-16 19:41:51', 'YYYY-MM-DD HH24:MI:SS'), null, null, null); + +-- ---------------------------- +-- Table structure for SYS_LOG +-- ---------------------------- +DROP TABLE "SYS_LOG"; +CREATE TABLE "SYS_LOG" ( +"ID" NVARCHAR2(32) NOT NULL , +"LOG_TYPE" NUMBER(11) NULL , +"LOG_CONTENT" NVARCHAR2(1000) NULL , +"OPERATE_TYPE" NUMBER(11) NULL , +"USERID" NVARCHAR2(32) NULL , +"USERNAME" NVARCHAR2(100) NULL , +"IP" NVARCHAR2(100) NULL , +"METHOD" NVARCHAR2(500) NULL , +"REQUEST_URL" NVARCHAR2(255) NULL , +"REQUEST_PARAM" NCLOB NULL , +"REQUEST_TYPE" NVARCHAR2(10) NULL , +"COST_TIME" NUMBER(20) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_LOG" IS '系统日志表'; +COMMENT ON COLUMN "SYS_LOG"."LOG_TYPE" IS '日志类型(1登录日志,2操作日志)'; +COMMENT ON COLUMN "SYS_LOG"."LOG_CONTENT" IS '日志内容'; +COMMENT ON COLUMN "SYS_LOG"."OPERATE_TYPE" IS '操作类型'; +COMMENT ON COLUMN "SYS_LOG"."USERID" IS '操作用户账号'; +COMMENT ON COLUMN "SYS_LOG"."USERNAME" IS '操作用户名称'; +COMMENT ON COLUMN "SYS_LOG"."IP" IS 'IP'; +COMMENT ON COLUMN "SYS_LOG"."METHOD" IS '请求java方法'; +COMMENT ON COLUMN "SYS_LOG"."REQUEST_URL" IS '请求路径'; +COMMENT ON COLUMN "SYS_LOG"."REQUEST_PARAM" IS '请求参数'; +COMMENT ON COLUMN "SYS_LOG"."REQUEST_TYPE" IS '请求类型'; +COMMENT ON COLUMN "SYS_LOG"."COST_TIME" IS '耗时'; +COMMENT ON COLUMN "SYS_LOG"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_LOG"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_LOG"."UPDATE_TIME" IS '更新时间'; + +-- ---------------------------- +-- Records of SYS_LOG +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_PERMISSION +-- ---------------------------- +DROP TABLE "SYS_PERMISSION"; +CREATE TABLE "SYS_PERMISSION" ( +"ID" NVARCHAR2(32) NOT NULL , +"PARENT_ID" NVARCHAR2(32) NULL , +"NAME" NVARCHAR2(100) NULL , +"URL" NVARCHAR2(255) NULL , +"COMPONENT" NVARCHAR2(255) NULL , +"COMPONENT_NAME" NVARCHAR2(100) NULL , +"REDIRECT" NVARCHAR2(255) NULL , +"MENU_TYPE" NUMBER(11) NULL , +"PERMS" NVARCHAR2(255) NULL , +"PERMS_TYPE" NVARCHAR2(10) NULL , +"SORT_NO" NUMBER(8,2) NULL , +"ALWAYS_SHOW" NUMBER(4) NULL , +"ICON" NVARCHAR2(100) NULL , +"IS_ROUTE" NUMBER(4) NULL , +"IS_LEAF" NUMBER(4) NULL , +"KEEP_ALIVE" NUMBER(4) NULL , +"HIDDEN" NUMBER(11) NULL , +"DESCRIPTION" NVARCHAR2(255) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"DEL_FLAG" NUMBER(11) NULL , +"RULE_FLAG" NUMBER(11) NULL , +"STATUS" NVARCHAR2(2) NULL , +"INTERNAL_OR_EXTERNAL" NUMBER(4) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_PERMISSION" IS '菜单权限表'; +COMMENT ON COLUMN "SYS_PERMISSION"."ID" IS '主键id'; +COMMENT ON COLUMN "SYS_PERMISSION"."PARENT_ID" IS '父id'; +COMMENT ON COLUMN "SYS_PERMISSION"."NAME" IS '菜单标题'; +COMMENT ON COLUMN "SYS_PERMISSION"."URL" IS '路径'; +COMMENT ON COLUMN "SYS_PERMISSION"."COMPONENT" IS '组件'; +COMMENT ON COLUMN "SYS_PERMISSION"."COMPONENT_NAME" IS '组件名字'; +COMMENT ON COLUMN "SYS_PERMISSION"."REDIRECT" IS '一级菜单跳转地址'; +COMMENT ON COLUMN "SYS_PERMISSION"."MENU_TYPE" IS '菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)'; +COMMENT ON COLUMN "SYS_PERMISSION"."PERMS" IS '菜单权限编码'; +COMMENT ON COLUMN "SYS_PERMISSION"."PERMS_TYPE" IS '权限策略1显示2禁用'; +COMMENT ON COLUMN "SYS_PERMISSION"."SORT_NO" IS '菜单排序'; +COMMENT ON COLUMN "SYS_PERMISSION"."ALWAYS_SHOW" IS '聚合子路由: 1是0否'; +COMMENT ON COLUMN "SYS_PERMISSION"."ICON" IS '菜单图标'; +COMMENT ON COLUMN "SYS_PERMISSION"."IS_ROUTE" IS '是否路由菜单: 0:不是 1:是(默认值1)'; +COMMENT ON COLUMN "SYS_PERMISSION"."IS_LEAF" IS '是否叶子节点: 1:是 0:不是'; +COMMENT ON COLUMN "SYS_PERMISSION"."KEEP_ALIVE" IS '是否缓存该页面: 1:是 0:不是'; +COMMENT ON COLUMN "SYS_PERMISSION"."HIDDEN" IS '是否隐藏路由: 0否,1是'; +COMMENT ON COLUMN "SYS_PERMISSION"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_PERMISSION"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_PERMISSION"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_PERMISSION"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_PERMISSION"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYS_PERMISSION"."DEL_FLAG" IS '删除状态 0正常 1已删除'; +COMMENT ON COLUMN "SYS_PERMISSION"."RULE_FLAG" IS '是否添加数据权限1是0否'; +COMMENT ON COLUMN "SYS_PERMISSION"."STATUS" IS '按钮权限状态(0无效1有效)'; +COMMENT ON COLUMN "SYS_PERMISSION"."INTERNAL_OR_EXTERNAL" IS '外链菜单打开方式 0/内部打开 1/外部打开'; + +-- ---------------------------- +-- Records of SYS_PERMISSION +-- ---------------------------- +INSERT INTO "SYS_PERMISSION" VALUES ('c65321e57b7949b7a975313220de0422', '2a470fc0c3954d9dbb61de6d80846549', '异常页', '/exception', 'layouts/RouteView', null, null, '1', null, null, '22', '0', 'warning', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:23:19', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('c6cf95444d80435eb37b2f9db3971ae6', '2a470fc0c3954d9dbb61de6d80846549', '数据回执模拟', '/demo/InterfaceTest', 'demo/InterfaceTest', null, null, '1', null, null, '6', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-02-19 16:02:23', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-21 16:25:45', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('cc50656cf9ca528e6f2150eba4714ad2', '4875ebe289344e14844d8e3ea1edd73f', '基础详情页', '/profile/basic', 'demo/profile/basic/Index', null, null, '1', null, null, '1', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('d07a2c87a451434c99ab06296727ec4f', '700b7f95165c46cc7a78bf227aa8fed3', 'JVM信息', '/monitor/JvmInfo', 'modules/monitor/JvmInfo', null, null, '1', null, null, '4', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-01 23:07:48', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-02 11:37:16', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('d2bbf9ebca5a8fa2e227af97d2da7548', 'c65321e57b7949b7a975313220de0422', '404', '/exception/404', 'exception/404', null, null, '1', null, null, '2', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('d7d6e2e4e2934f2c9385a623fd98c6f3', null, '系统管理', '/isystem', 'layouts/RouteView', null, null, '0', null, null, '15', '0', 'setting', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:31:34', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('d86f58e7ab516d3bc6bfb1fe10585f97', '717f6bee46f44a3897eca9abd6e2ec44', '个人中心', '/account/center', 'account/center/Index', null, null, '1', null, null, '1', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('de13e0f6328c069748de7399fcc1dbbd', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(项目)', '/list/search/project', 'demo/list/TableList', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-02-12 14:01:40', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-12 14:14:18', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('e08cb190ef230d5d4f03824198773950', '5c8042bd6c601270b2bbd9b20bccc68b', '系统通告', '/isystem/annountCement', 'system/SysAnnouncementList', null, null, '1', 'annountCement', null, '1', '0', null, '1', '1', '0', '0', null, null, TO_DATE('2019-01-02 17:23:01', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 18:00:58', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('e1979bb53e9ea51cecc74d86fd9d2f64', '2a470fc0c3954d9dbb61de6d80846549', 'PDF预览', '/demo/jeroPdfView', 'demo/JeroPdfView', null, null, '1', null, null, '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-04-25 10:39:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:18:26', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('e3c13679c73a4f829bcff2aba8fd68b1', '2a470fc0c3954d9dbb61de6d80846549', '表单页', '/form', 'layouts/PageView', null, null, '1', null, null, '25', '0', 'form', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:23:54', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('e41b69c57a941a3bbcce45032fe57605', null, '开发工具', '/online', 'layouts/RouteView', null, null, '0', null, null, '18', '0', 'cloud', '1', '0', '0', '0', null, 'admin', TO_DATE('2019-03-08 10:43:10', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:31:28', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('e5973686ed495c379d829ea8b2881fc6', 'e3c13679c73a4f829bcff2aba8fd68b1', '高级表单', '/form/advanced-form', 'demo/form/advancedForm/AdvancedForm', null, null, '1', null, null, '3', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('e6bfd1fcabfd7942fdd05f076d1dad38', '2a470fc0c3954d9dbb61de6d80846549', '打印测试', '/demo/PrintDemo', 'demo/PrintDemo', null, null, '1', null, null, '3', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-02-19 15:58:48', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-05-07 20:14:39', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('ebb9d82ea16ad864071158e0c449d186', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '分类字典', '/isys/category', 'system/SysCategoryList', null, null, '1', 'sys:category:list', '1', '5.20', '0', null, '1', '0', '0', '0', null, 'admin', TO_DATE('2019-05-29 18:48:07', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-23 22:45:33', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('ec8d607d0156e198b11853760319c646', '6e73eb3c26099c191bf03852ee1310a1', '安全设置', '/account/settings/security', 'account/settings/Security', null, null, '1', 'SecuritySettings', null, null, null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-26 18:59:52', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('f0675b52d89100ee88472b6800754a08', '1371830841603710977', '统计报表', '/report', 'layouts/RouteView', null, null, '1', null, null, '1', '0', 'bar-chart', '1', '0', '0', '0', null, 'admin', TO_DATE('2019-04-03 18:32:02', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:29:03', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('f1cb187abf927c88b89470d08615f5ac', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '数据字典', '/isystem/dict', 'system/DictList', null, null, '1', 'sys:dict:list', null, '5', '0', null, '1', '0', '0', '0', null, null, TO_DATE('2018-12-28 13:54:43', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-23 22:45:25', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('f23d9bfff4d9aa6b68569ba2cff38415', '540a2936940846cb98114ffb0d145cb8', '标准列表', '/list/basic-list', 'demo/list/StandardList', null, null, '1', null, null, '6', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('f780d0d3083d849ccbdb1b1baee4911d', '5c8042bd6c601270b2bbd9b20bccc68b', '模板管理', '/modules/message/sysMessageTemplateList', 'modules/message/SysMessageTemplateList', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-09 11:50:31', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-12 10:16:34', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('fb07ca05a3e13674dbf6d3245956da2e', '540a2936940846cb98114ffb0d145cb8', '搜索列表', '/list/search', 'demo/list/search/SearchLayout', null, '/list/search/article', '1', null, null, '8', '0', null, '1', '0', null, '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-12 15:09:13', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('fb367426764077dcf94640c843733985', '2a470fc0c3954d9dbb61de6d80846549', '一对多示例', '/demo/jeroOrderMainList', 'demo/JeroOrderMainList', null, null, '1', null, null, '2', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-02-15 16:24:11', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:18:47', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('fc810a2267dd183e4ef7c71cc60f4670', '700b7f95165c46cc7a78bf227aa8fed3', '请求追踪', '/monitor/HttpTrace', 'modules/monitor/HttpTrace', null, null, '1', null, null, '4', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-02 09:46:19', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-02 11:37:27', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('fedfbf4420536cacc0218557d263dfea', '6e73eb3c26099c191bf03852ee1310a1', '新消息通知', '/account/settings/notification', 'account/settings/Notification', null, null, '1', 'NotificationSettings', null, null, null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-26 19:02:05', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('00a2a0ae65cdca5e93209cdbde97cbe6', '2e42e3835c2b44ec9f7bc26c146ee531', '成功', '/result/success', 'result/Success', null, null, '1', null, null, '1', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('2e42e3835c2b44ec9f7bc26c146ee531', '2a470fc0c3954d9dbb61de6d80846549', '结果页', '/result', 'layouts/PageView', null, null, '1', null, null, '20', '0', 'check-circle-o', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:22:54', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1371831353354936322', null, '日志中心', '/log', 'layouts/RouteView', null, null, '0', null, '1', '10', '0', 'copy', '1', '0', '0', '0', null, 'admin', TO_DATE('2021-03-16 22:30:57', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:37:10', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('3f915b2769fc80648e92d04e84ca059d', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '用户管理', '/isystem/user', 'system/UserList', null, null, '1', 'sys:user:list', null, '1.10', '0', null, '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-25 09:36:24', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('3fac0d3c9cd40fa53ab70d4c583821f8', '2a470fc0c3954d9dbb61de6d80846549', '分屏', '/demo/splitPanel', 'demo/SplitPanel', null, null, '1', null, null, '6', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-25 16:27:06', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('4148ec82b6acd69f470bea75fe41c357', '2a470fc0c3954d9dbb61de6d80846549', '单表模型示例', '/demo/JeroDemoList', 'demo/JeroDemoList', 'DemoList', null, '1', null, null, '1', '0', null, '1', '1', '0', '0', null, null, TO_DATE('2018-12-28 15:57:30', 'YYYY-MM-DD HH24:MI:SS'), 'jero', TO_DATE('2020-05-14 22:09:34', 'YYYY-MM-DD HH24:MI:SS'), '0', '1', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('418964ba087b90a84897b62474496b93', '540a2936940846cb98114ffb0d145cb8', '查询表格', '/list/query-list', 'demo/list/TableList', null, null, '1', null, null, '1', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('4356a1a67b564f0988a484f5531fd4d9', '2a470fc0c3954d9dbb61de6d80846549', '内嵌Table', '/demo/TableExpandeSub', 'demo/TableExpandeSub', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-04 22:48:13', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('45c966826eeff4c99b8f8ebfe74511fc', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '部门管理', '/isystem/depart', 'system/DepartList', null, null, '1', 'sys:depart:list', null, '1.40', '0', null, '1', '0', '0', '0', null, 'admin', TO_DATE('2019-01-29 18:47:40', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-25 09:36:47', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('4875ebe289344e14844d8e3ea1edd73f', '2a470fc0c3954d9dbb61de6d80846549', '详情页', '/profile', 'layouts/RouteView', null, null, '1', null, null, '21', '0', 'profile', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:23:07', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('4f66409ef3bbd69c1d80469d6e2a885e', '6e73eb3c26099c191bf03852ee1310a1', '账户绑定', '/account/settings/binding', 'account/settings/Binding', null, null, '1', 'BindingSettings', null, null, null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-26 19:01:20', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('4f84f9400e5e92c95f05b554724c2b58', '540a2936940846cb98114ffb0d145cb8', '角色列表', '/list/role-list', 'demo/list/RoleList', null, null, '1', null, null, '4', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('53a9230444d33de28aa11cc108fb1dba', '5c8042bd6c601270b2bbd9b20bccc68b', '我的消息', '/isps/userAnnouncement', 'system/UserAnnouncementList', null, null, '1', null, null, '4', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-04-19 10:16:00', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 18:01:26', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('540a2936940846cb98114ffb0d145cb8', '2a470fc0c3954d9dbb61de6d80846549', '列表页', '/list', 'layouts/PageView', null, '/list/query-list', '1', null, null, '24', '0', 'table', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:23:31', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('54dd5457a3190740005c1bfec55b1c34', 'e41b69c57a941a3bbcce45032fe57605', '菜单管理', '/isystem/permission', 'system/PermissionList', null, null, '1', null, null, '7', '0', null, '1', '1', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:32:38', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('58857ff846e61794c69208e9d3a85466', '1371831353354936322', '操作日志', '/isystem/log', 'system/LogList', null, null, '1', null, null, '1', '0', null, '1', '1', '0', '0', null, null, TO_DATE('2018-12-26 10:11:18', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:33:27', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('58b9204feaf07e47284ddb36cd2d8468', '2a470fc0c3954d9dbb61de6d80846549', '图片翻页', '/demo/imgTurnPage', 'demo/ImgTurnPage', null, null, '1', null, null, '4', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-25 11:36:42', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('5c2f42277948043026b7a14692456828', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '我的部门', '/isystem/departUserList', 'system/DepartUserList', null, null, '1', null, null, '2', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-04-17 15:12:24', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-25 09:35:26', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('5c8042bd6c601270b2bbd9b20bccc68b', null, '消息中心', '/message', 'layouts/RouteView', null, null, '0', null, null, '9', '0', 'message', '1', '0', '0', '0', null, 'admin', TO_DATE('2019-04-09 11:05:04', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:32:06', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('6531cf3421b1265aeeeabaab5e176e6d', 'e3c13679c73a4f829bcff2aba8fd68b1', '分步表单', '/form/step-form', 'demo/form/stepForm/StepForm', null, null, '1', null, null, '2', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('655563cd64b75dcf52ef7bcdd4836953', '2a470fc0c3954d9dbb61de6d80846549', '图片预览', '/demo/ImagPreview', 'demo/ImagPreview', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-17 11:18:45', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('65a8f489f25a345836b7f44b1181197a', 'c65321e57b7949b7a975313220de0422', '403', '/exception/403', 'exception/403', null, null, '1', null, null, '1', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('6ad53fd1b220989a8b71ff482d683a5a', '2a470fc0c3954d9dbb61de6d80846549', '一对多Tab示例', '/demo/tablist/jeroOrderDMainList', 'demo/tablist/JeroOrderDMainList', null, null, '1', null, null, '2', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-02-20 14:45:09', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:18:38', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('6e73eb3c26099c191bf03852ee1310a1', '717f6bee46f44a3897eca9abd6e2ec44', '个人设置', '/account/settings/BaseSetting', 'account/settings/Index', null, null, '1', null, null, '2', '1', null, '1', '0', null, '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-19 09:41:05', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('700b7f95165c46cc7a78bf227aa8fed3', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '性能监控', '/monitor', 'layouts/RouteView', null, null, '1', null, null, '3', '0', null, '1', '0', '0', '0', null, 'admin', TO_DATE('2019-04-02 11:34:34', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-09-09 14:48:51', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('717f6bee46f44a3897eca9abd6e2ec44', '2a470fc0c3954d9dbb61de6d80846549', '个人页', '/account', 'layouts/RouteView', null, null, '1', null, null, '25', '0', 'user', '1', '0', '0', '1', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:23:42', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('73678f9daa45ed17a3674131b03432fb', '540a2936940846cb98114ffb0d145cb8', '权限列表', '/list/permission-list', 'demo/list/PermissionList', null, null, '1', null, null, '5', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('7960961b0063228937da5fa8dd73d371', '2a470fc0c3954d9dbb61de6d80846549', 'JEditableTable示例', '/demo/JEditableTable', 'demo/JeroEditableTableExample', null, null, '1', null, null, '0.20', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-03-22 15:22:18', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:21:32', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('7ac9eb9ccbde2f7a033cd4944272bf1e', '540a2936940846cb98114ffb0d145cb8', '卡片列表', '/list/card', 'demo/list/CardList', null, null, '1', null, null, '7', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('841057b8a1bef8f6b4b20f9a618a7fa6', '1371831353354936322', '数据日志', '/sys/dataLog-list', 'system/DataLogList', null, null, '1', null, null, '2', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-03-11 19:26:49', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:33:07', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('882a73768cfd7f78f3a37584f7299656', '6e73eb3c26099c191bf03852ee1310a1', '个性化设置', '/account/settings/custom', 'account/settings/Custom', null, null, '1', 'CustomSettings', null, null, null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-26 19:00:46', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2018-12-26 21:13:25', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('8b3bff2eee6f1939147f5c68292a1642', '700b7f95165c46cc7a78bf227aa8fed3', '服务器信息', '/monitor/SystemInfo', 'modules/monitor/SystemInfo', null, null, '1', null, null, '4', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-02 11:39:19', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-02 15:40:02', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('8d1ebd663688965f1fd86a2f0ead3416', '700b7f95165c46cc7a78bf227aa8fed3', 'Redis监控', '/monitor/redis/info', 'modules/monitor/RedisInfo', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-02 13:11:33', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-05-07 15:18:54', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('8d4683aacaa997ab86b966b464360338', 'e41b69c57a941a3bbcce45032fe57605', 'Online表单开发', '/online/cgform', 'modules/online/cgform/OnlCgformHeadList', null, null, '1', null, null, '1', '0', null, '1', '0', null, '0', null, 'admin', TO_DATE('2019-03-12 15:48:14', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-06-11 14:19:17', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('8fb8172747a78756c11916216b8b8066', '717f6bee46f44a3897eca9abd6e2ec44', '工作台', '/dashboard/workplace', 'dashboard/Workplace', null, null, '1', null, null, '3', '0', null, '1', '1', null, '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-02 11:45:02', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('944abf0a8fc22fe1f1154a389a574154', '5c8042bd6c601270b2bbd9b20bccc68b', '消息管理', '/modules/message/sysMessageList', 'modules/message/SysMessageList', null, null, '1', null, null, '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-04-09 11:27:53', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 18:01:20', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('9502685863ab87f0ad1134142788a385', null, '首页', '/dashboard/analysis', 'dashboard/Analysis', null, null, '0', null, null, '0', '0', 'home', '1', '1', null, '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-29 11:04:13', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('97c8629abc7848eccdb6d77c24bb3ebb', '700b7f95165c46cc7a78bf227aa8fed3', '磁盘监控', '/monitor/Disk', 'modules/monitor/DiskMonitoring', null, null, '1', null, null, '6', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-25 14:30:06', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-05-05 14:37:14', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('9a90363f216a6a08f32eecb3f0bf12a3', '2a470fc0c3954d9dbb61de6d80846549', 'Jero组件示例', '/demo/SelectDemo', 'demo/SelectDemo', null, null, '1', null, null, '0', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-03-19 11:19:05', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:15:28', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('ae4fed059f67086fd52a73d913cf473d', '540a2936940846cb98114ffb0d145cb8', '内联编辑表格', '/list/edit-table', 'demo/list/TableInnerEditList', null, null, '1', null, null, '2', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('aedbf679b5773c1f25e9f7b10111da73', '08e6b9dc3c04489c8e1ff2ce6f105aa4', 'SQL监控', '{{ window._CONFIG[''domianURL''] }}/druid/', 'layouts/IframePageView', null, null, '1', null, null, '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-01-30 09:43:22', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-09-09 14:48:38', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('b1cb0a3fedf7ed0e4653cb5a229837ee', 'e41b69c57a941a3bbcce45032fe57605', '定时任务', '/isystem/QuartzJobList', 'system/QuartzJobList', null, null, '1', null, null, '10', '0', null, '1', '1', '0', '0', null, null, TO_DATE('2019-01-03 09:38:52', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:42:39', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('b3c824fc22bd953e2eb16ae6914ac8f9', '4875ebe289344e14844d8e3ea1edd73f', '高级详情页', '/profile/advanced', 'demo/profile/advanced/Advanced', null, null, '1', null, null, '2', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('b4dfc7d5dd9e8d5b6dd6d4579b1aa559', 'c65321e57b7949b7a975313220de0422', '500', '/exception/500', 'exception/500', null, null, '1', null, null, '3', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('c431130c0bc0ec71b0a5be37747bb36a', '2a470fc0c3954d9dbb61de6d80846549', '一对多JEditable', '/demo/JeroOrderMainListForJEditableTable', 'demo/JeroOrderMainListForJEditableTable', null, null, '1', null, null, '3', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-03-29 10:51:59', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-04 20:09:39', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('020b06793e4de2eee0007f603000c769', 'f0675b52d89100ee88472b6800754a08', 'ViserChartDemo', '/report/ViserChartDemo', 'demo/report/ViserChartDemo', null, null, '1', null, null, '3', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-03 19:08:53', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-03 19:08:53', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('024f1fd1283dc632458976463d8984e1', '700b7f95165c46cc7a78bf227aa8fed3', 'Tomcat信息', '/monitor/TomcatInfo', 'modules/monitor/TomcatInfo', null, null, '1', null, null, '4', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-02 09:44:29', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-05-07 15:19:10', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('043780fa095ff1b2bec4dc406d76f023', '2a470fc0c3954d9dbb61de6d80846549', '表格合计', '/demo/tableTotal', 'demo/TableTotal', null, null, '1', null, '1', '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-08-14 10:28:46', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', null); +INSERT INTO "SYS_PERMISSION" VALUES ('05b3c82ddb2536a4a5ee1a4c46b5abef', '540a2936940846cb98114ffb0d145cb8', '用户列表', '/list/user-list', 'demo/list/UserList', null, null, '1', null, null, '3', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('0620e402857b8c5b605e1ad9f4b89350', '2a470fc0c3954d9dbb61de6d80846549', '异步树列表Demo', '/demo/jeroTreeTable', 'demo/JeroTreeTable', null, null, '1', null, '0', '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-05-13 17:30:30', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:19:21', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('078f9558cdeab239aecb2bda1a8ed0d1', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(文章)', '/list/search/article', 'demo/list/TableList', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-02-12 14:00:34', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-12 14:17:54', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('08e6b9dc3c04489c8e1ff2ce6f105aa4', null, '系统监控', '/dashboard3', 'layouts/RouteView', null, null, '0', null, null, '16', '0', 'dashboard', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:31:58', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('0ac2ad938963b6c6d1af25477d5b8b51', '8d4683aacaa997ab86b966b464360338', '代码生成按钮', null, null, null, null, '2', 'online:goGenerateCode', '1', '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-06-11 14:20:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', null); +INSERT INTO "SYS_PERMISSION" VALUES ('109c78a583d4693ce2f16551b7786786', 'e41b69c57a941a3bbcce45032fe57605', 'Online报表配置', '/online/cgreport', 'modules/online/cgreport/OnlCgreportHeadList', null, null, '1', null, null, '2', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-03-08 10:51:07', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-30 19:04:28', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('1166535831146504193', '2a470fc0c3954d9dbb61de6d80846549', '文件上传示例', '/oss/file', 'modules/oss/OSSFileList', null, null, '1', null, '1', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-08-28 02:19:50', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 20:48:53', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1371830841603710977', null, '图表/报表示例', '/charts', 'layouts/RouteView', null, null, '0', null, '1', '19', '0', 'line-chart', '1', '0', '0', '0', null, 'admin', TO_DATE('2021-03-16 22:28:55', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:31:24', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1192318987661234177', 'e41b69c57a941a3bbcce45032fe57605', '系统编码规则', '/isystem/fillRule', 'system/SysFillRuleList', null, null, '1', null, '1', '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-11-07 13:52:53', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-07-10 16:55:03', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1205097455226462210', '1371830841603710977', '报表设计', '/big/screen', 'layouts/RouteView', null, null, '1', null, '1', '2', '0', 'area-chart', '1', '0', '0', '0', null, 'admin', TO_DATE('2019-12-12 20:09:58', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:29:22', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1205098241075453953', '1205097455226462210', '生产销售监控', '{{ window._CONFIG[''domianURL''] }}/test/bigScreen/templat/index1', 'layouts/IframePageView', null, null, '1', null, '1', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-12-12 20:13:05', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-12 20:15:27', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '1'); +INSERT INTO "SYS_PERMISSION" VALUES ('1205306106780364802', '1205097455226462210', '智慧物流监控', '{{ window._CONFIG[''domianURL''] }}/test/bigScreen/templat/index2', 'layouts/IframePageView', null, null, '1', null, '1', '2', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-12-13 09:59:04', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-25 09:28:03', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1209731624921534465', 'e41b69c57a941a3bbcce45032fe57605', '多数据源管理', '/isystem/dataSource', 'system/SysDataSourceList', null, null, '1', null, '1', '6', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-12-25 15:04:30', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-02-23 22:43:37', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1224641973866467330', 'e41b69c57a941a3bbcce45032fe57605', '系统校验规则', '/isystem/checkRule', 'system/SysCheckRuleList', null, null, '1', null, '1', '5', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-11-07 13:52:53', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-07-10 16:55:12', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1260928341675982849', '3f915b2769fc80648e92d04e84ca059d', '添加按钮', null, null, null, null, '2', 'user:add', '1', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-05-14 21:41:58', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1260929666434318338', '3f915b2769fc80648e92d04e84ca059d', '用户编辑', null, null, null, null, '2', 'user:edit', '1', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-05-14 21:47:14', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1260931366557696001', '3f915b2769fc80648e92d04e84ca059d', '表单性别可见', null, null, null, null, '2', 'user:sex', '1', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-05-14 21:53:59', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-14 21:57:00', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1260933542969458689', '3f915b2769fc80648e92d04e84ca059d', '禁用生日字段', null, null, null, null, '2', 'user:form:birthday', '2', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-05-14 22:02:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1265162119913824258', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '路由网关', '/isystem/gatewayroute', 'system/SysGatewayRouteList', null, null, '1', null, '1', '0', '0', null, '1', '1', '0', '0', null, null, TO_DATE('2020-05-26 14:05:30', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-09-09 14:47:52', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1280350452934307841', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '租户管理', '/isys/tenant', 'system/TenantList', null, null, '1', null, '1', '10', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-07 11:58:30', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-07-10 15:46:35', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1280464606292099074', '2a470fc0c3954d9dbb61de6d80846549', '图片裁剪', '/demo/ImagCropper', 'demo/ImagCropper', null, null, '1', null, '1', '9', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-07 19:32:06', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1287715272999944193', '2a470fc0c3954d9dbb61de6d80846549', 'JVXETable示例', '/demo/j-vxe-table-demo', 'layouts/RouteView', null, null, '1', null, '1', '0.10', '0', null, '1', '0', '0', '0', null, 'admin', TO_DATE('2020-07-27 19:43:40', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-09-09 14:52:06', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1287715783966834689', '1287715272999944193', '普通示例', '/demo/j-vxe-table-demo/normal', 'demo/JVXETableDemo', null, null, '1', null, '1', '1', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-27 19:45:42', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1287716451494510593', '1287715272999944193', '布局模板', '/demo/j-vxe-table-demo/layout', 'demo/JVxeDemo/layout-demo/Index', null, null, '1', null, '1', '2', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-27 19:48:21', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1287718919049691137', '1287715272999944193', '即时保存', '/demo/j-vxe-table-demo/jsbc', 'demo/JVxeDemo/demo/JSBCDemo', null, null, '1', null, '1', '3', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-27 19:57:36', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-07-27 20:03:37', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1287718938179911682', '1287715272999944193', '弹出子表', '/demo/j-vxe-table-demo/tczb', 'demo/JVxeDemo/demo/PopupSubTable', null, null, '1', null, '1', '4', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-27 19:57:41', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-07-27 20:03:47', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1287718956957810689', '1287715272999944193', '无痕刷新', '/demo/j-vxe-table-demo/whsx', 'demo/JVxeDemo/demo/SocketReload', null, null, '1', null, '1', '5', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-07-27 19:57:44', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-07-27 20:03:57', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('13212d3416eb690c2e1d5033166ff47a', '2e42e3835c2b44ec9f7bc26c146ee531', '失败', '/result/fail', 'result/Error', null, null, '1', null, null, '2', null, null, '1', '1', null, null, null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('1335960713267093506', '1205097455226462210', '积木报表设计', '{{ window._CONFIG[''domianURL''] }}/jmreport/list?token=${token}', 'layouts/IframePageView', null, null, '1', null, '1', '0', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2020-12-07 22:53:50', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-12-08 09:28:06', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '1'); +INSERT INTO "SYS_PERMISSION" VALUES ('1367a93f2c410b169faa7abcbad2f77c', '6e73eb3c26099c191bf03852ee1310a1', '基本设置', '/account/settings/BaseSetting', 'account/settings/BaseSetting', 'account-settings-base', null, '1', 'BaseSettings', null, null, '0', null, '1', '1', null, '1', null, null, TO_DATE('2018-12-26 18:58:35', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-03-20 12:57:31', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('190c2b43bec6a5f7a4194a85db67d96a', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '角色管理', '/isystem/roleUserList', 'system/RoleUserList', null, null, '1', 'sys:role:list', null, '1.20', '0', null, '1', '0', '0', '0', null, 'admin', TO_DATE('2019-04-17 15:13:56', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-12-25 09:36:31', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('1a0811914300741f4e11838ff37a1d3a', '3f915b2769fc80648e92d04e84ca059d', '手机号禁用', null, null, null, null, '2', 'user:form:phone', '2', '1', '0', null, '0', '1', null, '0', null, 'admin', TO_DATE('2019-05-11 17:19:30', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-05-11 18:00:22', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', '1', null); +INSERT INTO "SYS_PERMISSION" VALUES ('200006f0edf145a2b50eacca07585451', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(应用)', '/list/search/application', 'demo/list/TableList', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-02-12 14:02:51', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-12 14:14:01', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('265de841c58907954b8877fb85212622', '2a470fc0c3954d9dbb61de6d80846549', '图片拖拽排序', '/demo/imgDragSort', 'demo/ImgDragSort', null, null, '1', null, null, '4', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-25 10:43:08', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-04-25 10:46:26', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('277bfabef7d76e89b33062b16a9a5020', 'e3c13679c73a4f829bcff2aba8fd68b1', '基础表单', '/form/base-form', 'demo/form/BasicForm', null, null, '1', null, null, '1', '0', null, '1', '0', null, '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-02-26 17:02:08', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('2a470fc0c3954d9dbb61de6d80846549', null, '开发示例Demo', '/jero', 'layouts/RouteView', null, null, '0', null, null, '20', '0', 'qrcode', '1', '0', '0', '0', null, null, TO_DATE('2018-12-25 20:34:38', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:31:20', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); +INSERT INTO "SYS_PERMISSION" VALUES ('2aeddae571695cd6380f6d6d334d6e7d', 'f0675b52d89100ee88472b6800754a08', '布局统计报表', '/report/ArchivesStatisticst', 'demo/report/ArchivesStatisticst', null, null, '1', null, null, '1', '0', null, '1', '1', null, '0', null, 'admin', TO_DATE('2019-04-03 18:32:48', 'YYYY-MM-DD HH24:MI:SS'), null, null, '0', '0', null, null); +INSERT INTO "SYS_PERMISSION" VALUES ('2dbbafa22cda07fa5d169d741b81fe12', 'e41b69c57a941a3bbcce45032fe57605', '在线文档', '{{ window._CONFIG[''domianURL''] }}/doc.html', 'layouts/IframePageView', null, null, '1', null, null, '8', '0', null, '1', '1', '0', '0', null, 'admin', TO_DATE('2019-01-30 10:00:01', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 22:33:43', 'YYYY-MM-DD HH24:MI:SS'), '0', '0', null, '0'); + +INSERT INTO "SYS_PERMISSION" VALUES ('1383952003393466369', '190c2b43bec6a5f7a4194a85db67d96a', '角色添加', NULL, NULL, NULL, NULL, 2, 'sys:role:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383952499906785282', '190c2b43bec6a5f7a4194a85db67d96a', '角色编辑', NULL, NULL, NULL, NULL, 2, 'sys:role:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383952680177971201', '190c2b43bec6a5f7a4194a85db67d96a', '角色删除', NULL, NULL, NULL, NULL, 2, 'sys:role:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383952988471898113', '45c966826eeff4c99b8f8ebfe74511fc', '部门添加', NULL, NULL, NULL, NULL, 2, 'sys:depart:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383953084483710977', '45c966826eeff4c99b8f8ebfe74511fc', '部门编辑', NULL, NULL, NULL, NULL, 2, 'sys:depart:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383953171704262657', '45c966826eeff4c99b8f8ebfe74511fc', '部门删除', NULL, NULL, NULL, NULL, 2, 'sys:depart:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383953340499832833', 'f1cb187abf927c88b89470d08615f5ac', '数据字典添加', NULL, NULL, NULL, NULL, 2, 'sys:dict:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383953594972450818', 'f1cb187abf927c88b89470d08615f5ac', '数据字典编辑', NULL, NULL, NULL, NULL, 2, 'sys:dict:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383953732851806210', 'f1cb187abf927c88b89470d08615f5ac', '数据字典删除', NULL, NULL, NULL, NULL, 2, 'sys:dict:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383953875781103617', 'ebb9d82ea16ad864071158e0c449d186', '分类字典添加', NULL, NULL, NULL, NULL, 2, 'sys:category:add', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383954065124569090', 'ebb9d82ea16ad864071158e0c449d186', '分类字典编辑', NULL, NULL, NULL, NULL, 2, 'sys:category:edit', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383954151342682114', 'ebb9d82ea16ad864071158e0c449d186', '分类字典删除', NULL, NULL, NULL, NULL, 2, 'sys:category:del', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383956546739056641', '3f915b2769fc80648e92d04e84ca059d', '用户删除', NULL, NULL, NULL, NULL, 2, 'sys:user:sel', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383956678637334529', '3f915b2769fc80648e92d04e84ca059d', '用户导入', NULL, NULL, NULL, NULL, 2, 'sys:user:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383956779212550146', '3f915b2769fc80648e92d04e84ca059d', '用户导出', NULL, NULL, NULL, NULL, 2, 'sys:user:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383956904978755586', '190c2b43bec6a5f7a4194a85db67d96a', '角色导入', NULL, NULL, NULL, NULL, 2, 'sys:role:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957016807288833', '190c2b43bec6a5f7a4194a85db67d96a', '角色导出', NULL, NULL, NULL, NULL, 2, 'sys:role:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957130082856962', '45c966826eeff4c99b8f8ebfe74511fc', '部门导入', NULL, NULL, NULL, NULL, 2, 'sys:depart:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957217370517506', '45c966826eeff4c99b8f8ebfe74511fc', '部门导出', NULL, NULL, NULL, NULL, 2, 'sys:depart:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957378981244930', 'f1cb187abf927c88b89470d08615f5ac', '数据字典导入', NULL, NULL, NULL, NULL, 2, 'sys:dict:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957508945948674', 'f1cb187abf927c88b89470d08615f5ac', '数据字典导出', NULL, NULL, NULL, NULL, 2, 'sys:dict:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957660913971202', 'ebb9d82ea16ad864071158e0c449d186', '分类字典导入', NULL, NULL, NULL, NULL, 2, 'sys:category:import', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), NULL, NULL, 0, 0, '1', 0); +INSERT INTO "SYS_PERMISSION" VALUES ('1383957793466560514', 'ebb9d82ea16ad864071158e0c449d186', '分类字典导出', NULL, NULL, NULL, NULL, 2, 'sys:category:export', '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', TO_DATE('2021-04-19 09:14:05', 'YYYY-MM-DD HH24:MI:SS'), 'admin', '2021-04-19 10:04:58', 0, 0, '1', 0); + + +-- ---------------------------- +-- Table structure for SYS_PERMISSION_DATA_RULE +-- ---------------------------- +DROP TABLE "SYS_PERMISSION_DATA_RULE"; +CREATE TABLE "SYS_PERMISSION_DATA_RULE" ( +"ID" NVARCHAR2(32) NOT NULL , +"PERMISSION_ID" NVARCHAR2(32) NULL , +"RULE_NAME" NVARCHAR2(50) NULL , +"RULE_COLUMN" NVARCHAR2(50) NULL , +"RULE_CONDITIONS" NVARCHAR2(50) NULL , +"RULE_VALUE" NVARCHAR2(300) NULL , +"STATUS" NVARCHAR2(3) NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."ID" IS 'ID'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."PERMISSION_ID" IS '菜单ID'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."RULE_NAME" IS '规则名称'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."RULE_COLUMN" IS '字段'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."RULE_CONDITIONS" IS '条件'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."RULE_VALUE" IS '规则值'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."STATUS" IS '权限有效状态1有0否'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SYS_PERMISSION_DATA_RULE"."UPDATE_BY" IS '修改人'; + +-- ---------------------------- +-- Records of SYS_PERMISSION_DATA_RULE +-- ---------------------------- +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('1260935285157511170', '4148ec82b6acd69f470bea75fe41c357', 'createBy', 'createBy', '=', '#{sys_user_code}', '0', TO_DATE('2020-05-14 22:09:34', 'YYYY-MM-DD HH24:MI:SS'), 'jero', TO_DATE('2020-05-14 22:13:52', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('1260936345293012993', '4148ec82b6acd69f470bea75fe41c357', '年龄', 'age', '>', '20', '1', TO_DATE('2020-05-14 22:13:46', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('1260937192290762754', '4148ec82b6acd69f470bea75fe41c357', 'sysOrgCode', 'sysOrgCode', 'RIGHT_LIKE', '#{sys_org_code}', '1', TO_DATE('2020-05-14 22:17:08', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('32b62cb04d6c788d9d92e3ff5e66854e', '8d4683aacaa997ab86b966b464360338', '000', '00', '!=', '00', '1', TO_DATE('2019-04-02 18:36:08', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('40283181614231d401614234fe670003', '40283181614231d401614232cd1c0001', 'createBy', 'createBy', '=', '#{sys_user_code}', '1', TO_DATE('2018-01-29 21:57:04', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('4028318161424e730161424fca6f0004', '4028318161424e730161424f61510002', 'createBy', 'createBy', '=', '#{sys_user_code}', '1', TO_DATE('2018-01-29 22:26:20', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402880e6487e661a01487e732c020005', '402889fb486e848101486e93a7c80014', 'SYS_ORG_CODE', 'SYS_ORG_CODE', 'LIKE', '010201%', '1', TO_DATE('2014-09-16 20:32:30', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402880e6487e661a01487e8153ee0007', '402889fb486e848101486e93a7c80014', 'create_by', 'create_by', null, '#{SYS_USER_CODE}', '1', TO_DATE('2014-09-16 20:47:57', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402880ec5ddec439015ddf9225060038', '40288088481d019401481d2fcebf000d', '复杂关系', null, 'USE_SQL_RULES', 'name like ''%张%'' or age > 10', '1', null, null, TO_DATE('2017-08-14 15:10:25', 'YYYY-MM-DD HH24:MI:SS'), 'demo'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402880ec5ddfdd26015ddfe3e0570011', '4028ab775dca0d1b015dca3fccb60016', '复杂sql配置', null, 'USE_SQL_RULES', 'table_name like ''%test%'' or is_tree = ''Y''', '1', null, null, TO_DATE('2017-08-14 16:38:55', 'YYYY-MM-DD HH24:MI:SS'), 'demo'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402880f25b1e2ac7015b1e5fdebc0012', '402880f25b1e2ac7015b1e5cdc340010', '只能看自己数据', 'create_by', '=', '#{sys_user_code}', '1', TO_DATE('2017-03-30 16:40:51', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881875b19f141015b19f8125e0014', '40288088481d019401481d2fcebf000d', '可看下属业务数据', 'sys_org_code', 'LIKE', '#{sys_org_code}', '1', null, null, TO_DATE('2017-08-14 15:04:32', 'YYYY-MM-DD HH24:MI:SS'), 'demo'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881e45394d66901539500a4450001', '402881e54df73c73014df75ab670000f', 'sysCompanyCode', 'sysCompanyCode', '=', '#{SYS_COMPANY_CODE}', '1', TO_DATE('2016-03-21 01:09:21', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881e45394d6690153950177cb0003', '402881e54df73c73014df75ab670000f', 'sysOrgCode', 'sysOrgCode', '=', '#{SYS_ORG_CODE}', '1', TO_DATE('2016-03-21 01:10:15', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881e56266f43101626727aff60067', '402881e56266f43101626724eb730065', '销售自己看自己的数据', 'createBy', '=', '#{sys_user_code}', '1', TO_DATE('2018-03-27 19:11:16', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881e56266f4310162672fb1a70082', '402881e56266f43101626724eb730065', '销售经理看所有下级数据', 'sysOrgCode', 'LIKE', '#{sys_org_code}', '1', TO_DATE('2018-03-27 19:20:01', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881e56266f431016267387c9f0088', '402881e56266f43101626724eb730065', '只看金额大于1000的数据', 'money', '>=', '1000', '1', TO_DATE('2018-03-27 19:29:37', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402881f3650de25101650dfb5a3a0010', '402881e56266f4310162671d62050044', '22', null, 'USE_SQL_RULES', '22', '1', TO_DATE('2018-08-06 14:45:01', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402889fb486e848101486e913cd6000b', '402889fb486e848101486e8e2e8b0007', 'userName', 'userName', '=', 'admin', '1', TO_DATE('2014-09-13 18:31:25', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402889fb486e848101486e98d20d0016', '402889fb486e848101486e93a7c80014', 'title', 'title', '=', '12', '1', null, null, TO_DATE('2014-09-13 22:18:22', 'YYYY-MM-DD HH24:MI:SS'), 'scott'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('402889fe47fcb29c0147fcb6b6220001', '8a8ab0b246dc81120146dc8180fe002b', '12', '12', '>', '12', '1', TO_DATE('2014-08-22 15:55:38', 'YYYY-MM-DD HH24:MI:SS'), '8a8ab0b246dc81120146dc8181950052', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('4028ab775dca0d1b015dca4183530018', '4028ab775dca0d1b015dca3fccb60016', '表名限制', 'isDbSynch', '=', 'Y', '1', null, null, TO_DATE('2017-08-14 16:43:45', 'YYYY-MM-DD HH24:MI:SS'), 'demo'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('4028ef815595a881015595b0ccb60001', '40288088481d019401481d2fcebf000d', '限只能看自己', 'create_by', '=', '#{sys_user_code}', '1', null, null, TO_DATE('2017-08-14 15:03:56', 'YYYY-MM-DD HH24:MI:SS'), 'demo'); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('4028ef81574ae99701574aed26530005', '4028ef81574ae99701574aeb97bd0003', '用户名', 'userName', '!=', 'admin', '1', TO_DATE('2016-09-21 12:07:18', 'YYYY-MM-DD HH24:MI:SS'), 'admin', null, null); +INSERT INTO "SYS_PERMISSION_DATA_RULE" VALUES ('f852d85d47f224990147f2284c0c0005', null, '小于', 'test', '<=', '11', '1', TO_DATE('2014-08-20 14:43:52', 'YYYY-MM-DD HH24:MI:SS'), '8a8ab0b246dc81120146dc8181950052', null, null); + +-- ---------------------------- +-- Table structure for SYS_QUARTZ_JOB +-- ---------------------------- +DROP TABLE "SYS_QUARTZ_JOB"; +CREATE TABLE "SYS_QUARTZ_JOB" ( +"ID" NVARCHAR2(32) NOT NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"DEL_FLAG" NUMBER(11) NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"JOB_CLASS_NAME" NVARCHAR2(255) NULL , +"CRON_EXPRESSION" NVARCHAR2(255) NULL , +"PARAMETER" NVARCHAR2(255) NULL , +"DESCRIPTION" NVARCHAR2(255) NULL , +"STATUS" NUMBER(11) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."DEL_FLAG" IS '删除状态'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."UPDATE_BY" IS '修改人'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."JOB_CLASS_NAME" IS '任务类名'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."CRON_EXPRESSION" IS 'cron表达式'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."PARAMETER" IS '参数'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_QUARTZ_JOB"."STATUS" IS '状态 0正常 -1停止'; + +-- ---------------------------- +-- Records of SYS_QUARTZ_JOB +-- ---------------------------- +INSERT INTO "SYS_QUARTZ_JOB" VALUES ('df26ecacf0f75d219d746750fe84bbee', null, null, '0', 'admin', TO_DATE('2020-05-02 15:40:35', 'YYYY-MM-DD HH24:MI:SS'), 'com.jero.modules.quartz.job.SampleParamJob', '0/1 * * * * ?', 'scott', 'Demo-带参测试,后台将每隔1秒执行输出日志', '-1'); +INSERT INTO "SYS_QUARTZ_JOB" VALUES ('a253cdfc811d69fa0efc70d052bc8128', 'admin', TO_DATE('2019-03-30 12:44:48', 'YYYY-MM-DD HH24:MI:SS'), '0', 'admin', TO_DATE('2020-05-02 15:48:49', 'YYYY-MM-DD HH24:MI:SS'), 'com.jero.modules.quartz.job.SampleJob', '0/1 * * * * ?', null, 'Demo', '-1'); + +-- ---------------------------- +-- Table structure for SYS_ROLE +-- ---------------------------- +DROP TABLE "SYS_ROLE"; +CREATE TABLE "SYS_ROLE" ( +"ID" NVARCHAR2(32) NOT NULL , +"ROLE_NAME" NVARCHAR2(200) NULL , +"ROLE_CODE" NVARCHAR2(100) NOT NULL , +"DESCRIPTION" NVARCHAR2(255) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_ROLE" IS '角色表'; +COMMENT ON COLUMN "SYS_ROLE"."ID" IS '主键id'; +COMMENT ON COLUMN "SYS_ROLE"."ROLE_NAME" IS '角色名称'; +COMMENT ON COLUMN "SYS_ROLE"."ROLE_CODE" IS '角色编码'; +COMMENT ON COLUMN "SYS_ROLE"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYS_ROLE"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_ROLE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_ROLE"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_ROLE"."UPDATE_TIME" IS '更新时间'; + +-- ---------------------------- +-- Records of SYS_ROLE +-- ---------------------------- +INSERT INTO "SYS_ROLE" VALUES ('f6817f48af4fb3af11b9e8bf182f618b', '开发管理员', 'admin', '开发人员使用的最高管理员', null, TO_DATE('2018-12-21 18:03:39', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 13:55:05', 'YYYY-MM-DD HH24:MI:SS')); + +-- ---------------------------- +-- Table structure for SYS_ROLE_PERMISSION +-- ---------------------------- +DROP TABLE "SYS_ROLE_PERMISSION"; +CREATE TABLE "SYS_ROLE_PERMISSION" ( +"ID" NVARCHAR2(32) NOT NULL , +"ROLE_ID" NVARCHAR2(32) NULL , +"PERMISSION_ID" NVARCHAR2(32) NULL , +"DATA_RULE_IDS" NVARCHAR2(1000) NULL , +"OPERATE_DATE" DATE NULL , +"OPERATE_IP" NVARCHAR2(20) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_ROLE_PERMISSION" IS '角色权限表'; +COMMENT ON COLUMN "SYS_ROLE_PERMISSION"."ROLE_ID" IS '角色id'; +COMMENT ON COLUMN "SYS_ROLE_PERMISSION"."PERMISSION_ID" IS '权限id'; +COMMENT ON COLUMN "SYS_ROLE_PERMISSION"."DATA_RULE_IDS" IS '数据权限ids'; +COMMENT ON COLUMN "SYS_ROLE_PERMISSION"."OPERATE_DATE" IS '操作时间'; +COMMENT ON COLUMN "SYS_ROLE_PERMISSION"."OPERATE_IP" IS '操作ip'; + +-- ---------------------------- +-- Records of SYS_ROLE_PERMISSION +-- ---------------------------- +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624661061633', 'f6817f48af4fb3af11b9e8bf182f618b', '1371831353354936322', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624677838849', 'f6817f48af4fb3af11b9e8bf182f618b', '1260929666434318338', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624677838850', 'f6817f48af4fb3af11b9e8bf182f618b', '1260931366557696001', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624677838851', 'f6817f48af4fb3af11b9e8bf182f618b', '1260933542969458689', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624677838852', 'f6817f48af4fb3af11b9e8bf182f618b', '1a0811914300741f4e11838ff37a1d3a', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624677838853', 'f6817f48af4fb3af11b9e8bf182f618b', '1371830841603710977', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1371832624686227457', 'f6817f48af4fb3af11b9e8bf182f618b', '277bfabef7d76e89b33062b16a9a5020', null, TO_DATE('2021-03-16 22:36:00', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('38a2e55db0960262800576e34b3af44c', 'f6817f48af4fb3af11b9e8bf182f618b', '5c2f42277948043026b7a14692456828', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('3b1886f727ac503c93fecdd06dcb9622', 'f6817f48af4fb3af11b9e8bf182f618b', 'c431130c0bc0ec71b0a5be37747bb36a', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('3de2a60c7e42a521fecf6fcc5cb54978', 'f6817f48af4fb3af11b9e8bf182f618b', '2d83d62bd2544b8994c8f38cf17b0ddf', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('3e4e38f748b8d87178dd62082e5b7b60', 'f6817f48af4fb3af11b9e8bf182f618b', '7960961b0063228937da5fa8dd73d371', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('3f1d04075e3c3254666a4138106a4e51', 'f6817f48af4fb3af11b9e8bf182f618b', '3fac0d3c9cd40fa53ab70d4c583821f8', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('4204f91fb61911ba8ce40afa7c02369f', 'f6817f48af4fb3af11b9e8bf182f618b', '3f915b2769fc80648e92d04e84ca059d', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('444126230885d5d38b8fa6072c9f43f8', 'f6817f48af4fb3af11b9e8bf182f618b', 'f780d0d3083d849ccbdb1b1baee4911d', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('445656dd187bd8a71605f4bbab1938a3', 'f6817f48af4fb3af11b9e8bf182f618b', '020b06793e4de2eee0007f603000c769', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('455cdb482457f529b79b479a2ff74427', 'f6817f48af4fb3af11b9e8bf182f618b', 'e1979bb53e9ea51cecc74d86fd9d2f64', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('45a358bb738782d1a0edbf7485e81459', 'f6817f48af4fb3af11b9e8bf182f618b', '0ac2ad938963b6c6d1af25477d5b8b51', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('4dab5a06acc8ef3297889872caa74747', 'f6817f48af4fb3af11b9e8bf182f618b', 'ffb423d25cc59dcd0532213c4a518261', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('4e0a37ed49524df5f08fc6593aee875c', 'f6817f48af4fb3af11b9e8bf182f618b', 'f23d9bfff4d9aa6b68569ba2cff38415', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('4ea403fc1d19feb871c8bdd9f94a4ecc', 'f6817f48af4fb3af11b9e8bf182f618b', '2e42e3835c2b44ec9f7bc26c146ee531', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('4f254549d9498f06f4cc9b23f3e2c070', 'f6817f48af4fb3af11b9e8bf182f618b', '93d5cfb4448f11e9916698e7f462b4b6', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('504e326de3f03562cdd186748b48a8c7', 'f6817f48af4fb3af11b9e8bf182f618b', '027aee69baee98a0ed2e01806e89c891', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('520b5989e6fe4a302a573d4fee12a40a', 'f6817f48af4fb3af11b9e8bf182f618b', '6531cf3421b1265aeeeabaab5e176e6d', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('54fdf85e52807bdb32ce450814abc256', 'f6817f48af4fb3af11b9e8bf182f618b', 'cc50656cf9ca528e6f2150eba4714ad2', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('5d230e6cd2935c4117f6cb9a7a749e39', 'f6817f48af4fb3af11b9e8bf182f618b', 'fc810a2267dd183e4ef7c71cc60f4670', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('5de6871fadb4fe1cdd28989da0126b07', 'f6817f48af4fb3af11b9e8bf182f618b', 'a400e4f4d54f79bf5ce160a3432231af', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('5e4015a9a641cbf3fb5d28d9f885d81a', 'f6817f48af4fb3af11b9e8bf182f618b', '2dbbafa22cda07fa5d169d741b81fe12', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('60eda4b4db138bdb47edbe8e10e71675', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb07ca05a3e13674dbf6d3245956da2e', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('61835e48f3e675f7d3f5c9dd3a10dcf3', 'f6817f48af4fb3af11b9e8bf182f618b', 'f0675b52d89100ee88472b6800754a08', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('660fbc40bcb1044738f7cabdf1708c28', 'f6817f48af4fb3af11b9e8bf182f618b', 'b3c824fc22bd953e2eb16ae6914ac8f9', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('66b202f8f84fe766176b3f51071836ef', 'f6817f48af4fb3af11b9e8bf182f618b', '1367a93f2c410b169faa7abcbad2f77c', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('6c74518eb6bb9a353f6a6c459c77e64b', 'f6817f48af4fb3af11b9e8bf182f618b', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('6daddafacd7eccb91309530c17c5855d', 'f6817f48af4fb3af11b9e8bf182f618b', 'edfa74d66e8ea63ea432c2910837b150', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('6fb4c2142498dd6d5b6c014ef985cb66', 'f6817f48af4fb3af11b9e8bf182f618b', '6e73eb3c26099c191bf03852ee1310a1', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('7413acf23b56c906aedb5a36fb75bd3a', 'f6817f48af4fb3af11b9e8bf182f618b', 'a4fc7b64b01a224da066bb16230f9c5a', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('76a54a8cc609754360bf9f57e7dbb2db', 'f6817f48af4fb3af11b9e8bf182f618b', 'c65321e57b7949b7a975313220de0422', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('00b82058779cca5106fbb84783534c9b', 'f6817f48af4fb3af11b9e8bf182f618b', '4148ec82b6acd69f470bea75fe41c357', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('0254c0b25694ad5479e6d6935bbc176e', 'f6817f48af4fb3af11b9e8bf182f618b', '944abf0a8fc22fe1f1154a389a574154', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('09bd4fc30ffe88c4a44ed3868f442719', 'f6817f48af4fb3af11b9e8bf182f618b', 'e6bfd1fcabfd7942fdd05f076d1dad38', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('0c2d2db76ee3aa81a4fe0925b0f31365', 'f6817f48af4fb3af11b9e8bf182f618b', '024f1fd1283dc632458976463d8984e1', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('0c6b8facbb1cc874964c87a8cf01e4b1', 'f6817f48af4fb3af11b9e8bf182f618b', '841057b8a1bef8f6b4b20f9a618a7fa6', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('0c6e1075e422972083c3e854d9af7851', 'f6817f48af4fb3af11b9e8bf182f618b', '08e6b9dc3c04489c8e1ff2ce6f105aa4', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('0e1469997af2d3b97fff56a59ee29eeb', 'f6817f48af4fb3af11b9e8bf182f618b', 'e41b69c57a941a3bbcce45032fe57605', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('0f861cb988fdc639bb1ab943471f3a72', 'f6817f48af4fb3af11b9e8bf182f618b', '97c8629abc7848eccdb6d77c24bb3ebb', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1185039870537576450', 'f6817f48af4fb3af11b9e8bf182f618b', '1166535831146504193', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1197431682208206850', 'f6817f48af4fb3af11b9e8bf182f618b', '1192318987661234177', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1197795315916271617', 'f6817f48af4fb3af11b9e8bf182f618b', '109c78a583d4693ce2f16551b7786786', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1209423530518761473', 'f6817f48af4fb3af11b9e8bf182f618b', '1205097455226462210', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1209423530594258945', 'f6817f48af4fb3af11b9e8bf182f618b', '1205098241075453953', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1209423530606841858', 'f6817f48af4fb3af11b9e8bf182f618b', '1205306106780364802', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1209423580355481602', 'f6817f48af4fb3af11b9e8bf182f618b', '190c2b43bec6a5f7a4194a85db67d96a', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1231590078632955905', 'f6817f48af4fb3af11b9e8bf182f618b', '1224641973866467330', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1231590078658121729', 'f6817f48af4fb3af11b9e8bf182f618b', '1209731624921534465', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1260928399955836929', 'f6817f48af4fb3af11b9e8bf182f618b', '1260928341675982849', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1269526122208522241', 'f6817f48af4fb3af11b9e8bf182f618b', '1267412134208319489', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('126ea9faebeec2b914d6d9bef957afb6', 'f6817f48af4fb3af11b9e8bf182f618b', 'f1cb187abf927c88b89470d08615f5ac', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1281494164924653569', 'f6817f48af4fb3af11b9e8bf182f618b', '1280350452934307841', null, TO_DATE('2020-07-10 15:43:13', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1281494164945625089', 'f6817f48af4fb3af11b9e8bf182f618b', '1280464606292099074', null, TO_DATE('2020-07-10 15:43:13', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1281494684632473602', 'f6817f48af4fb3af11b9e8bf182f618b', '1265162119913824258', null, TO_DATE('2020-07-10 15:45:16', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1303585080082485250', 'f6817f48af4fb3af11b9e8bf182f618b', '1287715272999944193', null, TO_DATE('2020-09-09 14:44:37', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1303585080103456769', 'f6817f48af4fb3af11b9e8bf182f618b', '1287715783966834689', null, TO_DATE('2020-09-09 14:44:37', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1303585080116039682', 'f6817f48af4fb3af11b9e8bf182f618b', '1287716451494510593', null, TO_DATE('2020-09-09 14:44:37', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1303585080124428290', 'f6817f48af4fb3af11b9e8bf182f618b', '1287718919049691137', null, TO_DATE('2020-09-09 14:44:37', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1303585080128622593', 'f6817f48af4fb3af11b9e8bf182f618b', '1287718938179911682', null, TO_DATE('2020-09-09 14:44:37', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1303585080141205506', 'f6817f48af4fb3af11b9e8bf182f618b', '1287718956957810689', null, TO_DATE('2020-09-09 14:44:37', 'YYYY-MM-DD HH24:MI:SS'), '127.0.0.1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1335960787783098369', 'f6817f48af4fb3af11b9e8bf182f618b', '1335960713267093506', null, TO_DATE('2020-12-07 22:54:07', 'YYYY-MM-DD HH24:MI:SS'), '0:0:0:0:0:0:0:1'); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('154edd0599bd1dc2c7de220b489cd1e2', 'f6817f48af4fb3af11b9e8bf182f618b', '7ac9eb9ccbde2f7a033cd4944272bf1e', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('165acd6046a0eaf975099f46a3c898ea', 'f6817f48af4fb3af11b9e8bf182f618b', '4f66409ef3bbd69c1d80469d6e2a885e', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1664b92dff13e1575e3a929caa2fa14d', 'f6817f48af4fb3af11b9e8bf182f618b', 'd2bbf9ebca5a8fa2e227af97d2da7548', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1c1dbba68ef1817e7fb19c822d2854e8', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb367426764077dcf94640c843733985', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('1e47db875601fd97723254046b5bba90', 'f6817f48af4fb3af11b9e8bf182f618b', 'baf16b7174bd821b6bab23fa9abb200d', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('20e53c87a785688bdc0a5bb6de394ef1', 'f6817f48af4fb3af11b9e8bf182f618b', '540a2936940846cb98114ffb0d145cb8', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('25491ecbd5a9b34f09c8bc447a10ede1', 'f6817f48af4fb3af11b9e8bf182f618b', 'd07a2c87a451434c99ab06296727ec4f', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('2779cdea8367fff37db26a42c1a1f531', 'f6817f48af4fb3af11b9e8bf182f618b', 'fef097f3903caf3a3c3a6efa8de43fbb', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('29fb6b0ad59a7e911c8d27e0bdc42d23', 'f6817f48af4fb3af11b9e8bf182f618b', '9a90363f216a6a08f32eecb3f0bf12a3', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('2ad37346c1b83ddeebc008f6987b2227', 'f6817f48af4fb3af11b9e8bf182f618b', '8d1ebd663688965f1fd86a2f0ead3416', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('e7467726ee72235baaeb47df04a35e73', 'f6817f48af4fb3af11b9e8bf182f618b', 'e08cb190ef230d5d4f03824198773950', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('eaef4486f1c9b0408580bbfa2037eb66', 'f6817f48af4fb3af11b9e8bf182f618b', '2a470fc0c3954d9dbb61de6d80846549', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('ec4bc97829ab56afd83f428b6dc37ff6', 'f6817f48af4fb3af11b9e8bf182f618b', '200006f0edf145a2b50eacca07585451', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('ec846a3f85fdb6813e515be71f11b331', 'f6817f48af4fb3af11b9e8bf182f618b', '732d48f8e0abe99fe6a23d18a3171cd1', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('ec93bb06f5be4c1f19522ca78180e2ef', 'f6817f48af4fb3af11b9e8bf182f618b', '265de841c58907954b8877fb85212622', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('ecdd72fe694e6bba9c1d9fc925ee79de', 'f6817f48af4fb3af11b9e8bf182f618b', '45c966826eeff4c99b8f8ebfe74511fc', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('edefd8d468f5727db465cf1b860af474', 'f6817f48af4fb3af11b9e8bf182f618b', '6ad53fd1b220989a8b71ff482d683a5a', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('ef8bdd20d29447681ec91d3603e80c7b', 'f6817f48af4fb3af11b9e8bf182f618b', 'ae4fed059f67086fd52a73d913cf473d', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('f177acac0276329dc66af0c9ad30558a', 'f6817f48af4fb3af11b9e8bf182f618b', 'c2c356bf4ddd29975347a7047a062440', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('f99f99cc3bc27220cdd4f5aced33b7d7', 'f6817f48af4fb3af11b9e8bf182f618b', '655563cd64b75dcf52ef7bcdd4836953', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('fafe73c4448b977fe42880a6750c3ee8', 'f6817f48af4fb3af11b9e8bf182f618b', '9cb91b8851db0cf7b19d7ecc2a8193dd', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('fced905c7598973b970d42d833f73474', 'f6817f48af4fb3af11b9e8bf182f618b', '4875ebe289344e14844d8e3ea1edd73f', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('fd97963dc5f144d3aecfc7045a883427', 'f6817f48af4fb3af11b9e8bf182f618b', '043780fa095ff1b2bec4dc406d76f023', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('7ca833caa5eac837b7200d8b6de8b2e3', 'f6817f48af4fb3af11b9e8bf182f618b', 'fedfbf4420536cacc0218557d263dfea', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('84eac2f113c23737128fb099d1d1da89', 'f6817f48af4fb3af11b9e8bf182f618b', '03dc3d93261dda19fc86dd7ca486c6cf', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('86060e2867a5049d8a80d9fe5d8bc28b', 'f6817f48af4fb3af11b9e8bf182f618b', '765dd244f37b804e3d00f475fd56149b', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('884f147c20e003cc80ed5b7efa598cbe', 'f6817f48af4fb3af11b9e8bf182f618b', 'e5973686ed495c379d829ea8b2881fc6', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('cf43895aef7fc684669483ab00ef2257', 'f6817f48af4fb3af11b9e8bf182f618b', '700b7f95165c46cc7a78bf227aa8fed3', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('8b09925bdc194ab7f3559cd3a7ea0507', 'f6817f48af4fb3af11b9e8bf182f618b', 'ebb9d82ea16ad864071158e0c449d186', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('8d154c2382a8ae5c8d1b84bd38df2a93', 'f6817f48af4fb3af11b9e8bf182f618b', 'd86f58e7ab516d3bc6bfb1fe10585f97', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('8dd64f65a1014196078d0882f767cd85', 'f6817f48af4fb3af11b9e8bf182f618b', 'e3c13679c73a4f829bcff2aba8fd68b1', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('8e3dc1671abad4f3c83883b194d2e05a', 'f6817f48af4fb3af11b9e8bf182f618b', 'b1cb0a3fedf7ed0e4653cb5a229837ee', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('905bf419332ebcb83863603b3ebe30f0', 'f6817f48af4fb3af11b9e8bf182f618b', '8fb8172747a78756c11916216b8b8066', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('9380121ca9cfee4b372194630fce150e', 'f6817f48af4fb3af11b9e8bf182f618b', '65a8f489f25a345836b7f44b1181197a', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('94911fef73a590f6824105ebf9b6cab3', 'f6817f48af4fb3af11b9e8bf182f618b', '8b3bff2eee6f1939147f5c68292a1642', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('9700d20dbc1ae3cbf7de1c810b521fe6', 'f6817f48af4fb3af11b9e8bf182f618b', 'ec8d607d0156e198b11853760319c646', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('980171fda43adfe24840959b1d048d4d', 'f6817f48af4fb3af11b9e8bf182f618b', 'd7d6e2e4e2934f2c9385a623fd98c6f3', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('987c23b70873bd1d6dca52f30aafd8c2', 'f6817f48af4fb3af11b9e8bf182f618b', '00a2a0ae65cdca5e93209cdbde97cbe6', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('9b2ad767f9861e64a20b097538feafd3', 'f6817f48af4fb3af11b9e8bf182f618b', '73678f9daa45ed17a3674131b03432fb', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('9d980ec0489040e631a9c24a6af42934', 'f6817f48af4fb3af11b9e8bf182f618b', '05b3c82ddb2536a4a5ee1a4c46b5abef', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('a034ed7c38c996b880d3e78f586fe0ae', 'f6817f48af4fb3af11b9e8bf182f618b', 'c89018ea6286e852b424466fd92a2ffc', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('a307a9349ad64a2eff8ab69582fa9be4', 'f6817f48af4fb3af11b9e8bf182f618b', '0620e402857b8c5b605e1ad9f4b89350', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('a5d25fdb3c62904a8474182706ce11a0', 'f6817f48af4fb3af11b9e8bf182f618b', '418964ba087b90a84897b62474496b93', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('acacce4417e5d7f96a9c3be2ded5b4be', 'f6817f48af4fb3af11b9e8bf182f618b', 'f9d3f4f27653a71c52faa9fb8070fbe7', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('ae1852fb349d8513eb3fdc173da3ee56', 'f6817f48af4fb3af11b9e8bf182f618b', '8d4683aacaa997ab86b966b464360338', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('af60ac8fafd807ed6b6b354613b9ccbc', 'f6817f48af4fb3af11b9e8bf182f618b', '58857ff846e61794c69208e9d3a85466', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('b0c8a20800b8bf1ebdd7be473bceb44f', 'f6817f48af4fb3af11b9e8bf182f618b', '58b9204feaf07e47284ddb36cd2d8468', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('b128ebe78fa5abb54a3a82c6689bdca3', 'f6817f48af4fb3af11b9e8bf182f618b', 'aedbf679b5773c1f25e9f7b10111da73', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('b21b07951bb547b09cc85624a841aea0', 'f6817f48af4fb3af11b9e8bf182f618b', '4356a1a67b564f0988a484f5531fd4d9', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('b64c4ab9cd9a2ea8ac1e9db5fb7cf522', 'f6817f48af4fb3af11b9e8bf182f618b', '2aeddae571695cd6380f6d6d334d6e7d', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('bbec16ad016efec9ea2def38f4d3d9dc', 'f6817f48af4fb3af11b9e8bf182f618b', '13212d3416eb690c2e1d5033166ff47a', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('bea2986432079d89203da888d99b3f16', 'f6817f48af4fb3af11b9e8bf182f618b', '54dd5457a3190740005c1bfec55b1c34', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('c56fb1658ee5f7476380786bf5905399', 'f6817f48af4fb3af11b9e8bf182f618b', 'de13e0f6328c069748de7399fcc1dbbd', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('c6fee38d293b9d0596436a0cbd205070', 'f6817f48af4fb3af11b9e8bf182f618b', '4f84f9400e5e92c95f05b554724c2b58', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('c90b0b01c7ca454d2a1cb7408563e696', 'f6817f48af4fb3af11b9e8bf182f618b', '882a73768cfd7f78f3a37584f7299656', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('cf1feb1bf69eafc982295ad6c9c8d698', 'f6817f48af4fb3af11b9e8bf182f618b', 'a2b11669e98c5fe54a53c3e3c4f35d14', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('cf2ef620217673e4042f695743294f01', 'f6817f48af4fb3af11b9e8bf182f618b', '717f6bee46f44a3897eca9abd6e2ec44', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('d281a95b8f293d0fa2a136f46c4e0b10', 'f6817f48af4fb3af11b9e8bf182f618b', '5c8042bd6c601270b2bbd9b20bccc68b', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('d37ad568e26f46ed0feca227aa9c2ffa', 'f6817f48af4fb3af11b9e8bf182f618b', '9502685863ab87f0ad1134142788a385', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('d3ddcacee1acdfaa0810618b74e38ef2', 'f6817f48af4fb3af11b9e8bf182f618b', 'c6cf95444d80435eb37b2f9db3971ae6', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('d83282192a69514cfe6161b3087ff962', 'f6817f48af4fb3af11b9e8bf182f618b', '53a9230444d33de28aa11cc108fb1dba', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('d8a5c9079df12090e108e21be94b4fd7', 'f6817f48af4fb3af11b9e8bf182f618b', '078f9558cdeab239aecb2bda1a8ed0d1', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('dc83bb13c0e8c930e79d28b2db26f01f', 'f6817f48af4fb3af11b9e8bf182f618b', '63b551e81c5956d5c861593d366d8c57', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('dc8fd3f79bd85bd832608b42167a1c71', 'f6817f48af4fb3af11b9e8bf182f618b', '91c23960fab49335831cf43d820b0a61', null, null, null); +INSERT INTO "SYS_ROLE_PERMISSION" VALUES ('de82e89b8b60a3ea99be5348f565c240', 'f6817f48af4fb3af11b9e8bf182f618b', '56ca78fe0f22d815fabc793461af67b8', null, null, null); + +-- ---------------------------- +-- Table structure for SYS_SMS +-- ---------------------------- +DROP TABLE "SYS_SMS"; +CREATE TABLE "SYS_SMS" ( +"ID" NVARCHAR2(32) NOT NULL , +"ES_TITLE" NVARCHAR2(100) NULL , +"ES_TYPE" NVARCHAR2(1) NULL , +"ES_RECEIVER" NVARCHAR2(50) NULL , +"ES_PARAM" NVARCHAR2(1000) NULL , +"ES_CONTENT" NCLOB NULL , +"ES_SEND_TIME" DATE NULL , +"ES_SEND_STATUS" NVARCHAR2(1) NULL , +"ES_SEND_NUM" NUMBER(11) NULL , +"ES_RESULT" NVARCHAR2(255) NULL , +"REMARK" NVARCHAR2(500) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_SMS"."ID" IS 'ID'; +COMMENT ON COLUMN "SYS_SMS"."ES_TITLE" IS '消息标题'; +COMMENT ON COLUMN "SYS_SMS"."ES_TYPE" IS '发送方式:1短信 2邮件 3微信'; +COMMENT ON COLUMN "SYS_SMS"."ES_RECEIVER" IS '接收人'; +COMMENT ON COLUMN "SYS_SMS"."ES_PARAM" IS '发送所需参数Json格式'; +COMMENT ON COLUMN "SYS_SMS"."ES_CONTENT" IS '推送内容'; +COMMENT ON COLUMN "SYS_SMS"."ES_SEND_TIME" IS '推送时间'; +COMMENT ON COLUMN "SYS_SMS"."ES_SEND_STATUS" IS '推送状态 0未推送 1推送成功 2推送失败 -1失败不再发送'; +COMMENT ON COLUMN "SYS_SMS"."ES_SEND_NUM" IS '发送次数 超过5次不再发送'; +COMMENT ON COLUMN "SYS_SMS"."ES_RESULT" IS '推送失败原因'; +COMMENT ON COLUMN "SYS_SMS"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYS_SMS"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "SYS_SMS"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_SMS"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "SYS_SMS"."UPDATE_TIME" IS '更新日期'; + +-- ---------------------------- +-- Records of SYS_SMS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_SMS_TEMPLATE +-- ---------------------------- +DROP TABLE "SYS_SMS_TEMPLATE"; +CREATE TABLE "SYS_SMS_TEMPLATE" ( +"ID" NVARCHAR2(32) NOT NULL , +"TEMPLATE_NAME" NVARCHAR2(50) NULL , +"TEMPLATE_CODE" NVARCHAR2(32) NOT NULL , +"TEMPLATE_TYPE" NVARCHAR2(1) NOT NULL , +"TEMPLATE_CONTENT" NVARCHAR2(1000) NOT NULL , +"TEMPLATE_TEST_JSON" NVARCHAR2(1000) NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."ID" IS '主键'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."TEMPLATE_NAME" IS '模板标题'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."TEMPLATE_CODE" IS '模板CODE'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."TEMPLATE_TYPE" IS '模板类型:1短信 2邮件 3微信'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."TEMPLATE_CONTENT" IS '模板内容'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."TEMPLATE_TEST_JSON" IS '模板测试json'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "SYS_SMS_TEMPLATE"."UPDATE_BY" IS '更新人登录名称'; + +-- ---------------------------- +-- Records of SYS_SMS_TEMPLATE +-- ---------------------------- +INSERT INTO "SYS_SMS_TEMPLATE" VALUES ('1199606397416775681', '系统消息通知-Demo', 'sys_ts_note', '4', '

    系统通知

+
    +
  • 通知时间:  ${ts_date}
  • +
  • 通知内容:  ${ts_content}
  • +
', null, TO_DATE('2019-11-27 16:30:27', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-11-27 19:36:50', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); +INSERT INTO "SYS_SMS_TEMPLATE" VALUES ('1199648914107625473', '流程办理超时提醒-Demo', 'bpm_chaoshi_tip', '4', '

   流程办理超时提醒

+
    +
  •    超时提醒信息:    您有待处理的超时任务,请尽快处理!
  • +
  •    超时任务标题:    ${title}
  • +
  •    超时任务节点:    ${task}
  • +
  •    任务处理人:       ${user}
  • +
  •    任务开始时间:    ${time}
  • +
', null, TO_DATE('2019-11-27 19:19:24', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-11-27 19:36:37', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); +INSERT INTO "SYS_SMS_TEMPLATE" VALUES ('4028608164691b000164693108140003', '催办:${taskName}-Demo', 'SYS001', '3', '${userName},您好! +请前待办任务办理事项!${taskName} + + +=========================== +此消息由系统发出', '{ +"taskName":"HR审批", +"userName":"admin" +}', TO_DATE('2018-07-05 14:46:18', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2018-07-05 18:31:34', 'YYYY-MM-DD HH24:MI:SS'), 'admin'); + +-- ---------------------------- +-- Table structure for SYS_TENANT +-- ---------------------------- +DROP TABLE "SYS_TENANT"; +CREATE TABLE "SYS_TENANT" ( +"ID" NUMBER(11) NOT NULL , +"NAME" NVARCHAR2(100) NULL , +"CREATE_TIME" DATE NULL , +"CREATE_BY" NVARCHAR2(100) NULL , +"BEGIN_DATE" DATE NULL , +"END_DATE" DATE NULL , +"STATUS" NUMBER(11) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_TENANT" IS '多租户信息表'; +COMMENT ON COLUMN "SYS_TENANT"."ID" IS '租户编码'; +COMMENT ON COLUMN "SYS_TENANT"."NAME" IS '租户名称'; +COMMENT ON COLUMN "SYS_TENANT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_TENANT"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_TENANT"."BEGIN_DATE" IS '开始时间'; +COMMENT ON COLUMN "SYS_TENANT"."END_DATE" IS '结束时间'; +COMMENT ON COLUMN "SYS_TENANT"."STATUS" IS '状态 1正常 0冻结'; + +-- ---------------------------- +-- Records of SYS_TENANT +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_THIRD_ACCOUNT +-- ---------------------------- +DROP TABLE "SYS_THIRD_ACCOUNT"; +CREATE TABLE "SYS_THIRD_ACCOUNT" ( +"ID" NVARCHAR2(32) NOT NULL , +"SYS_USER_ID" NVARCHAR2(32) NULL , +"THIRD_TYPE" NVARCHAR2(255) NULL , +"AVATAR" NVARCHAR2(255) NULL , +"STATUS" NUMBER(4) NULL , +"DEL_FLAG" NUMBER(4) NULL , +"REALNAME" NVARCHAR2(100) NULL , +"THIRD_USER_UUID" NVARCHAR2(100) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."ID" IS '编号'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."SYS_USER_ID" IS '第三方登录id'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."THIRD_TYPE" IS '登录来源'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."AVATAR" IS '头像'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."STATUS" IS '状态(1-正常,2-冻结)'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."DEL_FLAG" IS '删除状态(0-正常,1-已删除)'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."REALNAME" IS '真实姓名'; +COMMENT ON COLUMN "SYS_THIRD_ACCOUNT"."THIRD_USER_UUID" IS '第三方账号'; + +-- ---------------------------- +-- Records of SYS_THIRD_ACCOUNT +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_USER +-- ---------------------------- +DROP TABLE "SYS_USER"; +CREATE TABLE "SYS_USER" ( +"ID" NVARCHAR2(32) NOT NULL , +"USERNAME" NVARCHAR2(100) NULL , +"REALNAME" NVARCHAR2(100) NULL , +"PASSWORD" NVARCHAR2(255) NULL , +"SALT" NVARCHAR2(45) NULL , +"AVATAR" NVARCHAR2(255) NULL , +"BIRTHDAY" DATE NULL , +"SEX" NUMBER(4) NULL , +"EMAIL" NVARCHAR2(45) NULL , +"PHONE" NVARCHAR2(45) NULL , +"ORG_CODE" NVARCHAR2(64) NULL , +"STATUS" NUMBER(4) NULL , +"DEL_FLAG" NUMBER(4) NULL , +"THIRD_ID" NVARCHAR2(100) NULL , +"THIRD_TYPE" NVARCHAR2(100) NULL , +"ACTIVITI_SYNC" NUMBER(4) NULL , +"WORK_NO" NVARCHAR2(100) NULL , +"TELEPHONE" NVARCHAR2(45) NULL , +"CREATE_BY" NVARCHAR2(32) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(32) NULL , +"UPDATE_TIME" DATE NULL , +"USER_IDENTITY" NUMBER(4) NULL , +"DEPART_IDS" NCLOB NULL , +"REL_TENANT_IDS" NVARCHAR2(100) NULL , +"CLIENT_ID" NVARCHAR2(64) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_USER" IS '用户表'; +COMMENT ON COLUMN "SYS_USER"."ID" IS '主键id'; +COMMENT ON COLUMN "SYS_USER"."USERNAME" IS '登录账号'; +COMMENT ON COLUMN "SYS_USER"."REALNAME" IS '真实姓名'; +COMMENT ON COLUMN "SYS_USER"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "SYS_USER"."SALT" IS 'md5密码盐'; +COMMENT ON COLUMN "SYS_USER"."AVATAR" IS '头像'; +COMMENT ON COLUMN "SYS_USER"."BIRTHDAY" IS '生日'; +COMMENT ON COLUMN "SYS_USER"."SEX" IS '性别(0-默认未知,1-男,2-女)'; +COMMENT ON COLUMN "SYS_USER"."EMAIL" IS '电子邮件'; +COMMENT ON COLUMN "SYS_USER"."PHONE" IS '电话'; +COMMENT ON COLUMN "SYS_USER"."ORG_CODE" IS '机构编码'; +COMMENT ON COLUMN "SYS_USER"."STATUS" IS '性别(1-正常,2-冻结)'; +COMMENT ON COLUMN "SYS_USER"."DEL_FLAG" IS '删除状态(0-正常,1-已删除)'; +COMMENT ON COLUMN "SYS_USER"."THIRD_ID" IS '第三方登录的唯一标识'; +COMMENT ON COLUMN "SYS_USER"."THIRD_TYPE" IS '第三方类型'; +COMMENT ON COLUMN "SYS_USER"."ACTIVITI_SYNC" IS '同步工作流引擎(1-同步,0-不同步)'; +COMMENT ON COLUMN "SYS_USER"."WORK_NO" IS '工号,唯一键'; +COMMENT ON COLUMN "SYS_USER"."TELEPHONE" IS '座机号'; +COMMENT ON COLUMN "SYS_USER"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "SYS_USER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYS_USER"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "SYS_USER"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYS_USER"."USER_IDENTITY" IS '身份(1普通成员 2上级)'; +COMMENT ON COLUMN "SYS_USER"."DEPART_IDS" IS '负责部门'; +COMMENT ON COLUMN "SYS_USER"."REL_TENANT_IDS" IS '多租户标识'; +COMMENT ON COLUMN "SYS_USER"."CLIENT_ID" IS '设备ID'; + +-- ---------------------------- +-- Records of SYS_USER +-- ---------------------------- +INSERT INTO "SYS_USER" VALUES ('e9ca23d68d884d4ebb19d07889727dae', 'admin', '开发管理员', 'cb362cfeefbf3d8d', 'RCGTeGiH', null, TO_DATE('2018-12-05 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '1', 'lixuetao@syxysoft.com', '18608732661', 'A01', '1', '0', null, null, '1', '00001', null, null, TO_DATE('2019-06-21 17:54:10', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-03-16 18:00:16', 'YYYY-MM-DD HH24:MI:SS'), '2', 'c6d7cb4deeac411cb3384b1b31278596', null, null); + +-- ---------------------------- +-- Table structure for SYS_USER_AGENT +-- ---------------------------- +DROP TABLE "SYS_USER_AGENT"; +CREATE TABLE "SYS_USER_AGENT" ( +"ID" NVARCHAR2(32) NOT NULL , +"USER_NAME" NVARCHAR2(100) NULL , +"AGENT_USER_NAME" NVARCHAR2(100) NULL , +"START_TIME" DATE NULL , +"END_TIME" DATE NULL , +"STATUS" NVARCHAR2(2) NULL , +"CREATE_NAME" NVARCHAR2(50) NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_NAME" NVARCHAR2(50) NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL , +"SYS_ORG_CODE" NVARCHAR2(50) NULL , +"SYS_COMPANY_CODE" NVARCHAR2(50) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_USER_AGENT" IS '用户代理人设置'; +COMMENT ON COLUMN "SYS_USER_AGENT"."ID" IS '序号'; +COMMENT ON COLUMN "SYS_USER_AGENT"."USER_NAME" IS '用户名'; +COMMENT ON COLUMN "SYS_USER_AGENT"."AGENT_USER_NAME" IS '代理人用户名'; +COMMENT ON COLUMN "SYS_USER_AGENT"."START_TIME" IS '代理开始时间'; +COMMENT ON COLUMN "SYS_USER_AGENT"."END_TIME" IS '代理结束时间'; +COMMENT ON COLUMN "SYS_USER_AGENT"."STATUS" IS '状态0无效1有效'; +COMMENT ON COLUMN "SYS_USER_AGENT"."CREATE_NAME" IS '创建人名称'; +COMMENT ON COLUMN "SYS_USER_AGENT"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "SYS_USER_AGENT"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "SYS_USER_AGENT"."UPDATE_NAME" IS '更新人名称'; +COMMENT ON COLUMN "SYS_USER_AGENT"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "SYS_USER_AGENT"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "SYS_USER_AGENT"."SYS_ORG_CODE" IS '所属部门'; +COMMENT ON COLUMN "SYS_USER_AGENT"."SYS_COMPANY_CODE" IS '所属公司'; + +-- ---------------------------- +-- Records of SYS_USER_AGENT +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_USER_DEPART +-- ---------------------------- +DROP TABLE "SYS_USER_DEPART"; +CREATE TABLE "SYS_USER_DEPART" ( +"ID" NVARCHAR2(32) NOT NULL , +"USER_ID" NVARCHAR2(32) NULL , +"DEP_ID" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "SYS_USER_DEPART"."ID" IS 'id'; +COMMENT ON COLUMN "SYS_USER_DEPART"."USER_ID" IS '用户id'; +COMMENT ON COLUMN "SYS_USER_DEPART"."DEP_ID" IS '部门id'; + +-- ---------------------------- +-- Records of SYS_USER_DEPART +-- ---------------------------- +INSERT INTO "SYS_USER_DEPART" VALUES ('1371763232992583682', 'e9ca23d68d884d4ebb19d07889727dae', 'c6d7cb4deeac411cb3384b1b31278596'); + +-- ---------------------------- +-- Table structure for SYS_USER_ROLE +-- ---------------------------- +DROP TABLE "SYS_USER_ROLE"; +CREATE TABLE "SYS_USER_ROLE" ( +"ID" NVARCHAR2(32) NOT NULL , +"USER_ID" NVARCHAR2(32) NULL , +"ROLE_ID" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON TABLE "SYS_USER_ROLE" IS '用户角色表'; +COMMENT ON COLUMN "SYS_USER_ROLE"."ID" IS '主键id'; +COMMENT ON COLUMN "SYS_USER_ROLE"."USER_ID" IS '用户id'; +COMMENT ON COLUMN "SYS_USER_ROLE"."ROLE_ID" IS '角色id'; + +-- ---------------------------- +-- Records of SYS_USER_ROLE +-- ---------------------------- +INSERT INTO "SYS_USER_ROLE" VALUES ('1371763232468295682', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b'); + +-- ---------------------------- +-- Table structure for TEST_DEMO +-- ---------------------------- +DROP TABLE "TEST_DEMO"; +CREATE TABLE "TEST_DEMO" ( +"ID" NVARCHAR2(36) NOT NULL , +"CREATE_BY" NVARCHAR2(50) NULL , +"CREATE_TIME" DATE NULL , +"UPDATE_BY" NVARCHAR2(50) NULL , +"UPDATE_TIME" DATE NULL , +"NAME" NVARCHAR2(200) NULL , +"SEX" NVARCHAR2(32) NULL , +"AGE" NUMBER(11) NULL , +"DESCC" NVARCHAR2(500) NULL , +"BIRTHDAY" DATE NULL , +"USER_CODE" NVARCHAR2(32) NULL , +"FILE_KK" NVARCHAR2(500) NULL , +"TOP_PIC" NVARCHAR2(500) NULL , +"CHEGNSHI" NVARCHAR2(300) NULL , +"CECK" NVARCHAR2(32) NULL , +"XIAMUTI" NVARCHAR2(100) NULL , +"SEARCH_SEL" NVARCHAR2(100) NULL , +"POP" NVARCHAR2(32) NULL +) +LOGGING +NOCOMPRESS +NOCACHE + +; +COMMENT ON COLUMN "TEST_DEMO"."ID" IS '主键'; +COMMENT ON COLUMN "TEST_DEMO"."CREATE_BY" IS '创建人登录名称'; +COMMENT ON COLUMN "TEST_DEMO"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "TEST_DEMO"."UPDATE_BY" IS '更新人登录名称'; +COMMENT ON COLUMN "TEST_DEMO"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "TEST_DEMO"."NAME" IS '用户名'; +COMMENT ON COLUMN "TEST_DEMO"."SEX" IS '性别'; +COMMENT ON COLUMN "TEST_DEMO"."AGE" IS '年龄'; +COMMENT ON COLUMN "TEST_DEMO"."DESCC" IS '描述'; +COMMENT ON COLUMN "TEST_DEMO"."BIRTHDAY" IS '生日'; +COMMENT ON COLUMN "TEST_DEMO"."USER_CODE" IS '用户编码'; +COMMENT ON COLUMN "TEST_DEMO"."FILE_KK" IS '附件'; +COMMENT ON COLUMN "TEST_DEMO"."TOP_PIC" IS '头像'; +COMMENT ON COLUMN "TEST_DEMO"."CHEGNSHI" IS '城市'; +COMMENT ON COLUMN "TEST_DEMO"."CECK" IS 'checkbox'; +COMMENT ON COLUMN "TEST_DEMO"."XIAMUTI" IS '下拉多选'; +COMMENT ON COLUMN "TEST_DEMO"."SEARCH_SEL" IS '搜索下拉'; +COMMENT ON COLUMN "TEST_DEMO"."POP" IS '弹窗'; + +-- ---------------------------- +-- Records of TEST_DEMO +-- ---------------------------- +INSERT INTO "TEST_DEMO" VALUES ('1331884149004910593', 'admin', TO_DATE('2020-11-26 16:55:01', 'YYYY-MM-DD HH24:MI:SS'), null, null, '张三', '1', null, null, null, null, null, null, '130304', null, null, null, null); +INSERT INTO "TEST_DEMO" VALUES ('1331901553776869377', 'admin', TO_DATE('2020-11-26 18:04:10', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-11-26 18:04:24', 'YYYY-MM-DD HH24:MI:SS'), '张三', '2', null, null, null, null, null, null, null, '1', '1,2', 'hr', null); +INSERT INTO "TEST_DEMO" VALUES ('1335522992002248706', 'admin', TO_DATE('2020-12-06 17:54:28', 'YYYY-MM-DD HH24:MI:SS'), null, null, '333', null, null, null, null, null, 'Javagongzuoliuxuqiu-20200703_1607248465493.docx', 'jerocloudweifuwujiagoutu-fuben_1607248465493.png', null, null, null, null, null); +INSERT INTO "TEST_DEMO" VALUES ('1335523137875947522', 'admin', TO_DATE('2020-12-06 17:55:03', 'YYYY-MM-DD HH24:MI:SS'), null, null, '张三66778888', null, null, null, null, null, 'Javagongzuoliuxuqiu-20200703_1607248489440.docx', 'jerocloudweifuwujiagoutu-fuben_1607248485629.png,jero_cloud_project_ref_1607248495491.png', null, '2', null, null, null); +INSERT INTO "TEST_DEMO" VALUES ('4028810c6aed99e1016aed9b31b40002', null, null, 'admin', TO_DATE('2019-10-19 15:37:27', 'YYYY-MM-DD HH24:MI:SS'), 'jero', '2', '55', '5', TO_DATE('2019-05-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, null, null, null, null, null); +INSERT INTO "TEST_DEMO" VALUES ('4028810c6b02cba2016b02cba21f0000', 'admin', TO_DATE('2019-05-29 16:53:48', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2019-08-23 23:45:21', 'YYYY-MM-DD HH24:MI:SS'), '张小红', '1', '8222', '8', TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, null, null, null, null, null); +INSERT INTO "TEST_DEMO" VALUES ('4028810c6b40244b016b4030a0e40001', 'admin', TO_DATE('2019-06-10 15:00:57', 'YYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2020-05-03 01:28:34', 'YYYY-MM-DD HH24:MI:SS'), '小芳', '2', '0', null, TO_DATE('2019-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, '11_1582482670686.jpg', null, null, null, null, null); +INSERT INTO "TEST_DEMO" VALUES ('fa1d1c249461498d90f405b94f60aae0', null, null, 'admin', TO_DATE('2019-05-15 12:30:28', 'YYYY-MM-DD HH24:MI:SS'), '战三', '2', '222', null, null, null, null, null, null, null, null, null, null); + +-- ---------------------------- +-- Indexes structure for table DEMO +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table DEMO +-- ---------------------------- +ALTER TABLE "DEMO" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "DEMO" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table DEMO +-- ---------------------------- +ALTER TABLE "DEMO" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table JERO_ORDER_CUSTOMER +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table JERO_ORDER_CUSTOMER +-- ---------------------------- +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD CHECK ("NAME" IS NOT NULL); +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD CHECK ("ORDER_ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD CHECK ("NAME" IS NOT NULL); +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD CHECK ("ORDER_ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table JERO_ORDER_CUSTOMER +-- ---------------------------- +ALTER TABLE "JERO_ORDER_CUSTOMER" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table JERO_ORDER_MAIN +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table JERO_ORDER_MAIN +-- ---------------------------- +ALTER TABLE "JERO_ORDER_MAIN" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_MAIN" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table JERO_ORDER_MAIN +-- ---------------------------- +ALTER TABLE "JERO_ORDER_MAIN" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table JERO_ORDER_TICKET +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table JERO_ORDER_TICKET +-- ---------------------------- +ALTER TABLE "JERO_ORDER_TICKET" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_TICKET" ADD CHECK ("TICKET_CODE" IS NOT NULL); +ALTER TABLE "JERO_ORDER_TICKET" ADD CHECK ("ORDER_ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_TICKET" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "JERO_ORDER_TICKET" ADD CHECK ("TICKET_CODE" IS NOT NULL); +ALTER TABLE "JERO_ORDER_TICKET" ADD CHECK ("ORDER_ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table JERO_ORDER_TICKET +-- ---------------------------- +ALTER TABLE "JERO_ORDER_TICKET" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_AUTH_DATA +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table ONL_AUTH_DATA +-- ---------------------------- +ALTER TABLE "ONL_AUTH_DATA" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_AUTH_DATA" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_AUTH_DATA +-- ---------------------------- +ALTER TABLE "ONL_AUTH_DATA" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_AUTH_PAGE +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table ONL_AUTH_PAGE +-- ---------------------------- +ALTER TABLE "ONL_AUTH_PAGE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_AUTH_PAGE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_AUTH_PAGE +-- ---------------------------- +ALTER TABLE "ONL_AUTH_PAGE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_AUTH_RELATION +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table ONL_AUTH_RELATION +-- ---------------------------- +ALTER TABLE "ONL_AUTH_RELATION" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_AUTH_RELATION" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_AUTH_RELATION +-- ---------------------------- +ALTER TABLE "ONL_AUTH_RELATION" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_BUTTON +-- ---------------------------- +CREATE INDEX "IDX_OCB_BUTTON_CODE" +ON "ONL_CGFORM_BUTTON" ("BUTTON_CODE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCB_BUTTON_STATUS" +ON "ONL_CGFORM_BUTTON" ("BUTTON_STATUS" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCB_CGFORM_HEAD_ID" +ON "ONL_CGFORM_BUTTON" ("CGFORM_HEAD_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCB_ORDER_NUM" +ON "ONL_CGFORM_BUTTON" ("ORDER_NUM" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_BUTTON +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_BUTTON" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_BUTTON" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_BUTTON +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_BUTTON" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_ENHANCE_JAVA +-- ---------------------------- +CREATE INDEX "IDX_EJAVA_CGFORM_HEAD_ID" +ON "ONL_CGFORM_ENHANCE_JAVA" ("CGFORM_HEAD_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCEJ_ACTIVE_STATUS" +ON "ONL_CGFORM_ENHANCE_JAVA" ("ACTIVE_STATUS" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCEJ_BUTTON_CODE" +ON "ONL_CGFORM_ENHANCE_JAVA" ("BUTTON_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_ENHANCE_JAVA +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("CG_JAVA_TYPE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("CG_JAVA_VALUE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("CGFORM_HEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("EVENT" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("CG_JAVA_TYPE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("CG_JAVA_VALUE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("CGFORM_HEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD CHECK ("EVENT" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_ENHANCE_JAVA +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_ENHANCE_JAVA" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_ENHANCE_JS +-- ---------------------------- +CREATE INDEX "IDX_EJS_CGFORM_HEAD_ID" +ON "ONL_CGFORM_ENHANCE_JS" ("CGFORM_HEAD_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_EJS_CG_JS_TYPE" +ON "ONL_CGFORM_ENHANCE_JS" ("CG_JS_TYPE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_ENHANCE_JS +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_ENHANCE_JS" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_JS" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_ENHANCE_JS +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_ENHANCE_JS" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_ENHANCE_SQL +-- ---------------------------- +CREATE INDEX "IDX_OCES_CGFORM_HEAD_ID" +ON "ONL_CGFORM_ENHANCE_SQL" ("CGFORM_HEAD_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_ENHANCE_SQL +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_ENHANCE_SQL" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_ENHANCE_SQL" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_ENHANCE_SQL +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_ENHANCE_SQL" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_FIELD +-- ---------------------------- +CREATE INDEX "IDX_OCF_CGFORM_HEAD_ID" +ON "ONL_CGFORM_FIELD" ("CGFORM_HEAD_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_FIELD +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("CGFORM_HEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("DB_FIELD_NAME" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("DB_TYPE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("DB_LENGTH" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("CGFORM_HEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("DB_FIELD_NAME" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("DB_TYPE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_FIELD" ADD CHECK ("DB_LENGTH" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_FIELD +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_FIELD" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_HEAD +-- ---------------------------- +CREATE INDEX "IDX_OCH_FORM_TEMPLATE" +ON "ONL_CGFORM_HEAD" ("FORM_TEMPLATE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCH_FORM_TEMPLATE_MOBILE" +ON "ONL_CGFORM_HEAD" ("FORM_TEMPLATE_MOBILE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCH_TABLE_VERSION" +ON "ONL_CGFORM_HEAD" ("TABLE_VERSION" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UNIQ_CGFORM_TABLENAME" +ON "ONL_CGFORM_HEAD" ("TABLE_NAME" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_HEAD +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("TABLE_NAME" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("TABLE_TYPE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("TABLE_TXT" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_CHECKBOX" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_DB_SYNCH" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_PAGE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_TREE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("QUERY_MODE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("FORM_CATEGORY" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("TABLE_NAME" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("TABLE_TYPE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("TABLE_TXT" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_CHECKBOX" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_DB_SYNCH" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_PAGE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("IS_TREE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("QUERY_MODE" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_HEAD" ADD CHECK ("FORM_CATEGORY" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_HEAD +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_HEAD" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGFORM_INDEX +-- ---------------------------- +CREATE INDEX "IDX_OCI_CGFORM_HEAD_ID" +ON "ONL_CGFORM_INDEX" ("CGFORM_HEAD_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGFORM_INDEX +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_INDEX" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGFORM_INDEX" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGFORM_INDEX +-- ---------------------------- +ALTER TABLE "ONL_CGFORM_INDEX" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGREPORT_HEAD +-- ---------------------------- +CREATE UNIQUE INDEX "UNIQ_OLREPORT_CODE" +ON "ONL_CGREPORT_HEAD" ("CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGREPORT_HEAD +-- ---------------------------- +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("CODE" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("NAME" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("CGR_SQL" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("CODE" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("NAME" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_HEAD" ADD CHECK ("CGR_SQL" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGREPORT_HEAD +-- ---------------------------- +ALTER TABLE "ONL_CGREPORT_HEAD" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGREPORT_ITEM +-- ---------------------------- +CREATE INDEX "IDX_OCI_CGRHEAD_ID" +ON "ONL_CGREPORT_ITEM" ("CGRHEAD_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCI_IS_SHOW" +ON "ONL_CGREPORT_ITEM" ("IS_SHOW" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_OCI_ORDER_NUM" +ON "ONL_CGREPORT_ITEM" ("ORDER_NUM" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGREPORT_ITEM +-- ---------------------------- +ALTER TABLE "ONL_CGREPORT_ITEM" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_ITEM" ADD CHECK ("CGRHEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_ITEM" ADD CHECK ("FIELD_NAME" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_ITEM" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_ITEM" ADD CHECK ("CGRHEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_ITEM" ADD CHECK ("FIELD_NAME" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGREPORT_ITEM +-- ---------------------------- +ALTER TABLE "ONL_CGREPORT_ITEM" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table ONL_CGREPORT_PARAM +-- ---------------------------- +CREATE INDEX "IDX_OCP_CGRHEAD_ID" +ON "ONL_CGREPORT_PARAM" ("CGRHEAD_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table ONL_CGREPORT_PARAM +-- ---------------------------- +ALTER TABLE "ONL_CGREPORT_PARAM" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_PARAM" ADD CHECK ("CGRHEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_PARAM" ADD CHECK ("PARAM_NAME" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_PARAM" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_PARAM" ADD CHECK ("CGRHEAD_ID" IS NOT NULL); +ALTER TABLE "ONL_CGREPORT_PARAM" ADD CHECK ("PARAM_NAME" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table ONL_CGREPORT_PARAM +-- ---------------------------- +ALTER TABLE "ONL_CGREPORT_PARAM" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table OSS_FILE +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table OSS_FILE +-- ---------------------------- +ALTER TABLE "OSS_FILE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "OSS_FILE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table OSS_FILE +-- ---------------------------- +ALTER TABLE "OSS_FILE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_CALENDARS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE "QRTZ_CALENDARS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CALENDARS" ADD CHECK ("CALENDAR_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CALENDARS" ADD CHECK ("CALENDAR" IS NOT NULL); +ALTER TABLE "QRTZ_CALENDARS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CALENDARS" ADD CHECK ("CALENDAR_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CALENDARS" ADD CHECK ("CALENDAR" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE "QRTZ_CALENDARS" ADD PRIMARY KEY ("SCHED_NAME", "CALENDAR_NAME"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("CRON_EXPRESSION" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CHECK ("CRON_EXPRESSION" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_FT_INST_JOB_REQ_RCVRY" +ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "INSTANCE_NAME" ASC, "REQUESTS_RECOVERY" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_FT_JG" +ON "QRTZ_FIRED_TRIGGERS" ("JOB_GROUP" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_FT_J_G" +ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "JOB_NAME" ASC, "JOB_GROUP" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_FT_TG" +ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_GROUP" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_FT_TRIG_INST_NAME" +ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "INSTANCE_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_FT_T_G" +ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_NAME" ASC, "TRIGGER_GROUP" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("ENTRY_ID" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("INSTANCE_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("FIRED_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("SCHED_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("PRIORITY" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("STATE" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("ENTRY_ID" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("INSTANCE_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("FIRED_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("SCHED_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("PRIORITY" IS NOT NULL); +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CHECK ("STATE" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD PRIMARY KEY ("SCHED_NAME", "ENTRY_ID"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_J_GRP" +ON "QRTZ_JOB_DETAILS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_J_REQ_RECOVERY" +ON "QRTZ_JOB_DETAILS" ("SCHED_NAME" ASC, "REQUESTS_RECOVERY" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("JOB_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("JOB_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("JOB_CLASS_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("IS_DURABLE" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("IS_NONCONCURRENT" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("IS_UPDATE_DATA" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("REQUESTS_RECOVERY" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("JOB_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("JOB_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("JOB_CLASS_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("IS_DURABLE" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("IS_NONCONCURRENT" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("IS_UPDATE_DATA" IS NOT NULL); +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CHECK ("REQUESTS_RECOVERY" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE "QRTZ_JOB_DETAILS" ADD PRIMARY KEY ("SCHED_NAME", "JOB_NAME", "JOB_GROUP"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_LOCKS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE "QRTZ_LOCKS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_LOCKS" ADD CHECK ("LOCK_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_LOCKS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_LOCKS" ADD CHECK ("LOCK_NAME" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE "QRTZ_LOCKS" ADD PRIMARY KEY ("SCHED_NAME", "LOCK_NAME"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD PRIMARY KEY ("SCHED_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("INSTANCE_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("LAST_CHECKIN_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("CHECKIN_INTERVAL" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("INSTANCE_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("LAST_CHECKIN_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CHECK ("CHECKIN_INTERVAL" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD PRIMARY KEY ("SCHED_NAME", "INSTANCE_NAME"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("REPEAT_COUNT" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("REPEAT_INTERVAL" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("TIMES_TRIGGERED" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("REPEAT_COUNT" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("REPEAT_INTERVAL" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CHECK ("TIMES_TRIGGERED" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Indexes structure for table QRTZ_TRIGGERS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_T_C" +ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "CALENDAR_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_G" +ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_GROUP" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_J" +ON "QRTZ_TRIGGERS" ("JOB_NAME" ASC, "JOB_GROUP" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_JG" +ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_NEXT_FIRE_TIME" +ON "QRTZ_TRIGGERS" ("NEXT_FIRE_TIME" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_NFT_MISFIRE" +ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "MISFIRE_INSTR" ASC, "NEXT_FIRE_TIME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_NFT_ST" +ON "QRTZ_TRIGGERS" ("NEXT_FIRE_TIME" ASC, "TRIGGER_STATE" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_NFT_ST_MISFIRE" +ON "QRTZ_TRIGGERS" ("NEXT_FIRE_TIME" ASC, "TRIGGER_STATE" ASC, "SCHED_NAME" ASC, "MISFIRE_INSTR" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_NFT_ST_MISFIRE_GRP" +ON "QRTZ_TRIGGERS" ("TRIGGER_GROUP" ASC, "TRIGGER_STATE" ASC, "NEXT_FIRE_TIME" ASC, "MISFIRE_INSTR" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_N_G_STATE" +ON "QRTZ_TRIGGERS" ("TRIGGER_GROUP" ASC, "TRIGGER_STATE" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_N_STATE" +ON "QRTZ_TRIGGERS" ("TRIGGER_STATE" ASC, "SCHED_NAME" ASC, "TRIGGER_NAME" ASC, "TRIGGER_GROUP" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_QRTZ_T_STATE" +ON "QRTZ_TRIGGERS" ("TRIGGER_STATE" ASC, "SCHED_NAME" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("JOB_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("JOB_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_STATE" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_TYPE" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("START_TIME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("SCHED_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("JOB_NAME" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("JOB_GROUP" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_STATE" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("TRIGGER_TYPE" IS NOT NULL); +ALTER TABLE "QRTZ_TRIGGERS" ADD CHECK ("START_TIME" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Indexes structure for table SYS_ANNOUNCEMENT +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_ANNOUNCEMENT +-- ---------------------------- +ALTER TABLE "SYS_ANNOUNCEMENT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_ANNOUNCEMENT" ADD CHECK ("MSG_CATEGORY" IS NOT NULL); +ALTER TABLE "SYS_ANNOUNCEMENT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_ANNOUNCEMENT" ADD CHECK ("MSG_CATEGORY" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_ANNOUNCEMENT +-- ---------------------------- +ALTER TABLE "SYS_ANNOUNCEMENT" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_CATEGORY +-- ---------------------------- +CREATE UNIQUE INDEX "IDX_SC_CODE" +ON "SYS_CATEGORY" ("CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_CATEGORY +-- ---------------------------- +ALTER TABLE "SYS_CATEGORY" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_CATEGORY" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_CATEGORY +-- ---------------------------- +ALTER TABLE "SYS_CATEGORY" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_CHECK_RULE +-- ---------------------------- +CREATE UNIQUE INDEX "UK_SCR_RULE_CODE" +ON "SYS_CHECK_RULE" ("RULE_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_CHECK_RULE +-- ---------------------------- +ALTER TABLE "SYS_CHECK_RULE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_CHECK_RULE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_CHECK_RULE +-- ---------------------------- +ALTER TABLE "SYS_CHECK_RULE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DATA_LOG +-- ---------------------------- +CREATE INDEX "IDX_SDL_DATA_TABLE_ID" +ON "SYS_DATA_LOG" ("DATA_ID" ASC, "DATA_TABLE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_DATA_LOG +-- ---------------------------- +ALTER TABLE "SYS_DATA_LOG" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DATA_LOG" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DATA_LOG +-- ---------------------------- +ALTER TABLE "SYS_DATA_LOG" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DATA_SOURCE +-- ---------------------------- +CREATE UNIQUE INDEX "UK_SDC_RULE_CODE" +ON "SYS_DATA_SOURCE" ("CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_DATA_SOURCE +-- ---------------------------- +ALTER TABLE "SYS_DATA_SOURCE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DATA_SOURCE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DATA_SOURCE +-- ---------------------------- +ALTER TABLE "SYS_DATA_SOURCE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DEPART +-- ---------------------------- +CREATE INDEX "IDX_SD_DEPART_ORDER" +ON "SYS_DEPART" ("DEPART_ORDER" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SD_PARENT_ID" +ON "SYS_DEPART" ("PARENT_ID" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UNIQ_DEPART_ORG_CODE" +ON "SYS_DEPART" ("ORG_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_DEPART +-- ---------------------------- +ALTER TABLE "SYS_DEPART" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("DEPART_NAME" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("ORG_CATEGORY" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("ORG_CODE" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("DEPART_NAME" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("ORG_CATEGORY" IS NOT NULL); +ALTER TABLE "SYS_DEPART" ADD CHECK ("ORG_CODE" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DEPART +-- ---------------------------- +ALTER TABLE "SYS_DEPART" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DEPART_PERMISSION +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_DEPART_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_DEPART_PERMISSION" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DEPART_PERMISSION" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DEPART_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_DEPART_PERMISSION" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DEPART_ROLE +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_DEPART_ROLE +-- ---------------------------- +ALTER TABLE "SYS_DEPART_ROLE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DEPART_ROLE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DEPART_ROLE +-- ---------------------------- +ALTER TABLE "SYS_DEPART_ROLE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DEPART_ROLE_PERMISSION +-- ---------------------------- +CREATE INDEX "IDX_SDRP_PER_ID" +ON "SYS_DEPART_ROLE_PERMISSION" ("PERMISSION_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SDRP_ROLE_ID" +ON "SYS_DEPART_ROLE_PERMISSION" ("ROLE_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SDRP_ROLE_PER_ID" +ON "SYS_DEPART_ROLE_PERMISSION" ("ROLE_ID" ASC, "PERMISSION_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_DEPART_ROLE_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_DEPART_ROLE_PERMISSION" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DEPART_ROLE_PERMISSION" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DEPART_ROLE_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_DEPART_ROLE_PERMISSION" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DEPART_ROLE_USER +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_DEPART_ROLE_USER +-- ---------------------------- +ALTER TABLE "SYS_DEPART_ROLE_USER" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DEPART_ROLE_USER" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DEPART_ROLE_USER +-- ---------------------------- +ALTER TABLE "SYS_DEPART_ROLE_USER" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DICT +-- ---------------------------- +CREATE UNIQUE INDEX "UK_SD_DICT_CODE" +ON "SYS_DICT" ("DICT_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_DICT +-- ---------------------------- +ALTER TABLE "SYS_DICT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DICT" ADD CHECK ("DICT_NAME" IS NOT NULL); +ALTER TABLE "SYS_DICT" ADD CHECK ("DICT_CODE" IS NOT NULL); +ALTER TABLE "SYS_DICT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DICT" ADD CHECK ("DICT_NAME" IS NOT NULL); +ALTER TABLE "SYS_DICT" ADD CHECK ("DICT_CODE" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DICT +-- ---------------------------- +ALTER TABLE "SYS_DICT" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_DICT_ITEM +-- ---------------------------- +CREATE INDEX "IDX_SDI_DICT_VAL" +ON "SYS_DICT_ITEM" ("ITEM_VALUE" ASC, "DICT_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SDI_ROLE_DICT_ID" +ON "SYS_DICT_ITEM" ("DICT_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SDI_ROLE_SORT_ORDER" +ON "SYS_DICT_ITEM" ("SORT_ORDER" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SDI_STATUS" +ON "SYS_DICT_ITEM" ("STATUS" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_DICT_ITEM +-- ---------------------------- +ALTER TABLE "SYS_DICT_ITEM" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DICT_ITEM" ADD CHECK ("ITEM_TEXT" IS NOT NULL); +ALTER TABLE "SYS_DICT_ITEM" ADD CHECK ("ITEM_VALUE" IS NOT NULL); +ALTER TABLE "SYS_DICT_ITEM" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_DICT_ITEM" ADD CHECK ("ITEM_TEXT" IS NOT NULL); +ALTER TABLE "SYS_DICT_ITEM" ADD CHECK ("ITEM_VALUE" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_DICT_ITEM +-- ---------------------------- +ALTER TABLE "SYS_DICT_ITEM" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_FILL_RULE +-- ---------------------------- +CREATE UNIQUE INDEX "UK_SFR_RULE_CODE" +ON "SYS_FILL_RULE" ("RULE_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_FILL_RULE +-- ---------------------------- +ALTER TABLE "SYS_FILL_RULE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_FILL_RULE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_FILL_RULE +-- ---------------------------- +ALTER TABLE "SYS_FILL_RULE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_GATEWAY_ROUTE +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_GATEWAY_ROUTE +-- ---------------------------- +ALTER TABLE "SYS_GATEWAY_ROUTE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_GATEWAY_ROUTE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_GATEWAY_ROUTE +-- ---------------------------- +ALTER TABLE "SYS_GATEWAY_ROUTE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_LOG +-- ---------------------------- +CREATE INDEX "IDX_SL_CREATE_TIME" +ON "SYS_LOG" ("CREATE_TIME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SL_LOG_TYPE" +ON "SYS_LOG" ("LOG_TYPE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SL_OPERATE_TYPE" +ON "SYS_LOG" ("OPERATE_TYPE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SL_USERID" +ON "SYS_LOG" ("USERID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_LOG +-- ---------------------------- +ALTER TABLE "SYS_LOG" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_LOG" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_LOG +-- ---------------------------- +ALTER TABLE "SYS_LOG" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_PERMISSION +-- ---------------------------- +CREATE INDEX "IDX_SP_DEL_FLAG" +ON "SYS_PERMISSION" ("DEL_FLAG" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_HIDDEN" +ON "SYS_PERMISSION" ("HIDDEN" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_IS_LEAF" +ON "SYS_PERMISSION" ("IS_LEAF" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_IS_ROUTE" +ON "SYS_PERMISSION" ("IS_ROUTE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_MENU_TYPE" +ON "SYS_PERMISSION" ("MENU_TYPE" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_PARENT_ID" +ON "SYS_PERMISSION" ("PARENT_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_SORT_NO" +ON "SYS_PERMISSION" ("SORT_NO" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SP_STATUS" +ON "SYS_PERMISSION" ("STATUS" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_PERMISSION" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_PERMISSION" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_PERMISSION" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_PERMISSION_DATA_RULE +-- ---------------------------- +CREATE INDEX "IDX_SPDR_PERMISSION_ID" +ON "SYS_PERMISSION_DATA_RULE" ("PERMISSION_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_PERMISSION_DATA_RULE +-- ---------------------------- +ALTER TABLE "SYS_PERMISSION_DATA_RULE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_PERMISSION_DATA_RULE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_PERMISSION_DATA_RULE +-- ---------------------------- +ALTER TABLE "SYS_PERMISSION_DATA_RULE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_QUARTZ_JOB +-- ---------------------------- +CREATE UNIQUE INDEX "UNIQ_JOB_CLASS_NAME" +ON "SYS_QUARTZ_JOB" ("JOB_CLASS_NAME" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_QUARTZ_JOB +-- ---------------------------- +ALTER TABLE "SYS_QUARTZ_JOB" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_QUARTZ_JOB" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_QUARTZ_JOB +-- ---------------------------- +ALTER TABLE "SYS_QUARTZ_JOB" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_ROLE +-- ---------------------------- +CREATE UNIQUE INDEX "UNIQ_SYS_ROLE_ROLE_CODE" +ON "SYS_ROLE" ("ROLE_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_ROLE +-- ---------------------------- +ALTER TABLE "SYS_ROLE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_ROLE" ADD CHECK ("ROLE_CODE" IS NOT NULL); +ALTER TABLE "SYS_ROLE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_ROLE" ADD CHECK ("ROLE_CODE" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_ROLE +-- ---------------------------- +ALTER TABLE "SYS_ROLE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_ROLE_PERMISSION +-- ---------------------------- +CREATE INDEX "IDX_SRP_PERMISSION_ID" +ON "SYS_ROLE_PERMISSION" ("PERMISSION_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SRP_ROLE_ID" +ON "SYS_ROLE_PERMISSION" ("ROLE_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SRP_ROLE_PER_ID" +ON "SYS_ROLE_PERMISSION" ("ROLE_ID" ASC, "PERMISSION_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_ROLE_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_ROLE_PERMISSION" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_ROLE_PERMISSION" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_ROLE_PERMISSION +-- ---------------------------- +ALTER TABLE "SYS_ROLE_PERMISSION" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_SMS +-- ---------------------------- +CREATE INDEX "IDX_SS_ES_RECEIVER" +ON "SYS_SMS" ("ES_RECEIVER" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SS_ES_SEND_STATUS" +ON "SYS_SMS" ("ES_SEND_STATUS" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SS_ES_SEND_TIME" +ON "SYS_SMS" ("ES_SEND_TIME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SS_ES_TYPE" +ON "SYS_SMS" ("ES_TYPE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_SMS +-- ---------------------------- +ALTER TABLE "SYS_SMS" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_SMS" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_SMS +-- ---------------------------- +ALTER TABLE "SYS_SMS" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_SMS_TEMPLATE +-- ---------------------------- +CREATE UNIQUE INDEX "UK_SST_TEMPLATE_CODE" +ON "SYS_SMS_TEMPLATE" ("TEMPLATE_CODE" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_SMS_TEMPLATE +-- ---------------------------- +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("TEMPLATE_CODE" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("TEMPLATE_TYPE" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("TEMPLATE_CONTENT" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("TEMPLATE_CODE" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("TEMPLATE_TYPE" IS NOT NULL); +ALTER TABLE "SYS_SMS_TEMPLATE" ADD CHECK ("TEMPLATE_CONTENT" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_SMS_TEMPLATE +-- ---------------------------- +ALTER TABLE "SYS_SMS_TEMPLATE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_TENANT +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_TENANT +-- ---------------------------- +ALTER TABLE "SYS_TENANT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_TENANT" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_TENANT +-- ---------------------------- +ALTER TABLE "SYS_TENANT" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_THIRD_ACCOUNT +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table SYS_THIRD_ACCOUNT +-- ---------------------------- +ALTER TABLE "SYS_THIRD_ACCOUNT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_THIRD_ACCOUNT" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_THIRD_ACCOUNT +-- ---------------------------- +ALTER TABLE "SYS_THIRD_ACCOUNT" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_USER +-- ---------------------------- +CREATE INDEX "IDX_SU_DEL_FLAG" +ON "SYS_USER" ("DEL_FLAG" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SU_STATUS" +ON "SYS_USER" ("STATUS" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UNIQ_SYS_USER_EMAIL" +ON "SYS_USER" ("EMAIL" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UNIQ_SYS_USER_PHONE" +ON "SYS_USER" ("PHONE" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UNIQ_SYS_USER_USERNAME" +ON "SYS_USER" ("USERNAME" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UNIQ_SYS_USER_WORK_NO" +ON "SYS_USER" ("WORK_NO" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_USER +-- ---------------------------- +ALTER TABLE "SYS_USER" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_USER" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_USER +-- ---------------------------- +ALTER TABLE "SYS_USER" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_USER_AGENT +-- ---------------------------- +CREATE INDEX "IDX_SUG_END_TIME" +ON "SYS_USER_AGENT" ("END_TIME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SUG_START_TIME" +ON "SYS_USER_AGENT" ("START_TIME" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SUG_STATUS" +ON "SYS_USER_AGENT" ("STATUS" ASC) +LOGGING +VISIBLE; +CREATE UNIQUE INDEX "UK_SUG_USER_NAME" +ON "SYS_USER_AGENT" ("USER_NAME" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_USER_AGENT +-- ---------------------------- +ALTER TABLE "SYS_USER_AGENT" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_USER_AGENT" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_USER_AGENT +-- ---------------------------- +ALTER TABLE "SYS_USER_AGENT" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_USER_DEPART +-- ---------------------------- +CREATE INDEX "IDX_SUD_DEP_ID" +ON "SYS_USER_DEPART" ("DEP_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SUD_USER_DEP_ID" +ON "SYS_USER_DEPART" ("DEP_ID" ASC, "USER_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SUD_USER_ID" +ON "SYS_USER_DEPART" ("USER_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_USER_DEPART +-- ---------------------------- +ALTER TABLE "SYS_USER_DEPART" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_USER_DEPART" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_USER_DEPART +-- ---------------------------- +ALTER TABLE "SYS_USER_DEPART" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table SYS_USER_ROLE +-- ---------------------------- +CREATE INDEX "IDX_SUR_ROLE_ID" +ON "SYS_USER_ROLE" ("ROLE_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SUR_USER_ID" +ON "SYS_USER_ROLE" ("USER_ID" ASC) +LOGGING +VISIBLE; +CREATE INDEX "IDX_SUR_USER_ROLE_ID" +ON "SYS_USER_ROLE" ("ROLE_ID" ASC, "USER_ID" ASC) +LOGGING +VISIBLE; + +-- ---------------------------- +-- Checks structure for table SYS_USER_ROLE +-- ---------------------------- +ALTER TABLE "SYS_USER_ROLE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "SYS_USER_ROLE" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table SYS_USER_ROLE +-- ---------------------------- +ALTER TABLE "SYS_USER_ROLE" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Indexes structure for table TEST_DEMO +-- ---------------------------- + +-- ---------------------------- +-- Checks structure for table TEST_DEMO +-- ---------------------------- +ALTER TABLE "TEST_DEMO" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "TEST_DEMO" ADD CHECK ("ID" IS NOT NULL); + +-- ---------------------------- +-- Primary Key structure for table TEST_DEMO +-- ---------------------------- +ALTER TABLE "TEST_DEMO" ADD PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Foreign Key structure for table "QRTZ_BLOB_TRIGGERS" +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Foreign Key structure for table "QRTZ_CRON_TRIGGERS" +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Foreign Key structure for table "QRTZ_SIMPLE_TRIGGERS" +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Foreign Key structure for table "QRTZ_SIMPROP_TRIGGERS" +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Foreign Key structure for table "QRTZ_TRIGGERS" +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD FOREIGN KEY ("SCHED_NAME", "JOB_NAME", "JOB_GROUP") REFERENCES "QRTZ_JOB_DETAILS" ("SCHED_NAME", "JOB_NAME", "JOB_GROUP"); diff --git a/db/jeroboot-sqlserver2017.sql b/db/jeroboot-sqlserver2017.sql new file mode 100644 index 00000000..4e7a1e95 --- /dev/null +++ b/db/jeroboot-sqlserver2017.sql @@ -0,0 +1,9349 @@ +/* + Navicat Premium Data Transfer + + Source Server : sqlserver_ma + Source Server Type : SQL Server + Source Server Version : 11003000 + Source Host : MMMMMM:1433 + Source Catalog : ma + Source Schema : dbo + + Target Server Type : SQL Server + Target Server Version : 11003000 + File Encoding : 65001 + + Date: 22/03/2021 17:19:04 +*/ + + +-- ---------------------------- +-- Table structure for demo +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[demo]') AND type IN ('U')) + DROP TABLE [dbo].[demo] +GO + +CREATE TABLE [dbo].[demo] ( + [id] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [key_word] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [punch_time] datetime2(7) NULL, + [salary_money] decimal(10,3) NULL, + [bonus_money] float(53) NULL, + [sex] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [age] int NULL, + [birthday] date NULL, + [email] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [content] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [sys_org_code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[demo] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'姓名', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'关键词', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'key_word' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'打卡时间', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'punch_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'工资', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'salary_money' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'奖金', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'bonus_money' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'性别 {男:1,女:2}', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'年龄', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'age' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'生日', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'birthday' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'邮箱', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'email' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'个人简介', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'所属部门编码', +'SCHEMA', N'dbo', +'TABLE', N'demo', +'COLUMN', N'sys_org_code' +GO + + +-- ---------------------------- +-- Records of demo +-- ---------------------------- +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'1353563050407936002', N'小红帽', NULL, N'2021-01-26 12:39:04.0000000', NULL, NULL, N'2', N'22', N'2021-01-25', NULL, NULL, N'admin', N'2021-01-25 12:39:14.0000000', NULL, NULL, N'A01') +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'1dc29e80be14d1400f165b5c6b30c707', N'zhang daihao', NULL, NULL, NULL, NULL, N'2', NULL, NULL, N'zhangdaiscott@163.com', NULL, NULL, NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'304e651dc769d5c9b6e08fb30457a602', N'小白兔', NULL, NULL, NULL, NULL, N'2', N'28', NULL, NULL, NULL, N'scott', N'2019-01-19 13:12:53.0000000', N'qinfeng', N'2019-01-19 13:13:12.0000000', NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'4', N'Sandy', N'开源,很好', N'2018-12-15 00:00:00.0000000', NULL, NULL, N'2', N'21', N'2018-12-15', N'test4@baomidou.com', N'聪明00', NULL, NULL, N'admin', N'2019-02-25 16:29:27.0000000', NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'4981637bf71b0c1ed1365241dfcfa0ea', N'小虎', NULL, NULL, NULL, NULL, N'2', N'28', NULL, NULL, NULL, N'scott5', N'2019-01-19 13:12:53.0000000', N'qinfeng', N'2019-01-19 13:13:12.0000000', N'A02') +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'7', N'zhangdaiscott', NULL, NULL, NULL, NULL, N'1', NULL, N'2019-01-03', NULL, NULL, NULL, NULL, NULL, NULL, N'A02A01A01') +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'73bc58611012617ca446d8999379e4ac', N'郭靖', N'777', N'2018-12-07 00:00:00.0000000', NULL, NULL, N'1', NULL, NULL, NULL, NULL, N'jero-boot', N'2019-03-28 18:16:39.0000000', N'admin', N'2020-05-02 18:14:14.0000000', N'A02A01A02') +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'917e240eaa0b1b2d198ae869b64a81c3', N'zhang daihao', NULL, NULL, NULL, NULL, N'2', N'0', N'2018-11-29', N'zhangdaiscott@163.com', NULL, NULL, NULL, NULL, NULL, N'A02') +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'94420c5d8fc4420dde1e7196154b3a24', N'秦风', NULL, NULL, NULL, NULL, N'2', NULL, NULL, NULL, NULL, N'scott', N'2019-01-19 12:54:58.0000000', N'admin', N'2020-05-02 18:14:33.0000000', NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'b86897900c770503771c7bb88e5d1e9b', N'scott1', N'开源、很好、hello', NULL, NULL, NULL, N'1', NULL, NULL, N'zhangdaiscott@163.com', NULL, N'scott', N'2019-01-19 12:22:34.0000000', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'c28fa8391ef81d6fabd8bd894a7615aa', N'小麦', NULL, NULL, NULL, NULL, N'2', NULL, NULL, N'zhangdaiscott@163.com', NULL, N'jero-boot', N'2019-04-04 17:18:09.0000000', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'c2c0d49e3c01913067cf8d1fb3c971d2', N'zhang daihao', N'', NULL, NULL, NULL, N'2', NULL, NULL, N'zhangdaiscott@163.com', N'', N'admin', N'2019-01-19 23:37:18.0000000', N'admin', N'2019-01-21 16:49:06.0000000', N'') +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'c96279c666b4b82e3ef1e4e2978701ce', N'报名时间', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, N'jero-boot', N'2019-03-28 18:00:52.0000000', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'd24668721446e8478eeeafe4db66dcff', N'zhang daihao999', NULL, NULL, NULL, NULL, N'1', NULL, NULL, N'zhangdaiscott@163.com', NULL, NULL, NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[demo] ([id], [name], [key_word], [punch_time], [salary_money], [bonus_money], [sex], [age], [birthday], [email], [content], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'eaa6c1116b41dc10a94eae34cf990133', N'zhang daihao', NULL, NULL, NULL, NULL, NULL, NULL, NULL, N'zhangdaiscott@163.com', NULL, NULL, NULL, NULL, NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for jero_order_customer +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[jero_order_customer]') AND type IN ('U')) + DROP TABLE [dbo].[jero_order_customer] +GO + +CREATE TABLE [dbo].[jero_order_customer] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [sex] nvarchar(4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [idcard] nvarchar(18) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [idcard_pic] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [telphone] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [order_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[jero_order_customer] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户名', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'性别', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'身份证号码', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'idcard' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'身份证扫描件', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'idcard_pic' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'电话1', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'telphone' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'外键', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_customer', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of jero_order_customer +-- ---------------------------- +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256527640480821249', N'scott', N'2', NULL, NULL, NULL, N'b190737bd04cca8360e6f87c9ef9ec4e', N'admin', N'2020-05-02 18:15:09.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256527640531152898', N'x秦风', N'1', NULL, NULL, NULL, N'b190737bd04cca8360e6f87c9ef9ec4e', N'admin', N'2020-05-02 18:15:09.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256527874216800257', N'小王1', N'1', N'', NULL, N'', N'9a57c850e4f68cf94ef7d8585dbaf7e6', N'admin', N'2020-05-02 18:17:37.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15538561502720', N'3333', N'1', N'', NULL, N'', N'0d4a2e67b538ee1bc881e5ed34f670f0', N'jero-boot', N'2019-03-29 18:42:55.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15538561512681', N'3332333', N'2', N'', NULL, N'', N'0d4a2e67b538ee1bc881e5ed34f670f0', N'jero-boot', N'2019-03-29 18:42:55.0000000', N'admin', N'2019-03-29 18:43:12.0000000') +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15538561550142', N'4442', N'2', N'', NULL, N'', N'0d4a2e67b538ee1bc881e5ed34f670f0', N'jero-boot', N'2019-03-29 18:42:55.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15541168497342', N'444', N'', N'', N'', N'', N'f71f7f8930b5b6b1703d9948d189982b', N'admin', N'2019-04-01 19:08:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15541168499553', N'5555', N'', N'', N'', N'', N'f71f7f8930b5b6b1703d9948d189982b', N'admin', N'2019-04-01 19:08:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'18dc5eb1068ccdfe90e358951ca1a3d6', N'dr2', N'', N'', N'', N'', N'8ab1186410a65118c4d746eb085d3bed', N'admin', N'2019-04-04 17:25:33.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'195d280490fe88ca1475512ddcaf2af9', N'12', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'217a2bf83709775d2cd85bf598392327', N'2', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'22bc052ae53ed09913b946abba93fa89', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'23bafeae88126c3bf3322a29a04f0d5e', N'x秦风', NULL, NULL, NULL, NULL, N'163e2efcbc6d7d54eb3f8a137da8a75a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'25c4a552c6843f36fad6303bfa99a382', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'2d32144e2bee63264f3f16215c258381', N'33333', N'2', NULL, NULL, NULL, N'd908bfee3377e946e59220c4a4eb414a', N'admin', N'2019-04-01 16:27:03.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'2d43170d6327f941bd1a017999495e25', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'2e5f62a8b6e0a0ce19b52a6feae23d48', N'3', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'34a1c5cf6cee360ed610ed0bed70e0f9', N'导入秦风', NULL, NULL, NULL, NULL, N'a2cce75872cc8fcc47f78de9ffd378c2', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'3c87400f8109b4cf43c5598f0d40e34d', N'2', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'40964bcbbecb38e5ac15e6d08cf3cd43', N'233', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'41e3dee0b0b6e6530eccb7fbb22fd7a3', N'4555', N'1', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'4808ae8344c7679a4a2f461db5dc3a70', N'44', N'1', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'4b6cef12f195fad94d57279b2241770d', N'dr12', N'', N'', N'', N'', N'8ab1186410a65118c4d746eb085d3bed', N'admin', N'2019-04-04 17:25:33.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'524e695283f8e8c256cc24f39d6d8542', N'小王', N'2', N'370285198604033222', NULL, N'18611788674', N'eb13ab35d2946a2b0cfe3452bca1e73f', N'admin', N'2019-02-25 16:29:41.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'57c2a8367db34016114cbc9fa368dba0', N'2', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'5df36a1608b8c7ac99ad9bc408fe54bf', N'4', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6c6fd2716c2dcd044ed03c2c95d261f8', N'李四', N'2', N'370285198602058833', N'', N'18611788676', N'f71f7f8930b5b6b1703d9948d189982b', N'admin', N'2019-04-01 19:08:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'742d008214dee0afff2145555692973e', N'秦风', N'1', N'370285198602058822', NULL, N'18611788676', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'7469c3e5d371767ff90a739d297689b5', N'导入秦风', N'2', NULL, NULL, NULL, N'3a867ebf2cebce9bae3f79676d8d86f3', N'jero-boot', N'2019-03-29 18:43:59.0000000', N'admin', N'2019-04-08 17:35:02.0000000') +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'7a96e2c7b24847d4a29940dbc0eda6e5', N'drscott', NULL, NULL, NULL, NULL, N'e73434dad84ebdce2d4e0c2a2f06d8ea', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'7f5a40818e225ee18bda6da7932ac5f9', N'2', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8011575abfd7c8085e71ff66df1124b9', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8404f31d7196221a573c9bd6c8f15003', N'小张', N'1', N'370285198602058211', NULL, N'18611788676', N'eb13ab35d2946a2b0cfe3452bca1e73f', N'admin', N'2019-02-25 16:29:41.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'859020e10a2f721f201cdbff78cf7b9f', N'scott', NULL, NULL, NULL, NULL, N'163e2efcbc6d7d54eb3f8a137da8a75a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8cc3c4d26e3060975df3a2adb781eeb4', N'dr33', NULL, NULL, NULL, NULL, N'b2feb454e43c46b2038768899061e464', N'jero-boot', N'2019-04-04 17:23:09.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8d1725c23a6a50685ff0dedfd437030d', N'4', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'933cae3a79f60a93922d59aace5346ce', N'小王', NULL, N'370285198604033222', NULL, N'18611788674', N'6a719071a29927a14f19482f8693d69a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'9bdb5400b709ba4eaf3444de475880d7', N'dr22', NULL, NULL, NULL, NULL, N'22c17790dcd04b296c4a2a089f71895f', N'jero-boot', N'2019-04-04 17:23:09.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'9f87677f70e5f864679314389443a3eb', N'33', N'2', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'a2c2b7101f75c02deb328ba777137897', N'44', N'2', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'ab4d002dc552c326147e318c87d3bed4', N'小红1', N'1', N'370285198604033222', NULL, N'18611755848', N'9a57c850e4f68cf94ef7d8585dbaf7e6', N'admin', N'2020-05-02 18:17:37.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'ad116f722a438e5f23095a0b5fcc8e89', N'dr秦风', NULL, NULL, NULL, NULL, N'e73434dad84ebdce2d4e0c2a2f06d8ea', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b1ba147b75f5eaa48212586097fc3fd1', N'2', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b43bf432c251f0e6b206e403b8ec29bc', N'lisi', NULL, NULL, NULL, NULL, N'f8889aaef6d1bccffd98d2889c0aafb5', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'bcdd300a7d44c45a66bdaac14903c801', N'33', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'beb983293e47e2dc1a9b3d649aa3eb34', N'ddd3', NULL, NULL, NULL, NULL, N'd908bfee3377e946e59220c4a4eb414a', N'admin', N'2019-04-01 16:27:03.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c219808196406f1b8c7f1062589de4b5', N'44', N'1', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c8ed061d4b27c0c7a64e100f2b1c8ab5', N'张经理', N'2', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'cc5de4af7f06cd6d250965ebe92a0395', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'cf8817bd703bf7c7c77a2118edc26cc7', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'd72b26fae42e71270fce2097a88da58a', N'导入scott', NULL, N'www', NULL, NULL, N'3a867ebf2cebce9bae3f79676d8d86f3', N'jero-boot', N'2019-03-29 18:43:59.0000000', N'admin', N'2019-04-08 17:35:05.0000000') +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'dbdc60a6ac1a8c43f24afee384039b68', N'xiaowang', NULL, NULL, NULL, NULL, N'f8889aaef6d1bccffd98d2889c0aafb5', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'dc5883b50466de94d900919ed96d97af', N'33', N'1', N'370285198602058823', NULL, N'18611788674', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'deeb73e553ad8dc0a0b3cfd5a338de8e', N'3333', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e2570278bf189ac05df3673231326f47', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e39cb23bb950b2bdedfc284686c6128a', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e46fe9111a9100844af582a18a2aa402', N'1', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'ee7af0acb9beb9bf8d8b3819a8a7fdc3', N'2', NULL, NULL, NULL, NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f5d2605e844192d9e548f9bd240ac908', N'小张', NULL, N'370285198602058211', NULL, N'18611788676', N'6a719071a29927a14f19482f8693d69a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_customer] ([id], [name], [sex], [idcard], [idcard_pic], [telphone], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f6db6547382126613a3e46e7cd58a5f2', N'导入scott', NULL, NULL, NULL, NULL, N'a2cce75872cc8fcc47f78de9ffd378c2', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for jero_order_main +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[jero_order_main]') AND type IN ('U')) + DROP TABLE [dbo].[jero_order_main] +GO + +CREATE TABLE [dbo].[jero_order_main] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [order_code] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ctype] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [order_date] datetime2(7) NULL, + [order_money] float(53) NULL, + [content] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[jero_order_main] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单号', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'order_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单类型', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'ctype' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单日期', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'order_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单金额', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'order_money' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单备注', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_main', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of jero_order_main +-- ---------------------------- +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'163e2efcbc6d7d54eb3f8a137da8a75a', N'B100', NULL, NULL, N'3000', NULL, N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'3a867ebf2cebce9bae3f79676d8d86f3', N'导入B100', N'2222', NULL, N'3000', NULL, N'jero-boot', N'2019-03-29 18:43:59.0000000', N'admin', N'2019-04-08 17:35:13.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'4cba137333127e8e31df7ad168cc3732', N'青岛订单A0001', N'2', N'2019-04-03 10:56:07.0000000', NULL, NULL, N'admin', N'2019-04-03 10:56:11.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'54e739bef5b67569c963c38da52581ec', N'NC911', N'1', N'2019-02-18 09:58:51.0000000', N'40', NULL, N'admin', N'2019-02-18 09:58:47.0000000', N'admin', N'2019-02-18 09:58:59.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6a719071a29927a14f19482f8693d69a', N'c100', NULL, NULL, N'5000', NULL, N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8ab1186410a65118c4d746eb085d3bed', N'导入400', N'1', N'2019-02-18 09:58:51.0000000', N'40', NULL, N'admin', N'2019-02-18 09:58:47.0000000', N'admin', N'2019-02-18 09:58:59.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'9a57c850e4f68cf94ef7d8585dbaf7e6', N'halou001', N'1', N'2019-04-04 17:30:32.0000000', N'500', NULL, N'admin', N'2019-04-04 17:30:41.0000000', N'admin', N'2020-05-02 18:17:36.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'a2cce75872cc8fcc47f78de9ffd378c2', N'导入B100', NULL, NULL, N'3000', NULL, N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b190737bd04cca8360e6f87c9ef9ec4e', N'B0018888', N'1', NULL, NULL, NULL, N'admin', N'2019-02-15 18:39:29.0000000', N'admin', N'2020-05-02 18:15:09.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'd908bfee3377e946e59220c4a4eb414a', N'SSSS001', NULL, NULL, N'599', NULL, N'admin', N'2019-04-01 15:43:03.0000000', N'admin', N'2019-04-01 16:26:52.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e73434dad84ebdce2d4e0c2a2f06d8ea', N'导入200', NULL, NULL, N'3000', NULL, N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'eb13ab35d2946a2b0cfe3452bca1e73f', N'BJ9980', N'1', NULL, N'90', NULL, N'admin', N'2019-02-16 17:36:42.0000000', N'admin', N'2019-02-16 17:46:16.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f71f7f8930b5b6b1703d9948d189982b', N'BY911', NULL, N'2019-04-06 19:08:39.0000000', NULL, NULL, N'admin', N'2019-04-01 16:36:02.0000000', N'admin', N'2019-04-01 16:36:08.0000000') +GO + +INSERT INTO [dbo].[jero_order_main] ([id], [order_code], [ctype], [order_date], [order_money], [content], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f8889aaef6d1bccffd98d2889c0aafb5', N'A100', NULL, N'2018-10-10 00:00:00.0000000', N'6000', NULL, N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for jero_order_ticket +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[jero_order_ticket]') AND type IN ('U')) + DROP TABLE [dbo].[jero_order_ticket] +GO + +CREATE TABLE [dbo].[jero_order_ticket] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [ticket_code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [tickect_date] datetime2(7) NULL, + [order_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[jero_order_ticket] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'航班号', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'ticket_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'航班时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'tickect_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'外键', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'jero_order_ticket', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of jero_order_ticket +-- ---------------------------- +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'0f0e3a40a215958f807eea08a6e1ac0a', N'88', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'0fa3bd0bbcf53650c0bb3c0cac6d8cb7', N'ffff', N'2019-02-21 00:00:00.0000000', N'eb13ab35d2946a2b0cfe3452bca1e73f', N'admin', N'2019-02-25 16:29:41.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256527640543735810', N'222', N'2019-02-23 00:00:00.0000000', N'b190737bd04cca8360e6f87c9ef9ec4e', N'admin', N'2020-05-02 18:15:09.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256527640560513025', N'111', N'2019-02-01 00:00:00.0000000', N'b190737bd04cca8360e6f87c9ef9ec4e', N'admin', N'2020-05-02 18:15:09.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'14221afb4f5f749c1deef26ac56fdac3', N'33', N'2019-03-09 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15538561502730', N'222', NULL, N'0d4a2e67b538ee1bc881e5ed34f670f0', N'jero-boot', N'2019-03-29 18:42:55.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15538561526461', N'2244', N'2019-03-29 00:00:00.0000000', N'0d4a2e67b538ee1bc881e5ed34f670f0', N'jero-boot', N'2019-03-29 18:42:55.0000000', N'admin', N'2019-03-29 18:43:26.0000000') +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15541168478913', N'hhhhh', NULL, N'f71f7f8930b5b6b1703d9948d189982b', N'admin', N'2019-04-01 19:08:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'18905bc89ee3851805aab38ed3b505ec', N'44', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1f809cbd26f4e574697e1c10de575d72', N'A100', NULL, N'e73434dad84ebdce2d4e0c2a2f06d8ea', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'21051adb51529bdaa8798b5a3dd7f7f7', N'C10029', N'2019-02-20 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'269576e766b917f8b6509a2bb0c4d4bd', N'A100', NULL, N'163e2efcbc6d7d54eb3f8a137da8a75a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'2d473ffc79e5b38a17919e15f8b7078e', N'66', N'2019-03-29 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'3655b66fca5fef9c6aac6d70182ffda2', N'AA123', N'2019-04-01 00:00:00.0000000', N'd908bfee3377e946e59220c4a4eb414a', N'admin', N'2019-04-01 16:27:03.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'365d5919155473ade45840fd626c51a9', N'dddd', N'2019-04-04 17:25:29.0000000', N'8ab1186410a65118c4d746eb085d3bed', N'admin', N'2019-04-04 17:25:33.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'4889a782e78706ab4306a925cfb163a5', N'C34', N'2019-04-01 00:00:00.0000000', N'd908bfee3377e946e59220c4a4eb414a', N'admin', N'2019-04-01 16:35:00.0000000', N'admin', N'2019-04-01 16:35:07.0000000') +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'48d385796382cf87fa4bdf13b42d9a28', N'导入A100', NULL, N'3a867ebf2cebce9bae3f79676d8d86f3', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'541faed56efbeb4be9df581bd8264d3a', N'88', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'57a27a7dfd6a48e7d981f300c181b355', N'6', N'2019-03-30 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'5ce4dc439c874266e42e6c0ff8dc8b5c', N'导入A100', NULL, N'a2cce75872cc8fcc47f78de9ffd378c2', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'645a06152998a576c051474157625c41', N'88', N'2019-04-04 17:25:31.0000000', N'8ab1186410a65118c4d746eb085d3bed', N'admin', N'2019-04-04 17:25:33.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6e3562f2571ea9e96b2d24497b5f5eec', N'55', N'2019-03-23 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8fd2b389151568738b1cc4d8e27a6110', N'导入A100', NULL, N'a2cce75872cc8fcc47f78de9ffd378c2', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'93f1a84053e546f59137432ff5564cac', N'55', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'969ddc5d2e198d50903686917f996470', N'A10029', N'2019-04-01 00:00:00.0000000', N'f71f7f8930b5b6b1703d9948d189982b', N'admin', N'2019-04-01 19:08:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'96e7303a8d22a5c384e08d7bcf7ac2bf', N'A100', NULL, N'e73434dad84ebdce2d4e0c2a2f06d8ea', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'9e8a3336f6c63f558f2b68ce2e1e666e', N'深圳1001', N'2020-05-02 00:00:00.0000000', N'9a57c850e4f68cf94ef7d8585dbaf7e6', N'admin', N'2020-05-02 18:17:37.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'a28db02c810c65660015095cb81ed434', N'A100', NULL, N'f8889aaef6d1bccffd98d2889c0aafb5', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b217bb0e4ec6a45b6cbf6db880060c0f', N'A100', NULL, N'6a719071a29927a14f19482f8693d69a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'ba708df70bb2652ed1051a394cfa0bb3', N'333', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'beabbfcb195d39bedeeafe8318794562', N'A1345', N'2019-04-01 00:00:00.0000000', N'd908bfee3377e946e59220c4a4eb414a', N'admin', N'2019-04-01 16:27:04.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'bf450223cb505f89078a311ef7b6ed16', N'777', N'2019-03-30 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c06165b6603e3e1335db187b3c841eef', N'北京2001', N'2020-05-23 00:00:00.0000000', N'9a57c850e4f68cf94ef7d8585dbaf7e6', N'admin', N'2020-05-02 18:17:37.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c113136abc26ace3a6da4e41d7dc1c7e', N'44', N'2019-03-15 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c1abdc2e30aeb25de13ad6ee3488ac24', N'77', N'2019-03-22 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c23751a7deb44f553ce50a94948c042a', N'33', N'2019-03-09 00:00:00.0000000', N'8ab1186410a65118c4d746eb085d3bed', N'admin', N'2019-04-04 17:25:33.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c64547666b634b3d6a0feedcf05f25ce', N'C10019', N'2019-04-01 00:00:00.0000000', N'f71f7f8930b5b6b1703d9948d189982b', N'admin', N'2019-04-01 19:08:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c8b8d3217f37da78dddf711a1f7da485', N'A100', NULL, N'163e2efcbc6d7d54eb3f8a137da8a75a', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'cab691c1c1ff7a6dfd7248421917fd3c', N'A100', NULL, N'f8889aaef6d1bccffd98d2889c0aafb5', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'cca10a9a850b456d9b72be87da7b0883', N'77', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'd2fbba11f4814d9b1d3cb1a3f342234a', N'C10019', N'2019-02-18 00:00:00.0000000', N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'dbdb07a16826808e4276e84b2aa4731a', N'导入A100', NULL, N'3a867ebf2cebce9bae3f79676d8d86f3', N'jero-boot', N'2019-03-29 18:43:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e7075639c37513afc0bbc4bf7b5d98b9', N'88', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'fa759dc104d0371f8aa28665b323dab6', N'888', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[jero_order_ticket] ([id], [ticket_code], [tickect_date], [order_id], [create_by], [create_time], [update_by], [update_time]) VALUES (N'ff197da84a9a3af53878eddc91afbb2e', N'33', NULL, N'54e739bef5b67569c963c38da52581ec', N'admin', N'2019-03-15 16:50:15.0000000', NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for joa_demo +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[joa_demo]') AND type IN ('U')) + DROP TABLE [dbo].[joa_demo] +GO + +CREATE TABLE [dbo].[joa_demo] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [days] int NULL, + [begin_date] datetime2(7) NULL, + [end_date] datetime2(7) NULL, + [reason] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [bpm_status] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[joa_demo] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'ID', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假人', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假天数', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'days' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始时间', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'begin_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假结束时间', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'end_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假原因', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'reason' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程状态', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'bpm_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人id', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人id', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程测试', +'SCHEMA', N'dbo', +'TABLE', N'joa_demo' +GO + + +-- ---------------------------- +-- Records of joa_demo +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_auth_data +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_auth_data]') AND type IN ('U')) + DROP TABLE [dbo].[onl_auth_data] +GO + +CREATE TABLE [dbo].[onl_auth_data] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgform_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_column] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_operator] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_value] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] int NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[onl_auth_data] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'online表ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'cgform_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则名', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'rule_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则列', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'rule_column' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则条件 大于小于like', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'rule_operator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则值', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'rule_value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'1有效 0无效', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_data', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of onl_auth_data +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_auth_page +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_auth_page]') AND type IN ('U')) + DROP TABLE [dbo].[onl_auth_page] +GO + +CREATE TABLE [dbo].[onl_auth_page] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgform_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [code] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [type] int NULL, + [control] int NULL, + [page] int NULL, + [status] int NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[onl_auth_page] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N' 主键', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'online表id', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'cgform_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段名/按钮编码', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'1字段 2按钮', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'3可编辑 5可见(仅支持两种状态值3,5)', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'control' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'3列表 5表单(仅支持两种状态值3,5)', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'page' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'1有效 0无效', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_page', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of onl_auth_page +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_auth_relation +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_auth_relation]') AND type IN ('U')) + DROP TABLE [dbo].[onl_auth_relation] +GO + +CREATE TABLE [dbo].[onl_auth_relation] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [role_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [auth_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [type] int NULL, + [cgform_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_auth_relation] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色id', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_relation', +'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限id', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_relation', +'COLUMN', N'auth_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'1字段 2按钮 3数据权限', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_relation', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'online表单ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_auth_relation', +'COLUMN', N'cgform_id' +GO + + +-- ---------------------------- +-- Records of onl_auth_relation +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_cgform_button +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_button]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_button] +GO + +CREATE TABLE [dbo].[onl_cgform_button] ( + [ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [BUTTON_CODE] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BUTTON_ICON] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BUTTON_NAME] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BUTTON_STATUS] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BUTTON_STYLE] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [EXP] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CGFORM_HEAD_ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [OPT_TYPE] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ORDER_NUM] int NULL, + [OPT_POSITION] nvarchar(3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_button] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'ID' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮编码', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'BUTTON_CODE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮图标', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'BUTTON_ICON' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'BUTTON_NAME' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮状态', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'BUTTON_STATUS' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮样式', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'BUTTON_STYLE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表达式', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'EXP' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'CGFORM_HEAD_ID' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'OPT_TYPE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'ORDER_NUM' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮位置1侧面 2底部', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button', +'COLUMN', N'OPT_POSITION' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Online表单自定义按钮', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_button' +GO + + +-- ---------------------------- +-- Records of onl_cgform_button +-- ---------------------------- +INSERT INTO [dbo].[onl_cgform_button] ([ID], [BUTTON_CODE], [BUTTON_ICON], [BUTTON_NAME], [BUTTON_STATUS], [BUTTON_STYLE], [EXP], [CGFORM_HEAD_ID], [OPT_TYPE], [ORDER_NUM], [OPT_POSITION]) VALUES (N'cc1d12de57a1a41d3986ed6d13e3ac11', N'链接按钮测试', N'icon-edit', N'自定义link', N'1', N'link', NULL, N'd35109c3632c4952a19ecc094943dd71', N'js', NULL, N'2') +GO + +INSERT INTO [dbo].[onl_cgform_button] ([ID], [BUTTON_CODE], [BUTTON_ICON], [BUTTON_NAME], [BUTTON_STATUS], [BUTTON_STYLE], [EXP], [CGFORM_HEAD_ID], [OPT_TYPE], [ORDER_NUM], [OPT_POSITION]) VALUES (N'ebcc48ef0bde4433a6faf940a5e170c1', N'button按钮测试', N'icon-edit', N'自定义button', N'1', N'button', NULL, N'd35109c3632c4952a19ecc094943dd71', N'js', NULL, N'2') +GO + + +-- ---------------------------- +-- Table structure for onl_cgform_enhance_java +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_enhance_java]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_enhance_java] +GO + +CREATE TABLE [dbo].[onl_cgform_enhance_java] ( + [ID] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [BUTTON_CODE] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CG_JAVA_TYPE] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CG_JAVA_VALUE] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CGFORM_HEAD_ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [ACTIVE_STATUS] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [EVENT] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_enhance_java] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮编码', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_java', +'COLUMN', N'BUTTON_CODE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_java', +'COLUMN', N'CG_JAVA_TYPE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数值', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_java', +'COLUMN', N'CG_JAVA_VALUE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_java', +'COLUMN', N'CGFORM_HEAD_ID' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'生效状态', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_java', +'COLUMN', N'ACTIVE_STATUS' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'事件状态(end:结束,start:开始)', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_java', +'COLUMN', N'EVENT' +GO + + +-- ---------------------------- +-- Records of onl_cgform_enhance_java +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_cgform_enhance_js +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_enhance_js]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_enhance_js] +GO + +CREATE TABLE [dbo].[onl_cgform_enhance_js] ( + [ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CG_JS] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CG_JS_TYPE] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CONTENT] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CGFORM_HEAD_ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_enhance_js] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_js', +'COLUMN', N'ID' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'JS增强内容', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_js', +'COLUMN', N'CG_JS' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_js', +'COLUMN', N'CG_JS_TYPE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_js', +'COLUMN', N'CONTENT' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_js', +'COLUMN', N'CGFORM_HEAD_ID' +GO + + +-- ---------------------------- +-- Records of onl_cgform_enhance_js +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_cgform_enhance_sql +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_enhance_sql]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_enhance_sql] +GO + +CREATE TABLE [dbo].[onl_cgform_enhance_sql] ( + [ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [BUTTON_CODE] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CGB_SQL] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CGB_SQL_NAME] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CONTENT] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [CGFORM_HEAD_ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_enhance_sql] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_sql', +'COLUMN', N'ID' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮编码', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_sql', +'COLUMN', N'BUTTON_CODE' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'SQL内容', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_sql', +'COLUMN', N'CGB_SQL' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Sql名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_sql', +'COLUMN', N'CGB_SQL_NAME' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_sql', +'COLUMN', N'CONTENT' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_enhance_sql', +'COLUMN', N'CGFORM_HEAD_ID' +GO + + +-- ---------------------------- +-- Records of onl_cgform_enhance_sql +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_cgform_field +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_field]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_field] +GO + +CREATE TABLE [dbo].[onl_cgform_field] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgform_head_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [db_field_name] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [db_field_txt] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_field_name_old] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_is_key] tinyint NULL, + [db_is_null] tinyint NULL, + [db_type] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [db_length] int NOT NULL, + [db_point_length] int NULL, + [db_default_val] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [dict_field] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [dict_table] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [dict_text] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_show_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_href] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_length] int NULL, + [field_valid_type] nvarchar(300) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_must_input] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_extend_json] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_default_value] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [is_query] tinyint NULL, + [is_show_form] tinyint NULL, + [is_show_list] tinyint NULL, + [is_read_only] tinyint NULL, + [query_mode] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [main_table] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [main_field] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [order_num] int NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [converter] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_def_val] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_dict_text] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_dict_field] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_dict_table] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_show_type] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_config_flag] nvarchar(3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_valid_type] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_must_input] nvarchar(3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [sort_flag] nvarchar(3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_field] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'cgform_head_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段名字', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_field_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段备注', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_field_txt' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'原字段名', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_field_name_old' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否主键 0否 1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_is_key' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否允许为空0否 1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_is_null' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据库字段类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据库字段长度', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_length' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'小数点', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_point_length' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表字段默认值', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'db_default_val' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典code', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'dict_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典表', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'dict_table' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典Text', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'dict_text' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单控件类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_show_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'跳转URL', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_href' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单控件长度', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_length' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单字段校验规则', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_valid_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段是否必填', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_must_input' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'扩展参数JSON', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_extend_json' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'控件默认值,不同的表达式展示不同的结果。 +1. 纯字符串直接赋给默认值; +2. #{普通变量}; +3. {{ 动态JS表达式 }}; +4. ${填值规则编码}; +填值规则表达式只允许存在一个,且不能和其他规则混用。', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'field_default_value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否查询条件0否 1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'is_query' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单是否显示0否 1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'is_show_form' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'列表是否显示0否 1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'is_show_list' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否是只读(1是 0否)', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'is_read_only' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询模式', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_mode' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'外键主表名', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'main_table' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'外键主键字段', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'main_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'order_num' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'自定义值转换器', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'converter' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询默认值', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_def_val' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询配置字典text', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_dict_text' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询配置字典code', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_dict_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询配置字典table', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_dict_table' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询显示控件', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_show_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否启用查询配置1是0否', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_config_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询字段校验类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_valid_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询字段是否必填1是0否', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'query_must_input' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否支持排序1是0否', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_field', +'COLUMN', N'sort_flag' +GO + + +-- ---------------------------- +-- Records of onl_cgform_field +-- ---------------------------- +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'04e4185a503e6aaaa31c243829ff4ac7', N'd35109c3632c4952a19ecc094943dd71', N'birthday', N'生日', NULL, N'0', N'1', N'Date', N'32', N'0', N'', N'', N'', N'', N'date', N'', N'120', N'', N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'10', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'191705159cea35e8cbacb326f172be94', N'd35109c3632c4952a19ecc094943dd71', N'search_sel', N'搜索下拉', NULL, N'0', N'1', N'string', N'100', N'0', N'', N'role_code', N'sys_role', N'role_name', N'sel_search', N'', N'120', NULL, N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'18', N'admin', N'2021-03-16 17:09:22.0000000', N'2020-11-26 18:02:20.0000000', N'admin', N'', N'', N'', N'', N'', N'text', N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'20ff34fb0466089cb633d73d5a6f08d6', N'd35109c3632c4952a19ecc094943dd71', N'update_time', N'更新日期', NULL, N'0', N'1', N'Date', N'20', N'0', N'', N'', N'', N'', N'text', N'', N'120', N'', N'0', N'', N'', N'0', N'0', N'0', N'0', N'single', N'', N'', N'5', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'242cc59b23965a92161eca69ffdbf018', N'd35109c3632c4952a19ecc094943dd71', N'age', N'年龄', NULL, N'0', N'1', N'int', N'32', N'0', N'', N'', N'', N'', N'text', N'http://www.baidu.com', N'120', N'', N'0', N'', N'', N'0', N'1', N'1', N'0', N'single', N'', N'', N'8', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'3acd1b022fd8cb6b99534161fa3d6a24', N'd35109c3632c4952a19ecc094943dd71', N'ceck', N'checkbox', NULL, N'0', N'1', N'string', N'32', N'0', N'', N'sex', N'', N'', N'checkbox', N'', N'120', NULL, N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'16', N'admin', N'2021-03-16 17:09:22.0000000', N'2020-11-26 18:02:20.0000000', N'admin', N'', N'', N'', N'', N'', N'text', N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'3cd2061ea15ce9eeb4b7cf2e544ccb6b', N'd35109c3632c4952a19ecc094943dd71', N'file_kk', N'附件', NULL, N'0', N'1', N'String', N'500', N'0', N'', N'', N'', N'', N'file', N'', N'120', NULL, N'0', N'', N'', N'0', N'1', N'1', N'0', N'single', N'', N'', N'13', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-06-10 20:06:57.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'47fa05530f3537a1be8f9e7a9e98be82', N'd35109c3632c4952a19ecc094943dd71', N'sex', N'性别', NULL, N'0', N'1', N'string', N'32', N'0', N'', N'sex', N'', N'', N'list', N'', N'120', N'', N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'7', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'1') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'509a4f63f02e784bc04499a6a9be8528', N'd35109c3632c4952a19ecc094943dd71', N'update_by', N'更新人登录名称', NULL, N'0', N'1', N'string', N'50', N'0', N'', N'', N'', N'', N'text', N'', N'120', N'', N'0', N'', N'', N'0', N'0', N'0', N'0', N'single', N'', N'', N'4', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'5b17ba693745c258f6b66380ac851e5f', N'd35109c3632c4952a19ecc094943dd71', N'id', N'主键', NULL, N'1', N'0', N'string', N'36', N'0', N'', N'', N'', N'', N'text', N'', N'120', N'', N'0', N'', N'', N'0', N'1', N'1', N'0', N'single', N'', N'', N'1', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'6a30c2e6f01ddd24349da55a37025cc0', N'd35109c3632c4952a19ecc094943dd71', N'top_pic', N'头像', NULL, N'0', N'1', N'String', N'500', N'0', N'', N'', N'', N'', N'image', N'', N'120', NULL, N'0', N'', N'', N'0', N'1', N'1', N'0', N'single', N'', N'', N'12', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-06-10 20:06:56.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'88de72456c03410c364c80095aaa96eb', N'd35109c3632c4952a19ecc094943dd71', N'pop', N'弹窗', NULL, N'0', N'1', N'string', N'32', N'0', N'', N'', N'', N'', N'text', N'', N'120', NULL, N'0', N'', N'', N'0', N'1', N'1', N'0', N'single', N'', N'', N'15', N'admin', N'2021-03-16 17:09:22.0000000', N'2020-11-26 18:02:20.0000000', N'admin', N'', N'', N'', N'', N'', N'text', N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'90a822b8a63bbbc1e9575c9f4e21e021', N'd35109c3632c4952a19ecc094943dd71', N'descc', N'描述', NULL, N'0', N'1', N'string', N'500', N'0', N'', N'', N'', N'', N'umeditor', N'', N'120', N'', N'0', N'', N'', N'0', N'1', N'1', N'0', N'single', N'', N'', N'9', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'ba17414716b12b51c85f9d1f6f1e5787', N'd35109c3632c4952a19ecc094943dd71', N'chegnshi', N'城市', NULL, N'0', N'1', N'string', N'300', N'0', N'', N'', N'', N'', N'pca', N'', N'120', NULL, N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'14', N'admin', N'2021-03-16 17:09:22.0000000', N'2020-11-26 16:54:45.0000000', N'admin', N'', N'', N'', N'', N'', N'text', N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'be868eed386da3cfcf49ea9afcdadf11', N'd35109c3632c4952a19ecc094943dd71', N'create_time', N'创建日期', NULL, N'0', N'1', N'Date', N'20', N'0', N'', N'', N'', N'', N'text', N'', N'120', N'', N'0', N'', N'', N'0', N'0', N'0', N'0', N'single', N'', N'', N'3', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'cb7da49a981a1b0acc5f7e8a0130bdcd', N'd35109c3632c4952a19ecc094943dd71', N'user_code', N'用户编码', NULL, N'0', N'1', N'String', N'32', N'0', N'', N'', N'', N'', N'text', N'', N'120', NULL, N'0', N'', N'', N'1', N'1', N'0', N'0', N'single', N'', N'', N'11', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-05-11 16:26:37.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'd4d8cae3cd9ea93e378fc14303eee105', N'd35109c3632c4952a19ecc094943dd71', N'create_by', N'创建人登录名称', NULL, N'0', N'1', N'string', N'50', N'0', N'', N'', N'', N'', N'text', N'', N'120', N'', N'0', N'', N'', N'0', N'0', N'0', N'0', N'single', N'', N'', N'2', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'e50b4398731e06572c247993a0dcc38d', N'd35109c3632c4952a19ecc094943dd71', N'name', N'用户名', NULL, N'0', N'1', N'string', N'200', N'0', N'', N'', N'', N'', N'text', N'', N'120', N'*', N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'6', N'admin', N'2021-03-16 17:09:22.0000000', N'2019-03-15 14:24:35.0000000', N'admin', N'', N'', N'', N'', N'', NULL, N'0', NULL, NULL, N'1') +GO + +INSERT INTO [dbo].[onl_cgform_field] ([id], [cgform_head_id], [db_field_name], [db_field_txt], [db_field_name_old], [db_is_key], [db_is_null], [db_type], [db_length], [db_point_length], [db_default_val], [dict_field], [dict_table], [dict_text], [field_show_type], [field_href], [field_length], [field_valid_type], [field_must_input], [field_extend_json], [field_default_value], [is_query], [is_show_form], [is_show_list], [is_read_only], [query_mode], [main_table], [main_field], [order_num], [update_by], [update_time], [create_time], [create_by], [converter], [query_def_val], [query_dict_text], [query_dict_field], [query_dict_table], [query_show_type], [query_config_flag], [query_valid_type], [query_must_input], [sort_flag]) VALUES (N'f6076d9c662a0adddb39a91cccb4c993', N'd35109c3632c4952a19ecc094943dd71', N'xiamuti', N'下拉多选', NULL, N'0', N'1', N'string', N'100', N'0', N'', N'sex', N'', N'', N'list_multi', N'', N'120', NULL, N'0', N'', N'', N'1', N'1', N'1', N'0', N'single', N'', N'', N'17', N'admin', N'2021-03-16 17:09:22.0000000', N'2020-11-26 18:02:20.0000000', N'admin', N'', N'', N'', N'', N'', N'text', N'0', NULL, NULL, N'0') +GO + + +-- ---------------------------- +-- Table structure for onl_cgform_head +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_head]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_head] +GO + +CREATE TABLE [dbo].[onl_cgform_head] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [table_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [table_type] int NOT NULL, + [table_version] int NULL, + [table_txt] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [is_checkbox] nvarchar(5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [is_db_synch] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [is_page] nvarchar(5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [is_tree] nvarchar(5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [id_sequence] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [id_type] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [query_mode] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [relation_type] int NULL, + [sub_table_str] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [tab_order_num] int NULL, + [tree_parent_id_field] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [tree_id_field] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [tree_fieldname] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [form_category] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [form_template] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [form_template_mobile] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [scroll] int NULL, + [copy_version] int NULL, + [copy_type] int NULL, + [physic_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [theme_template] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [is_des_form] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [des_form_code] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_head] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表名', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'table_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表类型: 0单表、1主表、2附表', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'table_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表版本', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'table_version' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表说明', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'table_txt' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否带checkbox', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'is_checkbox' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'同步数据库状态', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'is_db_synch' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否分页', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'is_page' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否是树', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'is_tree' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键生成序列', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'id_sequence' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'id_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询模式', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'query_mode' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'映射关系 0一对多 1一对一', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'relation_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'子表', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'sub_table_str' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'附表排序序号', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'tab_order_num' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'树形表单父id', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'tree_parent_id_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'树表主键字段', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'tree_id_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'树开表单列字段', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'tree_fieldname' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单分类', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'form_category' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'PC表单模板', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'form_template' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单模板样式(移动端)', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'form_template_mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否有横向滚动条', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'scroll' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'复制版本号', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'copy_version' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'复制表类型1为复制表 0为原始表', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'copy_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'原始表ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'physic_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主题模板', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'theme_template' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否用设计器表单', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'is_des_form' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'设计器表单编码', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_head', +'COLUMN', N'des_form_code' +GO + + +-- ---------------------------- +-- Records of onl_cgform_head +-- ---------------------------- +INSERT INTO [dbo].[onl_cgform_head] ([id], [table_name], [table_type], [table_version], [table_txt], [is_checkbox], [is_db_synch], [is_page], [is_tree], [id_sequence], [id_type], [query_mode], [relation_type], [sub_table_str], [tab_order_num], [tree_parent_id_field], [tree_id_field], [tree_fieldname], [form_category], [form_template], [form_template_mobile], [scroll], [copy_version], [copy_type], [physic_id], [update_by], [update_time], [create_by], [create_time], [theme_template], [is_des_form], [des_form_code]) VALUES (N'd35109c3632c4952a19ecc094943dd71', N'test_demo', N'1', N'31', N'测试用户表', N'Y', N'Y', N'Y', N'N', NULL, N'UUID', N'group', NULL, NULL, NULL, NULL, NULL, NULL, N'demo', N'1', NULL, N'0', NULL, N'0', NULL, N'admin', N'2021-03-16 17:09:22.0000000', N'admin', N'2019-03-15 14:24:35.0000000', N'normal', NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for onl_cgform_index +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgform_index]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgform_index] +GO + +CREATE TABLE [dbo].[onl_cgform_index] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgform_head_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [index_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [index_field] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [index_type] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [is_db_synch] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [del_flag] int NULL +) +GO + +ALTER TABLE [dbo].[onl_cgform_index] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主表id', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'cgform_head_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'索引名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'index_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'索引栏位', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'index_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'索引类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'index_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否同步数据库 N未同步 Y已同步', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'is_db_synch' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除 0未删除 1删除', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgform_index', +'COLUMN', N'del_flag' +GO + + +-- ---------------------------- +-- Records of onl_cgform_index +-- ---------------------------- + +-- ---------------------------- +-- Table structure for onl_cgreport_head +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgreport_head]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgreport_head] +GO + +CREATE TABLE [dbo].[onl_cgreport_head] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgr_sql] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [return_val_field] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [return_txt_field] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [return_type] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_source] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [content] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[onl_cgreport_head] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'报表编码', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'报表名字', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'报表SQL', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'cgr_sql' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'返回值字段', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'return_val_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'返回文本字段', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'return_txt_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'返回类型,单选或多选', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'return_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'动态数据源', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'db_source' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人id', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人id', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_head', +'COLUMN', N'create_by' +GO + + +-- ---------------------------- +-- Records of onl_cgreport_head +-- ---------------------------- +INSERT INTO [dbo].[onl_cgreport_head] ([id], [code], [name], [cgr_sql], [return_val_field], [return_txt_field], [return_type], [db_source], [content], [update_time], [update_by], [create_time], [create_by]) VALUES (N'1256627801873821698', N'report002', N'统计登录每日登录次数-Demo', N'select DATE_FORMAT(create_time, ''%Y-%m-%d'') as date,count(*) as num from sys_log group by DATE_FORMAT(create_time, ''%Y-%m-%d'')', NULL, NULL, N'1', NULL, NULL, N'2021-03-16 16:44:45.0000000', N'admin', N'2020-05-03 00:53:10.0000000', N'admin') +GO + +INSERT INTO [dbo].[onl_cgreport_head] ([id], [code], [name], [cgr_sql], [return_val_field], [return_txt_field], [return_type], [db_source], [content], [update_time], [update_by], [create_time], [create_by]) VALUES (N'1260179852088135681', N'tj_user_report', N'统一有效系统用户-Demo', N'select * from sys_user', NULL, NULL, N'1', NULL, NULL, N'2021-03-16 16:44:40.0000000', N'admin', N'2020-05-12 20:07:44.0000000', N'admin') +GO + +INSERT INTO [dbo].[onl_cgreport_head] ([id], [code], [name], [cgr_sql], [return_val_field], [return_txt_field], [return_type], [db_source], [content], [update_time], [update_by], [create_time], [create_by]) VALUES (N'6c7f59741c814347905a938f06ee003c', N'report_user', N'统计在线用户-Demo', N'select * from sys_user', NULL, NULL, N'1', N'', NULL, N'2021-03-16 16:44:50.0000000', N'admin', N'2019-03-25 11:20:45.0000000', N'admin') +GO + +INSERT INTO [dbo].[onl_cgreport_head] ([id], [code], [name], [cgr_sql], [return_val_field], [return_txt_field], [return_type], [db_source], [content], [update_time], [update_by], [create_time], [create_by]) VALUES (N'87b55a515d3441b6b98e48e5b35474a6', N'demo', N'Report-Demo', N'select * from demo', NULL, NULL, N'1', N'', NULL, N'2021-03-16 16:44:59.0000000', N'admin', N'2019-03-12 11:25:16.0000000', N'admin') +GO + + +-- ---------------------------- +-- Table structure for onl_cgreport_item +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgreport_item]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgreport_item] +GO + +CREATE TABLE [dbo].[onl_cgreport_item] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgrhead_id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [field_name] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [field_txt] nvarchar(300) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_width] int NULL, + [field_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [search_mode] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [is_order] int NULL, + [is_search] int NULL, + [dict_code] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [field_href] nvarchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [is_show] int NULL, + [order_num] int NULL, + [replace_val] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [is_total] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [group_title] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[onl_cgreport_item] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'报表ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'cgrhead_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段名字', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'field_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段文本', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'field_txt' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段类型', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'field_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'查询模式', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'search_mode' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否排序 0否,1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'is_order' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否查询 0否,1是', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'is_search' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典CODE', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'dict_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段跳转URL', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'field_href' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否显示 0否,1显示', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'is_show' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'order_num' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'取值表达式', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'replace_val' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否合计 0否,1是(仅对数值有效)', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'is_total' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'分组标题', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'group_title' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_item', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of onl_cgreport_item +-- ---------------------------- +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256627802020622337', N'1256627801873821698', N'date', N'日期', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'1', N'', NULL, NULL, N'admin', N'2020-09-11 14:50:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1256627802075148289', N'1256627801873821698', N'num', N'登录次数', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'2', N'', N'1', NULL, N'admin', N'2020-09-11 14:50:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1260179881129496577', N'1260179852088135681', N'id', N'ID', NULL, N'String', NULL, N'0', N'0', N'', N'', N'0', N'1', N'', NULL, NULL, N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1260179881129496578', N'1260179852088135681', N'username', N'账号', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'2', N'', NULL, N'用户信息', N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1260179881129496579', N'1260179852088135681', N'realname', N'用户名字', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'3', N'', NULL, N'用户信息', N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1260179881129496584', N'1260179852088135681', N'sex', N'性别', NULL, N'String', NULL, N'0', N'1', N'sex', N'', N'1', N'4', N'', NULL, N'用户信息', N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1260179881129496585', N'1260179852088135681', N'email', N'邮箱', NULL, N'String', N'single', N'0', N'1', N'', N'', N'1', N'5', N'', NULL, NULL, N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1260179881129496586', N'1260179852088135681', N'phone', N'电话', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'6', N'', NULL, NULL, N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15884396588465896672', N'87b55a515d3441b6b98e48e5b35474a6', N'id', N'ID', NULL, N'String', NULL, N'0', N'0', N'', N'', N'0', N'1', N'', NULL, NULL, N'admin', N'2020-05-03 01:14:35.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'15892858611256977947', N'1260179852088135681', N'birthday', N'生日', NULL, N'Date', NULL, N'0', N'0', N'', N'', N'1', N'7', N'', NULL, NULL, N'admin', N'2020-09-11 14:07:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1740bb02519db90c44cb2cba8b755136', N'6c7f59741c814347905a938f06ee003c', N'realname', N'用户名称', NULL, N'String', NULL, N'0', N'0', N'', N'https://www.baidu.com', N'1', N'1', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1b181e6d2813bcb263adc39737f9df46', N'87b55a515d3441b6b98e48e5b35474a6', N'name', N'用户名', NULL, N'String', N'single', N'0', N'1', N'', N'', N'1', N'2', N'', NULL, NULL, N'admin', N'2020-05-03 01:14:35.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'61ef5b323134938fdd07ad5e3ea16cd3', N'87b55a515d3441b6b98e48e5b35474a6', N'key_word', N'关键词', NULL, N'String', N'single', N'0', N'1', N'', N'', N'1', N'3', N'', NULL, NULL, N'admin', N'2020-05-03 01:14:35.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'627768efd9ba2c41e905579048f21000', N'6c7f59741c814347905a938f06ee003c', N'username', N'用户账号', NULL, N'String', N'single', N'0', N'1', N'', N'', N'1', N'2', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8bb087a9aa2000bcae17a1b3f5768435', N'6c7f59741c814347905a938f06ee003c', N'sex', N'性别', NULL, N'String', N'single', N'0', N'1', N'sex', N'', N'1', N'3', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'90d4fa57d301801abb26a9b86b6b94c4', N'6c7f59741c814347905a938f06ee003c', N'birthday', N'生日', NULL, N'Date', N'single', N'0', N'0', N'', N'', N'1', N'4', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'a4ac355f07a05218854e5f23e2930163', N'6c7f59741c814347905a938f06ee003c', N'avatar', N'头像', NULL, N'String', NULL, N'0', N'0', N'', N'', N'0', N'5', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'd6e86b5ffd096ddcc445c0f320a45004', N'6c7f59741c814347905a938f06ee003c', N'phone', N'手机号', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'6', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'df365cd357699eea96c29763d1dd7f9d', N'6c7f59741c814347905a938f06ee003c', N'email', N'邮箱', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'7', N'', NULL, NULL, N'admin', N'2020-05-03 02:35:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'edf9932912b81ad01dd557d3d593a559', N'87b55a515d3441b6b98e48e5b35474a6', N'age', N'年龄', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'4', N'', NULL, NULL, N'admin', N'2020-05-03 01:14:35.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f985883e509a6faaaf62ca07fd24a73c', N'87b55a515d3441b6b98e48e5b35474a6', N'birthday', N'生日', NULL, N'Date', N'single', N'0', N'1', N'', N'', N'1', N'5', N'', NULL, NULL, N'admin', N'2020-05-03 01:14:35.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[onl_cgreport_item] ([id], [cgrhead_id], [field_name], [field_txt], [field_width], [field_type], [search_mode], [is_order], [is_search], [dict_code], [field_href], [is_show], [order_num], [replace_val], [is_total], [group_title], [create_by], [create_time], [update_by], [update_time]) VALUES (N'fce83e4258de3e2f114ab3116397670c', N'87b55a515d3441b6b98e48e5b35474a6', N'punch_time', N'发布时间', NULL, N'String', NULL, N'0', N'0', N'', N'', N'1', N'6', N'', NULL, NULL, N'admin', N'2020-05-03 01:14:35.0000000', NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for onl_cgreport_param +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[onl_cgreport_param]') AND type IN ('U')) + DROP TABLE [dbo].[onl_cgreport_param] +GO + +CREATE TABLE [dbo].[onl_cgreport_param] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [cgrhead_id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [param_name] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [param_txt] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [param_value] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [order_num] int NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[onl_cgreport_param] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'动态报表ID', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'cgrhead_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数字段', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'param_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数文本', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'param_txt' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数默认值', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'param_value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'order_num' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'onl_cgreport_param', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of onl_cgreport_param +-- ---------------------------- + +-- ---------------------------- +-- Table structure for oss_file +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[oss_file]') AND type IN ('U')) + DROP TABLE [dbo].[oss_file] +GO + +CREATE TABLE [dbo].[oss_file] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [file_name] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[oss_file] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件名称', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'file_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件地址', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'oss_file', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Oss File', +'SCHEMA', N'dbo', +'TABLE', N'oss_file' +GO + + +-- ---------------------------- +-- Records of oss_file +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [BLOB_DATA] image NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_BLOB_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_CALENDARS] +GO + +CREATE TABLE [dbo].[QRTZ_CALENDARS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CALENDAR_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CALENDAR] image NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_CALENDARS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CRON_EXPRESSION] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TIME_ZONE_ID] varchar(80) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +INSERT INTO [dbo].[QRTZ_CRON_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP], [CRON_EXPRESSION], [TIME_ZONE_ID]) VALUES (N'MyScheduler', N'com.jero.modules.quartz.job.SampleJob', N'DEFAULT', N'0/1 * * * * ?', N'Asia/Shanghai') +GO + +INSERT INTO [dbo].[QRTZ_CRON_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP], [CRON_EXPRESSION], [TIME_ZONE_ID]) VALUES (N'MyScheduler', N'com.jero.modules.quartz.job.SampleParamJob', N'DEFAULT', N'0/1 * * * * ?', N'Asia/Shanghai') +GO + + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [ENTRY_ID] varchar(95) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [INSTANCE_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [FIRED_TIME] bigint NOT NULL, + [SCHED_TIME] bigint NOT NULL, + [PRIORITY] int NOT NULL, + [STATE] varchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [IS_NONCONCURRENT] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [REQUESTS_RECOVERY] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_JOB_DETAILS] +GO + +CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [DESCRIPTION] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [JOB_CLASS_NAME] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_DURABLE] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_NONCONCURRENT] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_UPDATE_DATA] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [REQUESTS_RECOVERY] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_DATA] image NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +INSERT INTO [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [JOB_CLASS_NAME], [IS_DURABLE], [IS_NONCONCURRENT], [IS_UPDATE_DATA], [REQUESTS_RECOVERY], [JOB_DATA]) VALUES (N'MyScheduler', N'com.jero.modules.quartz.job.SampleJob', N'DEFAULT', NULL, N'com.jero.modules.quartz.job.SampleJob', N'0', N'0', N'0', N'0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000001740009706172616D65746572707800) +GO + +INSERT INTO [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [JOB_CLASS_NAME], [IS_DURABLE], [IS_NONCONCURRENT], [IS_UPDATE_DATA], [REQUESTS_RECOVERY], [JOB_DATA]) VALUES (N'MyScheduler', N'com.jero.modules.quartz.job.SampleParamJob', N'DEFAULT', NULL, N'com.jero.modules.quartz.job.SampleParamJob', N'0', N'0', N'0', N'0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000001740009706172616D6574657274000573636F74747800) +GO + + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_LOCKS] +GO + +CREATE TABLE [dbo].[QRTZ_LOCKS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [LOCK_NAME] varchar(40) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_LOCKS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +INSERT INTO [dbo].[QRTZ_LOCKS] ([SCHED_NAME], [LOCK_NAME]) VALUES (N'MyScheduler', N'STATE_ACCESS') +GO + +INSERT INTO [dbo].[QRTZ_LOCKS] ([SCHED_NAME], [LOCK_NAME]) VALUES (N'MyScheduler', N'TRIGGER_ACCESS') +GO + +INSERT INTO [dbo].[QRTZ_LOCKS] ([SCHED_NAME], [LOCK_NAME]) VALUES (N'quartzScheduler', N'TRIGGER_ACCESS') +GO + + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] +GO + +CREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE] +GO + +CREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [INSTANCE_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [LAST_CHECKIN_TIME] bigint NOT NULL, + [CHECKIN_INTERVAL] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +INSERT INTO [dbo].[QRTZ_SCHEDULER_STATE] ([SCHED_NAME], [INSTANCE_NAME], [LAST_CHECKIN_TIME], [CHECKIN_INTERVAL]) VALUES (N'MyScheduler', N'mmmmmm1616374466874', N'1616375965969', N'10000') +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [REPEAT_COUNT] bigint NOT NULL, + [REPEAT_INTERVAL] bigint NOT NULL, + [TIMES_TRIGGERED] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [STR_PROP_1] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [STR_PROP_2] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [STR_PROP_3] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [INT_PROP_1] int NULL, + [INT_PROP_2] int NULL, + [LONG_PROP_1] bigint NULL, + [LONG_PROP_2] bigint NULL, + [DEC_PROP_1] numeric(13,4) NULL, + [DEC_PROP_2] numeric(13,4) NULL, + [BOOL_PROP_1] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BOOL_PROP_2] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [DESCRIPTION] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [NEXT_FIRE_TIME] bigint NULL, + [PREV_FIRE_TIME] bigint NULL, + [PRIORITY] int NULL, + [TRIGGER_STATE] varchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_TYPE] varchar(8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [START_TIME] bigint NOT NULL, + [END_TIME] bigint NULL, + [CALENDAR_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MISFIRE_INSTR] smallint NULL, + [JOB_DATA] image NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +INSERT INTO [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [NEXT_FIRE_TIME], [PREV_FIRE_TIME], [PRIORITY], [TRIGGER_STATE], [TRIGGER_TYPE], [START_TIME], [END_TIME], [CALENDAR_NAME], [MISFIRE_INSTR], [JOB_DATA]) VALUES (N'MyScheduler', N'com.jero.modules.quartz.job.SampleJob', N'DEFAULT', N'com.jero.modules.quartz.job.SampleJob', N'DEFAULT', NULL, N'1588405730000', N'1588405729000', N'5', N'PAUSED', N'CRON', N'1588405237000', N'0', NULL, N'0', 0x) +GO + +INSERT INTO [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [NEXT_FIRE_TIME], [PREV_FIRE_TIME], [PRIORITY], [TRIGGER_STATE], [TRIGGER_TYPE], [START_TIME], [END_TIME], [CALENDAR_NAME], [MISFIRE_INSTR], [JOB_DATA]) VALUES (N'MyScheduler', N'com.jero.modules.quartz.job.SampleParamJob', N'DEFAULT', N'com.jero.modules.quartz.job.SampleParamJob', N'DEFAULT', NULL, N'1588405236000', N'1588405235000', N'5', N'PAUSED', N'CRON', N'1588405221000', N'0', NULL, N'0', 0x) +GO + + +-- ---------------------------- +-- Table structure for sys_announcement +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_announcement]') AND type IN ('U')) + DROP TABLE [dbo].[sys_announcement] +GO + +CREATE TABLE [dbo].[sys_announcement] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [titile] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [msg_content] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [start_time] datetime2(7) NULL, + [end_time] datetime2(7) NULL, + [sender] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [priority] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [msg_category] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [msg_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [send_status] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [send_time] datetime2(7) NULL, + [cancel_time] datetime2(7) NULL, + [del_flag] nvarchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [bus_type] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [bus_id] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [open_type] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [open_page] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [user_ids] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [msg_abstract] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_announcement] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'标题', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'titile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'内容', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'msg_content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'start_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发布人', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'sender' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'优先级(L低,M中,H高)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'priority' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'消息类型1:通知公告2:系统消息', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'msg_category' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通告对象类型(USER:指定用户,ALL:全体用户)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'msg_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发布状态(0未发布,1已发布,2已撤销)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'send_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发布时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'send_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'撤销时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'cancel_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态(0,正常,1已删除)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'业务类型(email:邮件 bpm:流程)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'bus_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'业务id', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'bus_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'打开方式(组件:component 路由:url)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'open_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'组件/路由 地址', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'open_page' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'指定用户', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'user_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'摘要', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement', +'COLUMN', N'msg_abstract' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'系统通告表', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement' +GO + + +-- ---------------------------- +-- Records of sys_announcement +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_announcement_send +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_announcement_send]') AND type IN ('U')) + DROP TABLE [dbo].[sys_announcement_send] +GO + +CREATE TABLE [dbo].[sys_announcement_send] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [annt_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [user_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [read_flag] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [read_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_announcement_send] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通告ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'annt_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户id', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'阅读状态(0未读,1已读)', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'read_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'阅读时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'read_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户通告阅读标记表', +'SCHEMA', N'dbo', +'TABLE', N'sys_announcement_send' +GO + + +-- ---------------------------- +-- Records of sys_announcement_send +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_category +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_category]') AND type IN ('U')) + DROP TABLE [dbo].[sys_category] +GO + +CREATE TABLE [dbo].[sys_category] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [pid] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [sys_org_code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [has_child] nvarchar(3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_category] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父级节点', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'pid' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类型名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类型编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'所属部门', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'sys_org_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否有子节点', +'SCHEMA', N'dbo', +'TABLE', N'sys_category', +'COLUMN', N'has_child' +GO + + +-- ---------------------------- +-- Records of sys_category +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_check_rule +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_check_rule]') AND type IN ('U')) + DROP TABLE [dbo].[sys_check_rule] +GO + +CREATE TABLE [dbo].[sys_check_rule] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [rule_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_json] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_description] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_check_rule] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'rule_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则Code', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'rule_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则JSON', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'rule_json' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'rule_description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_check_rule', +'COLUMN', N'create_time' +GO + + +-- ---------------------------- +-- Records of sys_check_rule +-- ---------------------------- +INSERT INTO [dbo].[sys_check_rule] ([id], [rule_name], [rule_code], [rule_json], [rule_description], [update_by], [update_time], [create_by], [create_time]) VALUES (N'1224980593992388610', N'通用编码规则-Demo', N'common', N'[{"digits":"1","pattern":"^[a-z|A-Z]$","message":"第一位只能是字母"},{"digits":"*","pattern":"^[0-9|a-z|A-Z|_]{0,}$","message":"只能填写数字、大小写字母、下划线"},{"digits":"*","pattern":"^.{3,}$","message":"最少输入3位数"},{"digits":"*","pattern":"^.{3,12}$","message":"最多输入12位数"}]', N'规则:1、首位只能是字母;2、只能填写数字、大小写字母、下划线;3、最少3位数,最多12位数。', N'admin', N'2021-03-16 16:34:09.0000000', N'admin', N'2020-02-05 16:58:27.0000000') +GO + + +-- ---------------------------- +-- Table structure for sys_data_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_data_log]') AND type IN ('U')) + DROP TABLE [dbo].[sys_data_log] +GO + +CREATE TABLE [dbo].[sys_data_log] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [data_table] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [data_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [data_content] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [data_version] int NULL +) +GO + +ALTER TABLE [dbo].[sys_data_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'id', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表名', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'data_table' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'data_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据内容', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'data_content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'版本号', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_log', +'COLUMN', N'data_version' +GO + + +-- ---------------------------- +-- Records of sys_data_log +-- ---------------------------- +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab0d198015ab12274bf0006', N'admin', N'2017-03-09 11:35:09.0000000', NULL, NULL, N'jero_demo', N'4028ef81550c1a7901550c1cd6e70001', N'{"mobilePhone":"","officePhone":"","email":"","createDate":"Jun 23, 2016 12:00:00 PM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"9001","status":"1","content":"111","id":"4028ef81550c1a7901550c1cd6e70001"}', N'3') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab6d12b015ab700bead0009', N'admin', N'2017-03-10 14:56:03.0000000', NULL, NULL, N'jero_demo', N'402880f05ab6d12b015ab700be8d0008', N'{"mobilePhone":"","officePhone":"","email":"","createDate":"Mar 10, 2017 2:56:03 PM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"111","status":"0","id":"402880f05ab6d12b015ab700be8d0008"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab6d12b015ab705a23f000d', N'admin', N'2017-03-10 15:01:24.0000000', NULL, NULL, N'jero_demo', N'402880f05ab6d12b015ab705a233000c', N'{"mobilePhone":"","officePhone":"11","email":"","createDate":"Mar 10, 2017 3:01:24 PM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"11","status":"0","id":"402880f05ab6d12b015ab705a233000c"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab6d12b015ab712a6420013', N'admin', N'2017-03-10 15:15:37.0000000', NULL, NULL, N'jero_demo', N'402880f05ab6d12b015ab712a6360012', N'{"mobilePhone":"","officePhone":"","email":"","createDate":"Mar 10, 2017 3:15:37 PM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"小王","status":"0","id":"402880f05ab6d12b015ab712a6360012"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab6d12b015ab712d0510015', N'admin', N'2017-03-10 15:15:47.0000000', NULL, NULL, N'jero_demo', N'402880f05ab6d12b015ab712a6360012', N'{"mobilePhone":"18611788525","officePhone":"","email":"","createDate":"Mar 10, 2017 3:15:37 AM","sex":"0","depId":"402880e447e99cf10147e9a03b320003","userName":"小王","status":"0","id":"402880f05ab6d12b015ab712a6360012"}', N'2') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab6d12b015ab71308240018', N'admin', N'2017-03-10 15:16:02.0000000', NULL, NULL, N'jero_demo', N'8a8ab0b246dc81120146dc81860f016f', N'{"mobilePhone":"13111111111","officePhone":"66666666","email":"demo@jero.com","age":12,"salary":10.00,"birthday":"Feb 14, 2014 12:00:00 AM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"小明","status":"","content":"","id":"8a8ab0b246dc81120146dc81860f016f"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'402880f05ab6d12b015ab72806c3001b', N'admin', N'2017-03-10 15:38:58.0000000', NULL, NULL, N'jero_demo', N'8a8ab0b246dc81120146dc81860f016f', N'{"mobilePhone":"18611788888","officePhone":"66666666","email":"demo@jero.com","age":12,"salary":10.00,"birthday":"Feb 14, 2014 12:00:00 AM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"小明","status":"","content":"","id":"8a8ab0b246dc81120146dc81860f016f"}', N'2') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef815318148a0153181567690001', N'admin', N'2016-02-25 18:59:29.0000000', NULL, NULL, N'jero_demo', N'4028ef815318148a0153181566270000', N'{"mobilePhone":"13423423423","officePhone":"1","email":"","age":1,"salary":1,"birthday":"Feb 25, 2016 12:00:00 AM","createDate":"Feb 25, 2016 6:59:24 PM","depId":"402880e447e9a9570147e9b6a3be0005","userName":"1","status":"0","id":"4028ef815318148a0153181566270000"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef815318148a01531815ec5c0003', N'admin', N'2016-02-25 19:00:03.0000000', NULL, NULL, N'jero_demo', N'4028ef815318148a0153181566270000', N'{"mobilePhone":"13426498659","officePhone":"1","email":"","age":1,"salary":1.00,"birthday":"Feb 25, 2016 12:00:00 AM","createDate":"Feb 25, 2016 6:59:24 AM","depId":"402880e447e9a9570147e9b6a3be0005","userName":"1","status":"0","id":"4028ef815318148a0153181566270000"}', N'2') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef8153c028db0153c0502e6b0003', N'admin', N'2016-03-29 10:59:53.0000000', NULL, NULL, N'jero_demo', N'4028ef8153c028db0153c0502d420002', N'{"mobilePhone":"18455477548","officePhone":"123","email":"","createDate":"Mar 29, 2016 10:59:53 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"123","status":"0","id":"4028ef8153c028db0153c0502d420002"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef8153c028db0153c0509aa40006', N'admin', N'2016-03-29 11:00:21.0000000', NULL, NULL, N'jero_demo', N'4028ef8153c028db0153c0509a3e0005', N'{"mobilePhone":"13565486458","officePhone":"","email":"","createDate":"Mar 29, 2016 11:00:21 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"22","status":"0","id":"4028ef8153c028db0153c0509a3e0005"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef8153c028db0153c051c4a70008', N'admin', N'2016-03-29 11:01:37.0000000', NULL, NULL, N'jero_demo', N'4028ef8153c028db0153c0509a3e0005', N'{"mobilePhone":"13565486458","officePhone":"","email":"","createDate":"Mar 29, 2016 11:00:21 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"22","status":"0","id":"4028ef8153c028db0153c0509a3e0005"}', N'2') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef8153c028db0153c051d4b5000a', N'admin', N'2016-03-29 11:01:41.0000000', NULL, NULL, N'jero_demo', N'4028ef8153c028db0153c0502d420002', N'{"mobilePhone":"13565486458","officePhone":"123","email":"","createDate":"Mar 29, 2016 10:59:53 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"123","status":"0","id":"4028ef8153c028db0153c0502d420002"}', N'2') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef8153c028db0153c07033d8000d', N'admin', N'2016-03-29 11:34:52.0000000', NULL, NULL, N'jero_demo', N'4028ef8153c028db0153c0502d420002', N'{"mobilePhone":"13565486458","officePhone":"123","email":"","age":23,"createDate":"Mar 29, 2016 10:59:53 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"123","status":"0","id":"4028ef8153c028db0153c0502d420002"}', N'3') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef8153c028db0153c070492e000f', N'admin', N'2016-03-29 11:34:57.0000000', NULL, NULL, N'jero_demo', N'4028ef8153c028db0153c0509a3e0005', N'{"mobilePhone":"13565486458","officePhone":"","email":"","age":22,"createDate":"Mar 29, 2016 11:00:21 AM","depId":"402880e447e99cf10147e9a03b320003","userName":"22","status":"0","id":"4028ef8153c028db0153c0509a3e0005"}', N'3') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef81550c1a7901550c1cd7850002', N'admin', N'2016-06-01 21:17:44.0000000', NULL, NULL, N'jero_demo', N'4028ef81550c1a7901550c1cd6e70001', N'{"mobilePhone":"","officePhone":"","email":"","createDate":"Jun 1, 2016 9:17:44 PM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"121221","status":"0","id":"4028ef81550c1a7901550c1cd6e70001"}', N'1') +GO + +INSERT INTO [dbo].[sys_data_log] ([id], [create_by], [create_time], [update_by], [update_time], [data_table], [data_id], [data_content], [data_version]) VALUES (N'4028ef81568c31ec01568c3307080004', N'admin', N'2016-08-15 11:16:09.0000000', NULL, NULL, N'jero_demo', N'4028ef81550c1a7901550c1cd6e70001', N'{"mobilePhone":"","officePhone":"","email":"","createDate":"Jun 23, 2016 12:00:00 PM","sex":"1","depId":"402880e447e99cf10147e9a03b320003","userName":"9001","status":"1","content":"111","id":"4028ef81550c1a7901550c1cd6e70001"}', N'2') +GO + + +-- ---------------------------- +-- Table structure for sys_data_source +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_data_source]') AND type IN ('U')) + DROP TABLE [dbo].[sys_data_source] +GO + +CREATE TABLE [dbo].[sys_data_source] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [remark] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_driver] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_url] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_username] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [db_password] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [sys_org_code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_data_source] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据源编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据源名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据库类型', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'db_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'驱动类', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'db_driver' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据源地址', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'db_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据库名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'db_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户名', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'db_username' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'密码', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'db_password' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'所属部门', +'SCHEMA', N'dbo', +'TABLE', N'sys_data_source', +'COLUMN', N'sys_org_code' +GO + + +-- ---------------------------- +-- Records of sys_data_source +-- ---------------------------- +INSERT INTO [dbo].[sys_data_source] ([id], [code], [name], [remark], [db_type], [db_driver], [db_url], [db_name], [db_username], [db_password], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'1209779538310004737', N'local_mysql', N'MySQL5.7-Demo', N'本地数据库MySQL5.7', N'4', N'com.mysql.cj.jdbc.Driver', N'jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai', N'jero-boot', N'jero-boot', N'c0e5dbdaede24c84091fb7dc0db47ccb', N'admin', N'2019-12-25 18:14:53.0000000', N'admin', N'2021-03-16 16:44:03.0000000', N'A01') +GO + + +-- ---------------------------- +-- Table structure for sys_depart +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_depart]') AND type IN ('U')) + DROP TABLE [dbo].[sys_depart] +GO + +CREATE TABLE [dbo].[sys_depart] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [parent_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [depart_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [depart_name_en] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [depart_name_abbr] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [depart_order] int NULL, + [description] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [org_category] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [org_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [org_code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [mobile] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [fax] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [address] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [memo] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] nvarchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [del_flag] nvarchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_depart] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父机构ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'机构/部门名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'depart_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'英文名', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'depart_name_en' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'缩写', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'depart_name_abbr' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'depart_order' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'机构类别 1公司,2组织机构,2岗位', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'org_category' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'机构类型 1一级部门 2子部门', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'org_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'机构编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'org_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'手机号', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'传真', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'fax' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'地址', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'address' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'memo' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(1启用,0不启用)', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态(0,正常,1已删除)', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'组织机构表', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart' +GO + + +-- ---------------------------- +-- Records of sys_depart +-- ---------------------------- +INSERT INTO [dbo].[sys_depart] ([id], [parent_id], [depart_name], [depart_name_en], [depart_name_abbr], [depart_order], [description], [org_category], [org_type], [org_code], [mobile], [fax], [address], [memo], [status], [del_flag], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c6d7cb4deeac411cb3384b1b31278596', N'', N'公司总部', NULL, NULL, N'0', NULL, N'1', N'1', N'A01', NULL, NULL, NULL, NULL, NULL, N'0', N'admin', N'2019-02-11 14:21:51.0000000', N'admin', N'2021-03-16 14:19:08.0000000') +GO + + +-- ---------------------------- +-- Table structure for sys_depart_permission +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_depart_permission]') AND type IN ('U')) + DROP TABLE [dbo].[sys_depart_permission] +GO + +CREATE TABLE [dbo].[sys_depart_permission] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [depart_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [permission_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [data_rule_ids] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_depart_permission] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_permission', +'COLUMN', N'depart_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_permission', +'COLUMN', N'permission_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据规则id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_permission', +'COLUMN', N'data_rule_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门权限表', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_permission' +GO + + +-- ---------------------------- +-- Records of sys_depart_permission +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_depart_role +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_depart_role]') AND type IN ('U')) + DROP TABLE [dbo].[sys_depart_role] +GO + +CREATE TABLE [dbo].[sys_depart_role] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [depart_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [role_name] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [role_code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_depart_role] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'depart_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门角色名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'role_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门角色编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'role_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门角色表', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role' +GO + + +-- ---------------------------- +-- Records of sys_depart_role +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_depart_role_permission +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_depart_role_permission]') AND type IN ('U')) + DROP TABLE [dbo].[sys_depart_role_permission] +GO + +CREATE TABLE [dbo].[sys_depart_role_permission] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [depart_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [role_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [permission_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [data_rule_ids] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [operate_date] datetime2(7) NULL, + [operate_ip] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_depart_role_permission] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission', +'COLUMN', N'depart_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission', +'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission', +'COLUMN', N'permission_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据权限ids', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission', +'COLUMN', N'data_rule_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission', +'COLUMN', N'operate_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作ip', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission', +'COLUMN', N'operate_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门角色权限表', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_permission' +GO + + +-- ---------------------------- +-- Records of sys_depart_role_permission +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_depart_role_user +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_depart_role_user]') AND type IN ('U')) + DROP TABLE [dbo].[sys_depart_role_user] +GO + +CREATE TABLE [dbo].[sys_depart_role_user] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [drole_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_depart_role_user] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_user', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_user', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色id', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_user', +'COLUMN', N'drole_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门角色用户表', +'SCHEMA', N'dbo', +'TABLE', N'sys_depart_role_user' +GO + + +-- ---------------------------- +-- Records of sys_depart_role_user +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_dict +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_dict]') AND type IN ('U')) + DROP TABLE [dbo].[sys_dict] +GO + +CREATE TABLE [dbo].[sys_dict] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [dict_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [dict_code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [del_flag] int NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [type] int NULL +) +GO + +ALTER TABLE [dbo].[sys_dict] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'dict_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'dict_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典类型0为string,1为number', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict', +'COLUMN', N'type' +GO + + +-- ---------------------------- +-- Records of sys_dict +-- ---------------------------- +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'0b5d19e1fce4b2e6647e6b4a17760c14', N'通告类型', N'msg_category', N'消息类型1:通知公告2:系统消息', N'0', N'admin', N'2019-04-22 18:01:35.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'1174511106530525185', N'机构类型', N'org_category', N'机构类型 1公司,2部门 3岗位', N'0', N'admin', N'2019-09-19 10:30:43.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'1209733563293962241', N'数据库类型', N'database_type', N'', N'0', N'admin', N'2019-12-25 15:12:12.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'1232913193820581889', N'Online表单业务分类', N'ol_form_biz_type', N'', N'0', N'admin', N'2020-02-27 14:19:46.0000000', N'admin', N'2020-02-27 14:20:23.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'1250687930947620866', N'定时任务状态', N'quartz_status', N'', N'0', N'admin', N'2020-04-16 15:30:14.0000000', N'', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'1280401766745718786', N'租户状态', N'tenant_status', N'租户状态', N'0', N'admin', N'2020-07-07 15:22:25.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'236e8a4baff0db8c62c00dd95632834f', N'同步工作流引擎', N'activiti_sync', N'同步工作流引擎', N'0', N'admin', N'2019-05-15 15:27:33.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'2e02df51611a4b9632828ab7e5338f00', N'权限策略', N'perms_type', N'权限策略', N'0', N'admin', N'2019-04-26 18:26:55.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'2f0320997ade5dd147c90130f7218c3e', N'推送类别', N'msg_type', N'', N'0', N'admin', N'2019-03-17 21:21:32.0000000', N'admin', N'2019-03-26 19:57:45.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'3486f32803bb953e7155dab3513dc68b', N'删除状态', N'del_flag', NULL, N'0', N'admin', N'2019-01-18 21:46:26.0000000', N'admin', N'2019-03-30 11:17:11.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'3d9a351be3436fbefb1307d4cfb49bf2', N'性别', N'sex', NULL, N'0', NULL, N'2019-01-04 14:56:32.0000000', N'admin', N'2019-03-30 11:28:27.0000000', N'1') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'4274efc2292239b6f000b153f50823ff', N'全局权限策略', N'global_perms_type', N'全局权限策略', N'0', N'admin', N'2019-05-10 17:54:05.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'4c753b5293304e7a445fd2741b46529d', N'字典状态', N'dict_item_status', NULL, N'0', N'admin', N'2020-06-18 23:18:42.0000000', N'admin', N'2019-03-30 19:33:52.0000000', N'1') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'4d7fec1a7799a436d26d02325eff295e', N'优先级', N'priority', N'优先级', N'0', N'admin', N'2019-03-16 17:03:34.0000000', N'admin', N'2019-04-16 17:39:23.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'4e4602b3e3686f0911384e188dc7efb4', N'条件规则', N'rule_conditions', N'', N'0', N'admin', N'2019-04-01 10:15:03.0000000', N'admin', N'2019-04-01 10:30:47.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'4f69be5f507accea8d5df5f11346181a', N'发送消息类型', N'msgType', NULL, N'0', N'admin', N'2019-04-11 14:27:09.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'68168534ff5065a152bfab275c2136f8', N'有效无效状态', N'valid_status', N'有效无效状态', N'0', N'admin', N'2020-09-26 19:21:14.0000000', N'admin', N'2019-04-26 19:21:23.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'72cce0989df68887546746d8f09811aa', N'Online表单类型', N'cgform_table_type', N'', N'0', N'admin', N'2019-01-27 10:13:02.0000000', N'admin', N'2019-03-30 11:37:36.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'78bda155fe380b1b3f175f1e88c284c6', N'流程状态', N'bpm_status', N'流程状态', N'0', N'admin', N'2019-05-09 16:31:52.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'83bfb33147013cc81640d5fd9eda030c', N'日志类型', N'log_type', NULL, N'0', N'admin', N'2019-03-18 23:22:19.0000000', NULL, NULL, N'1') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'845da5006c97754728bf48b6a10f79cc', N'状态', N'status', NULL, N'0', N'admin', N'2019-03-18 21:45:25.0000000', N'admin', N'2019-03-18 21:58:25.0000000', N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'880a895c98afeca9d9ac39f29e67c13e', N'操作类型', N'operate_type', N'操作类型', N'0', N'admin', N'2019-07-22 10:54:29.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'8dfe32e2d29ea9430a988b3b558bf233', N'发布状态', N'send_status', N'发布状态', N'0', N'admin', N'2019-04-16 17:40:42.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'a7adbcd86c37f7dbc9b66945c82ef9e6', N'1是0否', N'yn', N'', N'0', N'admin', N'2019-05-22 19:29:29.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'a9d9942bd0eccb6e89de92d130ec4c4a', N'消息发送状态', N'msgSendStatus', NULL, N'0', N'admin', N'2019-04-12 18:18:17.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'ac2f7c0c5c5775fcea7e2387bcb22f01', N'菜单类型', N'menu_type', NULL, N'0', N'admin', N'2020-12-18 23:24:32.0000000', N'admin', N'2019-04-01 15:27:06.0000000', N'1') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'c36169beb12de8a71c8683ee7c28a503', N'部门状态', N'depart_status', NULL, N'0', N'admin', N'2019-03-18 21:59:51.0000000', NULL, NULL, N'0') +GO + +INSERT INTO [dbo].[sys_dict] ([id], [dict_name], [dict_code], [description], [del_flag], [create_by], [create_time], [update_by], [update_time], [type]) VALUES (N'fc6cd58fde2e8481db10d3a1e68ce70c', N'用户状态', N'user_status', NULL, N'0', N'admin', N'2019-03-18 21:57:25.0000000', N'admin', N'2019-03-18 23:11:58.0000000', N'1') +GO + + +-- ---------------------------- +-- Table structure for sys_dict_item +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_dict_item]') AND type IN ('U')) + DROP TABLE [dbo].[sys_dict_item] +GO + +CREATE TABLE [dbo].[sys_dict_item] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [dict_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [item_text] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [item_value] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [sort_order] int NULL, + [status] int NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_dict_item] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典id', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict_item', +'COLUMN', N'dict_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典项文本', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict_item', +'COLUMN', N'item_text' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典项值', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict_item', +'COLUMN', N'item_value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict_item', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict_item', +'COLUMN', N'sort_order' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(1启用 0不启用)', +'SCHEMA', N'dbo', +'TABLE', N'sys_dict_item', +'COLUMN', N'status' +GO + + +-- ---------------------------- +-- Records of sys_dict_item +-- ---------------------------- +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'0072d115e07c875d76c9b022e2179128', N'4d7fec1a7799a436d26d02325eff295e', N'低', N'L', N'低', N'3', N'1', N'admin', N'2019-04-16 17:04:59.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'05a2e732ce7b00aa52141ecc3e330b4e', N'3486f32803bb953e7155dab3513dc68b', N'已删除', N'1', NULL, NULL, N'1', N'admin', N'2025-10-18 21:46:56.0000000', N'admin', N'2019-03-28 22:23:20.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'0c9532916f5cd722017b46bc4d953e41', N'2f0320997ade5dd147c90130f7218c3e', N'指定用户', N'USER', NULL, NULL, N'1', N'admin', N'2019-03-17 21:22:19.0000000', N'admin', N'2019-03-17 21:22:28.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'0ca4beba9efc4f9dd54af0911a946d5c', N'72cce0989df68887546746d8f09811aa', N'附表', N'3', NULL, N'3', N'1', N'admin', N'2019-03-27 10:13:43.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1030a2652608f5eac3b49d70458b8532', N'2e02df51611a4b9632828ab7e5338f00', N'禁用', N'2', N'禁用', N'2', N'1', N'admin', N'2021-03-26 18:27:28.0000000', N'admin', N'2019-04-26 18:39:11.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1174509082208395266', N'1174511106530525185', N'岗位', N'3', N'岗位', N'1', N'1', N'admin', N'2019-09-19 10:31:16.0000000', N'', NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1174511197735665665', N'1174511106530525185', N'公司', N'1', N'公司', N'1', N'1', N'admin', N'2019-09-19 10:31:05.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1174511244036587521', N'1174511106530525185', N'部门', N'2', N'部门', N'1', N'1', N'admin', N'2019-09-19 10:31:16.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1199607547704647681', N'4f69be5f507accea8d5df5f11346181a', N'系统', N'4', N'', N'1', N'1', N'admin', N'2019-11-27 16:35:02.0000000', N'admin', N'2019-11-27 19:37:46.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1209733775114702850', N'1209733563293962241', N'MySQL5.5', N'1', N'', N'1', N'1', N'admin', N'2019-12-25 15:13:02.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1209733839933476865', N'1209733563293962241', N'Oracle', N'2', N'', N'3', N'1', N'admin', N'2019-12-25 15:13:18.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1209733903020003330', N'1209733563293962241', N'SQLServer', N'3', N'', N'4', N'1', N'admin', N'2019-12-25 15:13:33.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1232913424813486081', N'1232913193820581889', N'官方示例', N'demo', N'', N'1', N'1', N'admin', N'2020-02-27 14:20:42.0000000', N'admin', N'2020-02-27 14:21:37.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1232913493717512194', N'1232913193820581889', N'流程表单', N'bpm', N'', N'2', N'1', N'admin', N'2020-02-27 14:20:58.0000000', N'admin', N'2020-02-27 14:22:20.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1232913605382467585', N'1232913193820581889', N'测试表单', N'temp', N'', N'4', N'1', N'admin', N'2020-02-27 14:21:25.0000000', N'admin', N'2020-02-27 14:22:16.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1232914232372195330', N'1232913193820581889', N'导入表单', N'bdfl_include', N'', N'5', N'1', N'admin', N'2020-02-27 14:23:54.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1234371726545010689', N'4e4602b3e3686f0911384e188dc7efb4', N'左模糊', N'LEFT_LIKE', N'左模糊', N'7', N'1', N'admin', N'2020-03-02 14:55:27.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1234371809495760898', N'4e4602b3e3686f0911384e188dc7efb4', N'右模糊', N'RIGHT_LIKE', N'右模糊', N'7', N'1', N'admin', N'2020-03-02 14:55:47.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1250688147579228161', N'1250687930947620866', N'正常', N'0', N'', N'1', N'1', N'admin', N'2020-04-16 15:31:05.0000000', N'', NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1250688201064992770', N'1250687930947620866', N'停止', N'-1', N'', N'1', N'1', N'admin', N'2020-04-16 15:31:18.0000000', N'', NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1280401815068295170', N'1280401766745718786', N'正常', N'1', N'', N'1', N'1', N'admin', N'2020-07-07 15:22:36.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1280401847607705602', N'1280401766745718786', N'冻结', N'0', N'', N'1', N'1', N'admin', N'2020-07-07 15:22:44.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'1334440962954936321', N'1209733563293962241', N'MYSQL5.7', N'4', NULL, N'1', N'1', N'admin', N'2020-12-03 18:16:02.0000000', N'admin', N'2020-12-03 18:16:02.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'222705e11ef0264d4214affff1fb4ff9', N'4f69be5f507accea8d5df5f11346181a', N'短信', N'1', N'', N'1', N'1', N'admin', N'2023-02-28 10:50:36.0000000', N'admin', N'2019-04-28 10:58:11.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'23a5bb76004ed0e39414e928c4cde155', N'4e4602b3e3686f0911384e188dc7efb4', N'不等于', N'!=', N'不等于', N'3', N'1', N'admin', N'2019-04-01 16:46:15.0000000', N'admin', N'2019-04-01 17:48:40.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'25847e9cb661a7c711f9998452dc09e6', N'4e4602b3e3686f0911384e188dc7efb4', N'小于等于', N'<=', N'小于等于', N'6', N'1', N'admin', N'2019-04-01 16:44:34.0000000', N'admin', N'2019-04-01 17:49:10.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'2d51376643f220afdeb6d216a8ac2c01', N'68168534ff5065a152bfab275c2136f8', N'有效', N'1', N'有效', N'2', N'1', N'admin', N'2019-04-26 19:22:01.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'308c8aadf0c37ecdde188b97ca9833f5', N'8dfe32e2d29ea9430a988b3b558bf233', N'已发布', N'1', N'已发布', N'2', N'1', N'admin', N'2019-04-16 17:41:24.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'333e6b2196e01ef9a5f76d74e86a6e33', N'8dfe32e2d29ea9430a988b3b558bf233', N'未发布', N'0', N'未发布', N'1', N'1', N'admin', N'2019-04-16 17:41:12.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'33bc9d9f753cf7dc40e70461e50fdc54', N'a9d9942bd0eccb6e89de92d130ec4c4a', N'发送失败', N'2', NULL, N'3', N'1', N'admin', N'2019-04-12 18:20:02.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'3fbc03d6c994ae06d083751248037c0e', N'78bda155fe380b1b3f175f1e88c284c6', N'已完成', N'3', N'已完成', N'3', N'1', N'admin', N'2019-05-09 16:33:25.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'41d7aaa40c9b61756ffb1f28da5ead8e', N'0b5d19e1fce4b2e6647e6b4a17760c14', N'通知公告', N'1', NULL, N'1', N'1', N'admin', N'2019-04-22 18:01:57.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'41fa1e9571505d643aea87aeb83d4d76', N'4e4602b3e3686f0911384e188dc7efb4', N'等于', N'=', N'等于', N'4', N'1', N'admin', N'2019-04-01 16:45:24.0000000', N'admin', N'2019-04-01 17:49:00.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'43d2295b8610adce9510ff196a49c6e9', N'845da5006c97754728bf48b6a10f79cc', N'正常', N'1', NULL, NULL, N'1', N'admin', N'2019-03-18 21:45:51.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'4f05fb5376f4c61502c5105f52e4dd2b', N'83bfb33147013cc81640d5fd9eda030c', N'操作日志', N'2', NULL, NULL, N'1', N'admin', N'2019-03-18 23:22:49.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'51222413e5906cdaf160bb5c86fb827c', N'a7adbcd86c37f7dbc9b66945c82ef9e6', N'是', N'1', N'', N'1', N'1', N'admin', N'2019-05-22 19:29:45.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'538fca35afe004972c5f3947c039e766', N'2e02df51611a4b9632828ab7e5338f00', N'显示', N'1', N'显示', N'1', N'1', N'admin', N'2025-03-26 18:27:13.0000000', N'admin', N'2019-04-26 18:39:07.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'5584c21993bde231bbde2b966f2633ac', N'4e4602b3e3686f0911384e188dc7efb4', N'自定义SQL表达式', N'USE_SQL_RULES', N'自定义SQL表达式', N'9', N'1', N'admin', N'2019-04-01 10:45:24.0000000', N'admin', N'2019-04-01 17:49:27.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'58b73b344305c99b9d8db0fc056bbc0a', N'72cce0989df68887546746d8f09811aa', N'主表', N'2', NULL, N'2', N'1', N'admin', N'2019-03-27 10:13:36.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'5b65a88f076b32e8e69d19bbaadb52d5', N'2f0320997ade5dd147c90130f7218c3e', N'全体用户', N'ALL', NULL, NULL, N'1', N'admin', N'2020-10-17 21:22:43.0000000', N'admin', N'2019-03-28 22:17:09.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'5d833f69296f691843ccdd0c91212b6b', N'880a895c98afeca9d9ac39f29e67c13e', N'修改', N'3', N'', N'3', N'1', N'admin', N'2019-07-22 10:55:07.0000000', N'admin', N'2019-07-22 10:55:41.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'5d84a8634c8fdfe96275385075b105c9', N'3d9a351be3436fbefb1307d4cfb49bf2', N'女', N'2', NULL, N'2', N'1', NULL, N'2019-01-04 14:56:56.0000000', NULL, N'2019-01-04 17:38:12.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'66c952ae2c3701a993e7db58f3baf55e', N'4e4602b3e3686f0911384e188dc7efb4', N'大于', N'>', N'大于', N'1', N'1', N'admin', N'2019-04-01 10:45:46.0000000', N'admin', N'2019-04-01 17:48:29.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'69cacf64e244100289ddd4aa9fa3b915', N'a9d9942bd0eccb6e89de92d130ec4c4a', N'未发送', N'0', NULL, N'1', N'1', N'admin', N'2019-04-12 18:19:23.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6a7a9e1403a7943aba69e54ebeff9762', N'4f69be5f507accea8d5df5f11346181a', N'邮件', N'2', N'', N'2', N'1', N'admin', N'2031-02-28 10:50:44.0000000', N'admin', N'2019-04-28 10:59:03.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6c682d78ddf1715baf79a1d52d2aa8c2', N'72cce0989df68887546746d8f09811aa', N'单表', N'1', NULL, N'1', N'1', N'admin', N'2019-03-27 10:13:29.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6d404fd2d82311fbc87722cd302a28bc', N'4e4602b3e3686f0911384e188dc7efb4', N'模糊', N'LIKE', N'模糊', N'7', N'1', N'admin', N'2019-04-01 16:46:02.0000000', N'admin', N'2019-04-01 17:49:20.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'6d4e26e78e1a09699182e08516c49fc4', N'4d7fec1a7799a436d26d02325eff295e', N'高', N'H', N'高', N'1', N'1', N'admin', N'2019-04-16 17:04:24.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'75b260d7db45a39fc7f21badeabdb0ed', N'c36169beb12de8a71c8683ee7c28a503', N'不启用', N'0', NULL, NULL, N'1', N'admin', N'2019-03-18 23:29:41.0000000', N'admin', N'2019-03-18 23:29:54.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'7688469db4a3eba61e6e35578dc7c2e5', N'c36169beb12de8a71c8683ee7c28a503', N'启用', N'1', NULL, NULL, N'1', N'admin', N'2019-03-18 23:29:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'78ea6cadac457967a4b1c4eb7aaa418c', N'fc6cd58fde2e8481db10d3a1e68ce70c', N'正常', N'1', NULL, NULL, N'1', N'admin', N'2019-03-18 23:30:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'7ccf7b80c70ee002eceb3116854b75cb', N'ac2f7c0c5c5775fcea7e2387bcb22f01', N'按钮权限', N'2', NULL, NULL, N'1', N'admin', N'2019-03-18 23:25:40.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'81fb2bb0e838dc68b43f96cc309f8257', N'fc6cd58fde2e8481db10d3a1e68ce70c', N'冻结', N'2', NULL, NULL, N'1', N'admin', N'2019-03-18 23:30:37.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'83250269359855501ec4e9c0b7e21596', N'4274efc2292239b6f000b153f50823ff', N'可见/可访问(授权后可见/可访问)', N'1', N'', N'1', N'1', N'admin', N'2019-05-10 17:54:51.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'84778d7e928bc843ad4756db1322301f', N'4e4602b3e3686f0911384e188dc7efb4', N'大于等于', N'>=', N'大于等于', N'5', N'1', N'admin', N'2019-04-01 10:46:02.0000000', N'admin', N'2019-04-01 17:49:05.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'84dfc178dd61b95a72900fcdd624c471', N'78bda155fe380b1b3f175f1e88c284c6', N'处理中', N'2', N'处理中', N'2', N'1', N'admin', N'2019-05-09 16:33:01.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'86f19c7e0a73a0bae451021ac05b99dd', N'ac2f7c0c5c5775fcea7e2387bcb22f01', N'子菜单', N'1', NULL, NULL, N'1', N'admin', N'2019-03-18 23:25:27.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8bccb963e1cd9e8d42482c54cc609ca2', N'4f69be5f507accea8d5df5f11346181a', N'微信', N'3', NULL, N'3', N'1', N'admin', N'2021-05-11 14:29:12.0000000', N'admin', N'2019-04-11 14:29:31.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8c618902365ca681ebbbe1e28f11a548', N'4c753b5293304e7a445fd2741b46529d', N'启用', N'1', N'', N'0', N'1', N'admin', N'2020-07-18 23:19:27.0000000', N'admin', N'2019-05-17 14:51:18.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8cdf08045056671efd10677b8456c999', N'4274efc2292239b6f000b153f50823ff', N'可编辑(未授权时禁用)', N'2', N'', N'2', N'1', N'admin', N'2019-05-10 17:55:38.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'8ff48e657a7c5090d4f2a59b37d1b878', N'4d7fec1a7799a436d26d02325eff295e', N'中', N'M', N'中', N'2', N'1', N'admin', N'2019-04-16 17:04:40.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'948923658baa330319e59b2213cda97c', N'880a895c98afeca9d9ac39f29e67c13e', N'添加', N'2', N'', N'2', N'1', N'admin', N'2019-07-22 10:54:59.0000000', N'admin', N'2019-07-22 10:55:36.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', N'4c753b5293304e7a445fd2741b46529d', N'不启用', N'0', NULL, N'1', N'1', N'admin', N'2019-03-18 23:19:53.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'a1e7d1ca507cff4a480c8caba7c1339e', N'880a895c98afeca9d9ac39f29e67c13e', N'导出', N'6', N'', N'6', N'1', N'admin', N'2019-07-22 12:06:50.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'a2be752dd4ec980afaec1efd1fb589af', N'8dfe32e2d29ea9430a988b3b558bf233', N'已撤销', N'2', N'已撤销', N'3', N'1', N'admin', N'2019-04-16 17:41:39.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'aa0d8a8042a18715a17f0a888d360aa4', N'ac2f7c0c5c5775fcea7e2387bcb22f01', N'一级菜单', N'0', NULL, NULL, N'1', N'admin', N'2019-03-18 23:24:52.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'adcf2a1fe93bb99a84833043f475fe0b', N'4e4602b3e3686f0911384e188dc7efb4', N'包含', N'IN', N'包含', N'8', N'1', N'admin', N'2019-04-01 16:45:47.0000000', N'admin', N'2019-04-01 17:49:24.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b029a41a851465332ee4ee69dcf0a4c2', N'0b5d19e1fce4b2e6647e6b4a17760c14', N'系统消息', N'2', NULL, N'1', N'1', N'admin', N'2019-02-22 18:02:08.0000000', N'admin', N'2019-04-22 18:02:13.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b2a8b4bb2c8e66c2c4b1bb086337f393', N'3486f32803bb953e7155dab3513dc68b', N'正常', N'0', NULL, NULL, N'1', N'admin', N'2022-10-18 21:46:48.0000000', N'admin', N'2019-03-28 22:22:20.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b5f3bd5f66bb9a83fecd89228c0d93d1', N'68168534ff5065a152bfab275c2136f8', N'无效', N'0', N'无效', N'1', N'1', N'admin', N'2019-04-26 19:21:49.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'b9fbe2a3602d4a27b45c100ac5328484', N'78bda155fe380b1b3f175f1e88c284c6', N'待提交', N'1', N'待提交', N'1', N'1', N'admin', N'2019-05-09 16:32:35.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'ba27737829c6e0e582e334832703d75e', N'236e8a4baff0db8c62c00dd95632834f', N'同步', N'1', N'同步', N'1', N'1', N'admin', N'2019-05-15 15:28:15.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'bcec04526b04307e24a005d6dcd27fd6', N'880a895c98afeca9d9ac39f29e67c13e', N'导入', N'5', N'', N'5', N'1', N'admin', N'2019-07-22 12:06:41.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c53da022b9912e0aed691bbec3c78473', N'880a895c98afeca9d9ac39f29e67c13e', N'查询', N'1', N'', N'1', N'1', N'admin', N'2019-07-22 10:54:51.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'c5700a71ad08994d18ad1dacc37a71a9', N'a7adbcd86c37f7dbc9b66945c82ef9e6', N'否', N'0', N'', N'1', N'1', N'admin', N'2019-05-22 19:29:55.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'df168368dcef46cade2aadd80100d8aa', N'3d9a351be3436fbefb1307d4cfb49bf2', N'男', N'1', NULL, N'1', N'1', NULL, N'2027-08-04 14:56:49.0000000', N'admin', N'2019-03-23 22:44:44.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e6329e3a66a003819e2eb830b0ca2ea0', N'4e4602b3e3686f0911384e188dc7efb4', N'小于', N'<', N'小于', N'2', N'1', N'admin', N'2019-04-01 16:44:15.0000000', N'admin', N'2019-04-01 17:48:34.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'e94eb7af89f1dbfa0d823580a7a6e66a', N'236e8a4baff0db8c62c00dd95632834f', N'不同步', N'0', N'不同步', N'2', N'1', N'admin', N'2019-05-15 15:28:28.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f16c5706f3ae05c57a53850c64ce7c45', N'a9d9942bd0eccb6e89de92d130ec4c4a', N'发送成功', N'1', NULL, N'2', N'1', N'admin', N'2019-04-12 18:19:43.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f2a7920421f3335afdf6ad2b342f6b5d', N'845da5006c97754728bf48b6a10f79cc', N'冻结', N'2', NULL, NULL, N'1', N'admin', N'2019-03-18 21:46:02.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f37f90c496ec9841c4c326b065e00bb2', N'83bfb33147013cc81640d5fd9eda030c', N'登录日志', N'1', NULL, NULL, N'1', N'admin', N'2019-03-18 23:22:37.0000000', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f80a8f6838215753b05e1a5ba3346d22', N'880a895c98afeca9d9ac39f29e67c13e', N'删除', N'4', N'', N'4', N'1', N'admin', N'2019-07-22 10:55:14.0000000', N'admin', N'2019-07-22 10:55:30.0000000') +GO + +INSERT INTO [dbo].[sys_dict_item] ([id], [dict_id], [item_text], [item_value], [description], [sort_order], [status], [create_by], [create_time], [update_by], [update_time]) VALUES (N'fe50b23ae5e68434def76f67cef35d2d', N'78bda155fe380b1b3f175f1e88c284c6', N'已作废', N'4', N'已作废', N'4', N'1', N'admin', N'2021-09-09 16:33:43.0000000', N'admin', N'2019-05-09 16:34:40.0000000') +GO + + +-- ---------------------------- +-- Table structure for sys_fill_rule +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_fill_rule]') AND type IN ('U')) + DROP TABLE [dbo].[sys_fill_rule] +GO + +CREATE TABLE [dbo].[sys_fill_rule] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [rule_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_class] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_params] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_fill_rule] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'rule_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则Code', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'rule_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则实现类', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'rule_class' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则参数', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'rule_params' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_fill_rule', +'COLUMN', N'create_time' +GO + + +-- ---------------------------- +-- Records of sys_fill_rule +-- ---------------------------- +INSERT INTO [dbo].[sys_fill_rule] ([id], [rule_name], [rule_code], [rule_class], [rule_params], [update_by], [update_time], [create_by], [create_time]) VALUES (N'1202551334738382850', N'机构编码生成', N'org_num_role', N'com.jero.modules.system.rule.OrgCodeRule', N'{"parentId":"c6d7cb4deeac411cb3384b1b31278596"}', N'admin', N'2019-12-09 10:37:06.0000000', N'admin', N'2019-12-05 19:32:35.0000000') +GO + +INSERT INTO [dbo].[sys_fill_rule] ([id], [rule_name], [rule_code], [rule_class], [rule_params], [update_by], [update_time], [create_by], [create_time]) VALUES (N'1202787623203065858', N'分类字典编码生成', N'category_code_rule', N'com.jero.modules.system.rule.CategoryCodeRule', N'{"pid":""}', N'admin', N'2019-12-09 10:36:54.0000000', N'admin', N'2019-12-06 11:11:31.0000000') +GO + + +-- ---------------------------- +-- Table structure for sys_gateway_route +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_gateway_route]') AND type IN ('U')) + DROP TABLE [dbo].[sys_gateway_route] +GO + +CREATE TABLE [dbo].[sys_gateway_route] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [router_id] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [name] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [uri] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [predicates] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [filters] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [retryable] int NULL, + [strip_prefix] int NULL, + [persistable] int NULL, + [show_api] int NULL, + [status] int NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [sys_org_code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_gateway_route] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'路由ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'router_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'服务名', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'服务地址', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'uri' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'断言', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'predicates' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'过滤器', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'filters' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否重试:0-否 1-是', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'retryable' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否忽略前缀0-否 1-是', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'strip_prefix' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否为保留数据:0-否 1-是', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'persistable' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否在接口文档中展示:0-否 1-是', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'show_api' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态:0-无效 1-有效', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'所属部门', +'SCHEMA', N'dbo', +'TABLE', N'sys_gateway_route', +'COLUMN', N'sys_org_code' +GO + + +-- ---------------------------- +-- Records of sys_gateway_route +-- ---------------------------- +INSERT INTO [dbo].[sys_gateway_route] ([id], [router_id], [name], [uri], [predicates], [filters], [retryable], [strip_prefix], [persistable], [show_api], [status], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'1331051599401857026', N'jero-demo-websocket', N'jero-demo-websocket', N'lb:ws://jero-demo', N'[{"args":["/vxeSocket/**"],"name":"Path"}]', N'[]', NULL, NULL, NULL, NULL, N'1', N'admin', N'2020-11-24 09:46:46.0000000', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_gateway_route] ([id], [router_id], [name], [uri], [predicates], [filters], [retryable], [strip_prefix], [persistable], [show_api], [status], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'jero-cloud-websocket', N'jero-system-websocket', N'jero-system-websocket', N'lb:ws://jero-system', N'[{"args":["/websocket/**","/eoaSocket/**","/newsWebsocket/**"],"name":"Path"}]', N'[]', NULL, NULL, NULL, NULL, N'1', N'admin', N'2020-11-16 19:41:51.0000000', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_gateway_route] ([id], [router_id], [name], [uri], [predicates], [filters], [retryable], [strip_prefix], [persistable], [show_api], [status], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'jero-demo', N'jero-demo', N'jero-demo', N'lb://jero-demo', N'[{"args":["/mock/**","/test/**","/bigscreen/template1/**","/bigscreen/template2/**"],"name":"Path"}]', N'[]', NULL, NULL, NULL, NULL, N'1', N'admin', N'2020-11-16 19:41:51.0000000', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_gateway_route] ([id], [router_id], [name], [uri], [predicates], [filters], [retryable], [strip_prefix], [persistable], [show_api], [status], [create_by], [create_time], [update_by], [update_time], [sys_org_code]) VALUES (N'jero-system', N'jero-system', N'jero-system', N'lb://jero-system', N'[{"args":["/sys/**","/eoa/**","/joa/**","/online/**","/bigscreen/**","/jmreport/**","/desform/**","/process/**","/act/**","/plug-in/***/","/druid/**","/generic/**"],"name":"Path"}]', N'[]', NULL, NULL, NULL, NULL, N'1', N'admin', N'2020-11-16 19:41:51.0000000', NULL, NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for sys_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_log]') AND type IN ('U')) + DROP TABLE [dbo].[sys_log] +GO + +CREATE TABLE [dbo].[sys_log] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [log_type] int NULL, + [log_content] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [operate_type] int NULL, + [userid] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [username] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ip] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [method] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [request_url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [request_param] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [request_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [cost_time] bigint NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'日志类型(1登录日志,2操作日志)', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'log_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'日志内容', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'log_content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作类型', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'operate_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作用户账号', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'userid' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作用户名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'IP', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求java方法', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'method' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求路径', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求参数', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'request_param' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求类型', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'request_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'耗时', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'cost_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'系统日志表', +'SCHEMA', N'dbo', +'TABLE', N'sys_log' +GO + + +-- ---------------------------- +-- Records of sys_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_permission +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_permission]') AND type IN ('U')) + DROP TABLE [dbo].[sys_permission] +GO + +CREATE TABLE [dbo].[sys_permission] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [parent_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [component] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [component_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [redirect] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [menu_type] int NULL, + [perms] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [perms_type] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [sort_no] float(53) NULL, + [always_show] tinyint NULL, + [icon] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [is_route] tinyint NULL, + [is_leaf] tinyint NULL, + [keep_alive] tinyint NULL, + [hidden] int NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [del_flag] int NULL, + [rule_flag] int NULL, + [status] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [internal_or_external] tinyint NULL +) +GO + +ALTER TABLE [dbo].[sys_permission] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父id', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单标题', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'路径', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'组件', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'component' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'组件名字', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'component_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'一级菜单跳转地址', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'redirect' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'menu_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单权限编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'perms' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限策略1显示2禁用', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'perms_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单排序', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'sort_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'聚合子路由: 1是0否', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'always_show' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单图标', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'icon' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否路由菜单: 0:不是 1:是(默认值1)', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'is_route' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否叶子节点: 1:是 0:不是', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'is_leaf' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否缓存该页面: 1:是 0:不是', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'keep_alive' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否隐藏路由: 0否,1是', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'hidden' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态 0正常 1已删除', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否添加数据权限1是0否', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'rule_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'按钮权限状态(0无效1有效)', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'外链菜单打开方式 0/内部打开 1/外部打开', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission', +'COLUMN', N'internal_or_external' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单权限表', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission' +GO + + +-- ---------------------------- +-- Records of sys_permission +-- ---------------------------- +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'00a2a0ae65cdca5e93209cdbde97cbe6', N'2e42e3835c2b44ec9f7bc26c146ee531', N'成功', N'/result/success', N'result/Success', NULL, NULL, N'1', NULL, NULL, N'1', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'020b06793e4de2eee0007f603000c769', N'f0675b52d89100ee88472b6800754a08', N'ViserChartDemo', N'/report/ViserChartDemo', N'demo/report/ViserChartDemo', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-03 19:08:53.0000000', N'admin', N'2019-04-03 19:08:53.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'024f1fd1283dc632458976463d8984e1', N'700b7f95165c46cc7a78bf227aa8fed3', N'Tomcat信息', N'/monitor/TomcatInfo', N'modules/monitor/TomcatInfo', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-02 09:44:29.0000000', N'admin', N'2019-05-07 15:19:10.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'043780fa095ff1b2bec4dc406d76f023', N'2a470fc0c3954d9dbb61de6d80846549', N'表格合计', N'/demo/tableTotal', N'demo/TableTotal', NULL, NULL, N'1', NULL, N'1', N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-08-14 10:28:46.0000000', NULL, NULL, N'0', N'0', N'1', NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'05b3c82ddb2536a4a5ee1a4c46b5abef', N'540a2936940846cb98114ffb0d145cb8', N'用户列表', N'/list/user-list', N'demo/list/UserList', NULL, NULL, N'1', NULL, NULL, N'3', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'0620e402857b8c5b605e1ad9f4b89350', N'2a470fc0c3954d9dbb61de6d80846549', N'异步树列表Demo', N'/demo/jeroTreeTable', N'demo/JeroTreeTable', NULL, NULL, N'1', NULL, N'0', N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-05-13 17:30:30.0000000', N'admin', N'2021-03-16 22:19:21.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'078f9558cdeab239aecb2bda1a8ed0d1', N'fb07ca05a3e13674dbf6d3245956da2e', N'搜索列表(文章)', N'/list/search/article', N'demo/list/TableList', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-02-12 14:00:34.0000000', N'admin', N'2019-02-12 14:17:54.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'08e6b9dc3c04489c8e1ff2ce6f105aa4', N'', N'系统监控', N'/dashboard3', N'layouts/RouteView', NULL, NULL, N'0', NULL, NULL, N'16', N'0', N'dashboard', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:31:58.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'0ac2ad938963b6c6d1af25477d5b8b51', N'8d4683aacaa997ab86b966b464360338', N'代码生成按钮', NULL, NULL, NULL, NULL, N'2', N'online:goGenerateCode', N'1', N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-06-11 14:20:09.0000000', NULL, NULL, N'0', N'0', N'1', NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'109c78a583d4693ce2f16551b7786786', N'e41b69c57a941a3bbcce45032fe57605', N'Online报表配置', N'/online/cgreport', N'modules/online/cgreport/OnlCgreportHeadList', NULL, NULL, N'1', NULL, NULL, N'2', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-03-08 10:51:07.0000000', N'admin', N'2019-03-30 19:04:28.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1166535831146504193', N'2a470fc0c3954d9dbb61de6d80846549', N'文件上传示例', N'/oss/file', N'modules/oss/OSSFileList', NULL, NULL, N'1', NULL, N'1', N'1', N'0', N'', N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-08-28 02:19:50.0000000', N'admin', N'2021-03-16 20:48:53.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1192318987661234177', N'e41b69c57a941a3bbcce45032fe57605', N'系统编码规则', N'/isystem/fillRule', N'system/SysFillRuleList', NULL, NULL, N'1', NULL, N'1', N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-11-07 13:52:53.0000000', N'admin', N'2020-07-10 16:55:03.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1205097455226462210', N'1371830841603710977', N'报表设计', N'/big/screen', N'layouts/RouteView', NULL, NULL, N'1', NULL, N'1', N'2', N'0', N'area-chart', N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-12-12 20:09:58.0000000', N'admin', N'2021-03-16 22:29:22.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1205098241075453953', N'1205097455226462210', N'生产销售监控', N'{{ window._CONFIG[''domianURL''] }}/test/bigScreen/templat/index1', N'layouts/IframePageView', NULL, NULL, N'1', NULL, N'1', N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-12-12 20:13:05.0000000', N'admin', N'2019-12-12 20:15:27.0000000', N'0', N'0', N'1', N'1') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1205306106780364802', N'1205097455226462210', N'智慧物流监控', N'{{ window._CONFIG[''domianURL''] }}/test/bigScreen/templat/index2', N'layouts/IframePageView', NULL, NULL, N'1', NULL, N'1', N'2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-12-13 09:59:04.0000000', N'admin', N'2019-12-25 09:28:03.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1209731624921534465', N'e41b69c57a941a3bbcce45032fe57605', N'多数据源管理', N'/isystem/dataSource', N'system/SysDataSourceList', NULL, NULL, N'1', NULL, N'1', N'6', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-12-25 15:04:30.0000000', N'admin', N'2020-02-23 22:43:37.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1224641973866467330', N'e41b69c57a941a3bbcce45032fe57605', N'系统校验规则', N'/isystem/checkRule', N'system/SysCheckRuleList', NULL, NULL, N'1', NULL, N'1', N'5', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-11-07 13:52:53.0000000', N'admin', N'2020-07-10 16:55:12.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1260928341675982849', N'3f915b2769fc80648e92d04e84ca059d', N'添加按钮', NULL, NULL, NULL, NULL, N'2', N'user:add', N'1', N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-05-14 21:41:58.0000000', NULL, NULL, N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1260929666434318338', N'3f915b2769fc80648e92d04e84ca059d', N'用户编辑', NULL, NULL, NULL, NULL, N'2', N'user:edit', N'1', N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-05-14 21:47:14.0000000', NULL, NULL, N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1260931366557696001', N'3f915b2769fc80648e92d04e84ca059d', N'表单性别可见', N'', NULL, NULL, NULL, N'2', N'user:sex', N'1', N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-05-14 21:53:59.0000000', N'admin', N'2020-05-14 21:57:00.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1260933542969458689', N'3f915b2769fc80648e92d04e84ca059d', N'禁用生日字段', NULL, NULL, NULL, NULL, N'2', N'user:form:birthday', N'2', N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-05-14 22:02:38.0000000', NULL, NULL, N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1265162119913824258', N'08e6b9dc3c04489c8e1ff2ce6f105aa4', N'路由网关', N'/isystem/gatewayroute', N'system/SysGatewayRouteList', NULL, NULL, N'1', NULL, N'1', N'0', N'0', NULL, N'1', N'1', N'0', N'0', NULL, NULL, N'2020-05-26 14:05:30.0000000', N'admin', N'2020-09-09 14:47:52.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1280350452934307841', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'租户管理', N'/isys/tenant', N'system/TenantList', NULL, NULL, N'1', NULL, N'1', N'10', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-07 11:58:30.0000000', N'admin', N'2020-07-10 15:46:35.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1280464606292099074', N'2a470fc0c3954d9dbb61de6d80846549', N'图片裁剪', N'/demo/ImagCropper', N'demo/ImagCropper', NULL, NULL, N'1', NULL, N'1', N'9', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-07 19:32:06.0000000', NULL, NULL, N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1287715272999944193', N'2a470fc0c3954d9dbb61de6d80846549', N'JVXETable示例', N'/demo/j-vxe-table-demo', N'layouts/RouteView', NULL, NULL, N'1', NULL, N'1', N'0.1', N'0', N'', N'1', N'0', N'0', N'0', NULL, N'admin', N'2020-07-27 19:43:40.0000000', N'admin', N'2020-09-09 14:52:06.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1287715783966834689', N'1287715272999944193', N'普通示例', N'/demo/j-vxe-table-demo/normal', N'demo/JVXETableDemo', NULL, NULL, N'1', NULL, N'1', N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-27 19:45:42.0000000', NULL, NULL, N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1287716451494510593', N'1287715272999944193', N'布局模板', N'/demo/j-vxe-table-demo/layout', N'demo/JVxeDemo/layout-demo/Index', NULL, NULL, N'1', NULL, N'1', N'2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-27 19:48:21.0000000', NULL, NULL, N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1287718919049691137', N'1287715272999944193', N'即时保存', N'/demo/j-vxe-table-demo/jsbc', N'demo/JVxeDemo/demo/JSBCDemo', NULL, NULL, N'1', NULL, N'1', N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-27 19:57:36.0000000', N'admin', N'2020-07-27 20:03:37.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1287718938179911682', N'1287715272999944193', N'弹出子表', N'/demo/j-vxe-table-demo/tczb', N'demo/JVxeDemo/demo/PopupSubTable', NULL, NULL, N'1', NULL, N'1', N'4', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-27 19:57:41.0000000', N'admin', N'2020-07-27 20:03:47.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1287718956957810689', N'1287715272999944193', N'无痕刷新', N'/demo/j-vxe-table-demo/whsx', N'demo/JVxeDemo/demo/SocketReload', NULL, NULL, N'1', NULL, N'1', N'5', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-07-27 19:57:44.0000000', N'admin', N'2020-07-27 20:03:57.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'13212d3416eb690c2e1d5033166ff47a', N'2e42e3835c2b44ec9f7bc26c146ee531', N'失败', N'/result/fail', N'result/Error', NULL, NULL, N'1', NULL, NULL, N'2', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1335960713267093506', N'1205097455226462210', N'积木报表设计', N'{{ window._CONFIG[''domianURL''] }}/jmreport/list?token=${token}', N'layouts/IframePageView', NULL, NULL, N'1', NULL, N'1', N'0', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2020-12-07 22:53:50.0000000', N'admin', N'2020-12-08 09:28:06.0000000', N'0', N'0', N'1', N'1') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1367a93f2c410b169faa7abcbad2f77c', N'6e73eb3c26099c191bf03852ee1310a1', N'基本设置', N'/account/settings/BaseSetting', N'account/settings/BaseSetting', N'account-settings-base', NULL, N'1', N'BaseSettings', NULL, NULL, N'0', NULL, N'1', N'1', NULL, N'1', NULL, NULL, N'2018-12-26 18:58:35.0000000', N'admin', N'2019-03-20 12:57:31.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1371830841603710977', N'', N'图表/报表示例', N'/charts', N'layouts/RouteView', NULL, NULL, N'0', NULL, N'1', N'19', N'0', N'line-chart', N'1', N'0', N'0', N'0', NULL, N'admin', N'2021-03-16 22:28:55.0000000', N'admin', N'2021-03-16 22:31:24.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1371831353354936322', N'', N'日志中心', N'/log', N'layouts/RouteView', NULL, NULL, N'0', NULL, N'1', N'10', N'0', N'copy', N'1', N'0', N'0', N'0', NULL, N'admin', N'2021-03-16 22:30:57.0000000', N'admin', N'2021-03-16 22:37:10.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'190c2b43bec6a5f7a4194a85db67d96a', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'角色管理', N'/isystem/roleUserList', N'system/RoleUserList', NULL, NULL, N'1', N'sys:role:list', NULL, N'1.2', N'0', NULL, N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-04-17 15:13:56.0000000', N'admin', N'2019-12-25 09:36:31.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1a0811914300741f4e11838ff37a1d3a', N'3f915b2769fc80648e92d04e84ca059d', N'手机号禁用', NULL, NULL, NULL, NULL, N'2', N'user:form:phone', N'2', N'1', N'0', NULL, N'0', N'1', NULL, N'0', NULL, N'admin', N'2019-05-11 17:19:30.0000000', N'admin', N'2019-05-11 18:00:22.0000000', N'0', N'0', N'1', NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'200006f0edf145a2b50eacca07585451', N'fb07ca05a3e13674dbf6d3245956da2e', N'搜索列表(应用)', N'/list/search/application', N'demo/list/TableList', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-02-12 14:02:51.0000000', N'admin', N'2019-02-12 14:14:01.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'265de841c58907954b8877fb85212622', N'2a470fc0c3954d9dbb61de6d80846549', N'图片拖拽排序', N'/demo/imgDragSort', N'demo/ImgDragSort', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-25 10:43:08.0000000', N'admin', N'2019-04-25 10:46:26.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'277bfabef7d76e89b33062b16a9a5020', N'e3c13679c73a4f829bcff2aba8fd68b1', N'基础表单', N'/form/base-form', N'demo/form/BasicForm', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'0', NULL, N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2019-02-26 17:02:08.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'2a470fc0c3954d9dbb61de6d80846549', N'', N'开发示例Demo', N'/jero', N'layouts/RouteView', NULL, NULL, N'0', NULL, NULL, N'20', N'0', N'qrcode', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:31:20.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'2aeddae571695cd6380f6d6d334d6e7d', N'f0675b52d89100ee88472b6800754a08', N'布局统计报表', N'/report/ArchivesStatisticst', N'demo/report/ArchivesStatisticst', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-03 18:32:48.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'2dbbafa22cda07fa5d169d741b81fe12', N'e41b69c57a941a3bbcce45032fe57605', N'在线文档', N'{{ window._CONFIG[''domianURL''] }}/doc.html', N'layouts/IframePageView', NULL, NULL, N'1', NULL, NULL, N'8', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-01-30 10:00:01.0000000', N'admin', N'2021-03-16 22:33:43.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'2e42e3835c2b44ec9f7bc26c146ee531', N'2a470fc0c3954d9dbb61de6d80846549', N'结果页', N'/result', N'layouts/PageView', NULL, NULL, N'1', NULL, NULL, N'20', N'0', N'check-circle-o', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:22:54.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'3f915b2769fc80648e92d04e84ca059d', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'用户管理', N'/isystem/user', N'system/UserList', NULL, NULL, N'1', N'sys:user:list', NULL, N'1.1', N'0', NULL, N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2019-12-25 09:36:24.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'3fac0d3c9cd40fa53ab70d4c583821f8', N'2a470fc0c3954d9dbb61de6d80846549', N'分屏', N'/demo/splitPanel', N'demo/SplitPanel', NULL, NULL, N'1', NULL, NULL, N'6', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-25 16:27:06.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'4148ec82b6acd69f470bea75fe41c357', N'2a470fc0c3954d9dbb61de6d80846549', N'单表模型示例', N'/demo/JeroDemoList', N'demo/JeroDemoList', N'DemoList', NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', N'0', N'0', NULL, NULL, N'2018-12-28 15:57:30.0000000', N'jero', N'2020-05-14 22:09:34.0000000', N'0', N'1', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'418964ba087b90a84897b62474496b93', N'540a2936940846cb98114ffb0d145cb8', N'查询表格', N'/list/query-list', N'demo/list/TableList', NULL, NULL, N'1', NULL, NULL, N'1', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'4356a1a67b564f0988a484f5531fd4d9', N'2a470fc0c3954d9dbb61de6d80846549', N'内嵌Table', N'/demo/TableExpandeSub', N'demo/TableExpandeSub', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-04 22:48:13.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'45c966826eeff4c99b8f8ebfe74511fc', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'部门管理', N'/isystem/depart', N'system/DepartList', NULL, NULL, N'1', N'sys:depart:list', NULL, N'1.4', N'0', NULL, N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-01-29 18:47:40.0000000', N'admin', N'2019-12-25 09:36:47.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'4875ebe289344e14844d8e3ea1edd73f', N'2a470fc0c3954d9dbb61de6d80846549', N'详情页', N'/profile', N'layouts/RouteView', NULL, NULL, N'1', NULL, NULL, N'21', N'0', N'profile', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:23:07.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'4f66409ef3bbd69c1d80469d6e2a885e', N'6e73eb3c26099c191bf03852ee1310a1', N'账户绑定', N'/account/settings/binding', N'account/settings/Binding', NULL, NULL, N'1', N'BindingSettings', NULL, NULL, NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-26 19:01:20.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'4f84f9400e5e92c95f05b554724c2b58', N'540a2936940846cb98114ffb0d145cb8', N'角色列表', N'/list/role-list', N'demo/list/RoleList', NULL, NULL, N'1', NULL, NULL, N'4', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'53a9230444d33de28aa11cc108fb1dba', N'5c8042bd6c601270b2bbd9b20bccc68b', N'我的消息', N'/isps/userAnnouncement', N'system/UserAnnouncementList', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-04-19 10:16:00.0000000', N'admin', N'2021-03-16 18:01:26.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'540a2936940846cb98114ffb0d145cb8', N'2a470fc0c3954d9dbb61de6d80846549', N'列表页', N'/list', N'layouts/PageView', NULL, N'/list/query-list', N'1', NULL, NULL, N'24', N'0', N'table', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:23:31.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'54dd5457a3190740005c1bfec55b1c34', N'e41b69c57a941a3bbcce45032fe57605', N'菜单管理', N'/isystem/permission', N'system/PermissionList', NULL, NULL, N'1', NULL, NULL, N'7', N'0', NULL, N'1', N'1', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:32:38.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'58857ff846e61794c69208e9d3a85466', N'1371831353354936322', N'操作日志', N'/isystem/log', N'system/LogList', NULL, NULL, N'1', NULL, NULL, N'1', N'0', N'', N'1', N'1', N'0', N'0', NULL, NULL, N'2018-12-26 10:11:18.0000000', N'admin', N'2021-03-16 22:33:27.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'58b9204feaf07e47284ddb36cd2d8468', N'2a470fc0c3954d9dbb61de6d80846549', N'图片翻页', N'/demo/imgTurnPage', N'demo/ImgTurnPage', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-25 11:36:42.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'5c2f42277948043026b7a14692456828', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'我的部门', N'/isystem/departUserList', N'system/DepartUserList', NULL, NULL, N'1', NULL, NULL, N'2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-04-17 15:12:24.0000000', N'admin', N'2019-12-25 09:35:26.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'5c8042bd6c601270b2bbd9b20bccc68b', N'', N'消息中心', N'/message', N'layouts/RouteView', NULL, NULL, N'0', NULL, NULL, N'9', N'0', N'message', N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-04-09 11:05:04.0000000', N'admin', N'2021-03-16 22:32:06.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'6531cf3421b1265aeeeabaab5e176e6d', N'e3c13679c73a4f829bcff2aba8fd68b1', N'分步表单', N'/form/step-form', N'demo/form/stepForm/StepForm', NULL, NULL, N'1', NULL, NULL, N'2', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'655563cd64b75dcf52ef7bcdd4836953', N'2a470fc0c3954d9dbb61de6d80846549', N'图片预览', N'/demo/ImagPreview', N'demo/ImagPreview', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-17 11:18:45.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'65a8f489f25a345836b7f44b1181197a', N'c65321e57b7949b7a975313220de0422', N'403', N'/exception/403', N'exception/403', NULL, NULL, N'1', NULL, NULL, N'1', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'6ad53fd1b220989a8b71ff482d683a5a', N'2a470fc0c3954d9dbb61de6d80846549', N'一对多Tab示例', N'/demo/tablist/jeroOrderDMainList', N'demo/tablist/JeroOrderDMainList', NULL, NULL, N'1', NULL, NULL, N'2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-02-20 14:45:09.0000000', N'admin', N'2021-03-16 22:18:38.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'6e73eb3c26099c191bf03852ee1310a1', N'717f6bee46f44a3897eca9abd6e2ec44', N'个人设置', N'/account/settings/BaseSetting', N'account/settings/Index', NULL, NULL, N'1', NULL, NULL, N'2', N'1', NULL, N'1', N'0', NULL, N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2019-04-19 09:41:05.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'700b7f95165c46cc7a78bf227aa8fed3', N'08e6b9dc3c04489c8e1ff2ce6f105aa4', N'性能监控', N'/monitor', N'layouts/RouteView', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-04-02 11:34:34.0000000', N'admin', N'2020-09-09 14:48:51.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'717f6bee46f44a3897eca9abd6e2ec44', N'2a470fc0c3954d9dbb61de6d80846549', N'个人页', N'/account', N'layouts/RouteView', NULL, NULL, N'1', NULL, NULL, N'25', N'0', N'user', N'1', N'0', N'0', N'1', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:23:42.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'73678f9daa45ed17a3674131b03432fb', N'540a2936940846cb98114ffb0d145cb8', N'权限列表', N'/list/permission-list', N'demo/list/PermissionList', NULL, NULL, N'1', NULL, NULL, N'5', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'7960961b0063228937da5fa8dd73d371', N'2a470fc0c3954d9dbb61de6d80846549', N'JEditableTable示例', N'/demo/JEditableTable', N'demo/JeroEditableTableExample', NULL, NULL, N'1', NULL, NULL, N'0.2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-03-22 15:22:18.0000000', N'admin', N'2021-03-16 22:21:32.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'7ac9eb9ccbde2f7a033cd4944272bf1e', N'540a2936940846cb98114ffb0d145cb8', N'卡片列表', N'/list/card', N'demo/list/CardList', NULL, NULL, N'1', NULL, NULL, N'7', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'841057b8a1bef8f6b4b20f9a618a7fa6', N'1371831353354936322', N'数据日志', N'/sys/dataLog-list', N'system/DataLogList', NULL, NULL, N'1', NULL, NULL, N'2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-03-11 19:26:49.0000000', N'admin', N'2021-03-16 22:33:07.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'882a73768cfd7f78f3a37584f7299656', N'6e73eb3c26099c191bf03852ee1310a1', N'个性化设置', N'/account/settings/custom', N'account/settings/Custom', NULL, NULL, N'1', N'CustomSettings', NULL, NULL, NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-26 19:00:46.0000000', NULL, N'2018-12-26 21:13:25.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'8b3bff2eee6f1939147f5c68292a1642', N'700b7f95165c46cc7a78bf227aa8fed3', N'服务器信息', N'/monitor/SystemInfo', N'modules/monitor/SystemInfo', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-02 11:39:19.0000000', N'admin', N'2019-04-02 15:40:02.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'8d1ebd663688965f1fd86a2f0ead3416', N'700b7f95165c46cc7a78bf227aa8fed3', N'Redis监控', N'/monitor/redis/info', N'modules/monitor/RedisInfo', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-02 13:11:33.0000000', N'admin', N'2019-05-07 15:18:54.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'8d4683aacaa997ab86b966b464360338', N'e41b69c57a941a3bbcce45032fe57605', N'Online表单开发', N'/online/cgform', N'modules/online/cgform/OnlCgformHeadList', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'0', NULL, N'0', NULL, N'admin', N'2019-03-12 15:48:14.0000000', N'admin', N'2019-06-11 14:19:17.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'8fb8172747a78756c11916216b8b8066', N'717f6bee46f44a3897eca9abd6e2ec44', N'工作台', N'/dashboard/workplace', N'dashboard/Workplace', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', NULL, N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2019-04-02 11:45:02.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'944abf0a8fc22fe1f1154a389a574154', N'5c8042bd6c601270b2bbd9b20bccc68b', N'消息管理', N'/modules/message/sysMessageList', N'modules/message/SysMessageList', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-04-09 11:27:53.0000000', N'admin', N'2021-03-16 18:01:20.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'9502685863ab87f0ad1134142788a385', N'', N'首页', N'/dashboard/analysis', N'dashboard/Analysis', NULL, NULL, N'0', NULL, NULL, N'0', N'0', N'home', N'1', N'1', NULL, N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2019-03-29 11:04:13.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'97c8629abc7848eccdb6d77c24bb3ebb', N'700b7f95165c46cc7a78bf227aa8fed3', N'磁盘监控', N'/monitor/Disk', N'modules/monitor/DiskMonitoring', NULL, NULL, N'1', NULL, NULL, N'6', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-25 14:30:06.0000000', N'admin', N'2019-05-05 14:37:14.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'9a90363f216a6a08f32eecb3f0bf12a3', N'2a470fc0c3954d9dbb61de6d80846549', N'Jero组件示例', N'/demo/SelectDemo', N'demo/SelectDemo', NULL, NULL, N'1', NULL, NULL, N'0', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-03-19 11:19:05.0000000', N'admin', N'2021-03-16 22:15:28.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'ae4fed059f67086fd52a73d913cf473d', N'540a2936940846cb98114ffb0d145cb8', N'内联编辑表格', N'/list/edit-table', N'demo/list/TableInnerEditList', NULL, NULL, N'1', NULL, NULL, N'2', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'aedbf679b5773c1f25e9f7b10111da73', N'08e6b9dc3c04489c8e1ff2ce6f105aa4', N'SQL监控', N'{{ window._CONFIG[''domianURL''] }}/druid/', N'layouts/IframePageView', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-01-30 09:43:22.0000000', N'admin', N'2020-09-09 14:48:38.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'b1cb0a3fedf7ed0e4653cb5a229837ee', N'e41b69c57a941a3bbcce45032fe57605', N'定时任务', N'/isystem/QuartzJobList', N'system/QuartzJobList', NULL, NULL, N'1', NULL, NULL, N'10', N'0', NULL, N'1', N'1', N'0', N'0', NULL, NULL, N'2019-01-03 09:38:52.0000000', N'admin', N'2021-03-16 22:42:39.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'b3c824fc22bd953e2eb16ae6914ac8f9', N'4875ebe289344e14844d8e3ea1edd73f', N'高级详情页', N'/profile/advanced', N'demo/profile/advanced/Advanced', NULL, NULL, N'1', NULL, NULL, N'2', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'b4dfc7d5dd9e8d5b6dd6d4579b1aa559', N'c65321e57b7949b7a975313220de0422', N'500', N'/exception/500', N'exception/500', NULL, NULL, N'1', NULL, NULL, N'3', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'c431130c0bc0ec71b0a5be37747bb36a', N'2a470fc0c3954d9dbb61de6d80846549', N'一对多JEditable', N'/demo/JeroOrderMainListForJEditableTable', N'demo/JeroOrderMainListForJEditableTable', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-03-29 10:51:59.0000000', N'admin', N'2019-04-04 20:09:39.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'c65321e57b7949b7a975313220de0422', N'2a470fc0c3954d9dbb61de6d80846549', N'异常页', N'/exception', N'layouts/RouteView', NULL, NULL, N'1', NULL, NULL, N'22', N'0', N'warning', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:23:19.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'c6cf95444d80435eb37b2f9db3971ae6', N'2a470fc0c3954d9dbb61de6d80846549', N'数据回执模拟', N'/demo/InterfaceTest', N'demo/InterfaceTest', NULL, NULL, N'1', NULL, NULL, N'6', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-02-19 16:02:23.0000000', N'admin', N'2019-02-21 16:25:45.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'cc50656cf9ca528e6f2150eba4714ad2', N'4875ebe289344e14844d8e3ea1edd73f', N'基础详情页', N'/profile/basic', N'demo/profile/basic/Index', NULL, NULL, N'1', NULL, NULL, N'1', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'd07a2c87a451434c99ab06296727ec4f', N'700b7f95165c46cc7a78bf227aa8fed3', N'JVM信息', N'/monitor/JvmInfo', N'modules/monitor/JvmInfo', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-01 23:07:48.0000000', N'admin', N'2019-04-02 11:37:16.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'd2bbf9ebca5a8fa2e227af97d2da7548', N'c65321e57b7949b7a975313220de0422', N'404', N'/exception/404', N'exception/404', NULL, NULL, N'1', NULL, NULL, N'2', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'', N'系统管理', N'/isystem', N'layouts/RouteView', NULL, NULL, N'0', NULL, NULL, N'15', N'0', N'setting', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:31:34.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'd86f58e7ab516d3bc6bfb1fe10585f97', N'717f6bee46f44a3897eca9abd6e2ec44', N'个人中心', N'/account/center', N'account/center/Index', NULL, NULL, N'1', NULL, NULL, N'1', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'de13e0f6328c069748de7399fcc1dbbd', N'fb07ca05a3e13674dbf6d3245956da2e', N'搜索列表(项目)', N'/list/search/project', N'demo/list/TableList', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-02-12 14:01:40.0000000', N'admin', N'2019-02-12 14:14:18.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'e08cb190ef230d5d4f03824198773950', N'5c8042bd6c601270b2bbd9b20bccc68b', N'系统通告', N'/isystem/annountCement', N'system/SysAnnouncementList', NULL, NULL, N'1', N'annountCement', NULL, N'1', N'0', N'', N'1', N'1', N'0', N'0', NULL, NULL, N'2019-01-02 17:23:01.0000000', N'admin', N'2021-03-16 18:00:58.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'e1979bb53e9ea51cecc74d86fd9d2f64', N'2a470fc0c3954d9dbb61de6d80846549', N'PDF预览', N'/demo/jeroPdfView', N'demo/JeroPdfView', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-04-25 10:39:35.0000000', N'admin', N'2021-03-16 22:18:26.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'e3c13679c73a4f829bcff2aba8fd68b1', N'2a470fc0c3954d9dbb61de6d80846549', N'表单页', N'/form', N'layouts/PageView', NULL, NULL, N'1', NULL, NULL, N'25', N'0', N'form', N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2021-03-16 22:23:54.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'e41b69c57a941a3bbcce45032fe57605', N'', N'开发工具', N'/online', N'layouts/RouteView', NULL, NULL, N'0', NULL, NULL, N'18', N'0', N'cloud', N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-03-08 10:43:10.0000000', N'admin', N'2021-03-16 22:31:28.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'e5973686ed495c379d829ea8b2881fc6', N'e3c13679c73a4f829bcff2aba8fd68b1', N'高级表单', N'/form/advanced-form', N'demo/form/advancedForm/AdvancedForm', NULL, NULL, N'1', NULL, NULL, N'3', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'e6bfd1fcabfd7942fdd05f076d1dad38', N'2a470fc0c3954d9dbb61de6d80846549', N'打印测试', N'/demo/PrintDemo', N'demo/PrintDemo', NULL, NULL, N'1', NULL, NULL, N'3', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-02-19 15:58:48.0000000', N'admin', N'2019-05-07 20:14:39.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'ebb9d82ea16ad864071158e0c449d186', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'分类字典', N'/isys/category', N'system/SysCategoryList', NULL, NULL, N'1', N'sys:category:list', N'1', N'5.2', N'0', NULL, N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-05-29 18:48:07.0000000', N'admin', N'2020-02-23 22:45:33.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'ec8d607d0156e198b11853760319c646', N'6e73eb3c26099c191bf03852ee1310a1', N'安全设置', N'/account/settings/security', N'account/settings/Security', NULL, NULL, N'1', N'SecuritySettings', NULL, NULL, NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-26 18:59:52.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'f0675b52d89100ee88472b6800754a08', N'1371830841603710977', N'统计报表', N'/report', N'layouts/RouteView', NULL, NULL, N'1', NULL, NULL, N'1', N'0', N'bar-chart', N'1', N'0', N'0', N'0', NULL, N'admin', N'2019-04-03 18:32:02.0000000', N'admin', N'2021-03-16 22:29:03.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'f1cb187abf927c88b89470d08615f5ac', N'd7d6e2e4e2934f2c9385a623fd98c6f3', N'数据字典', N'/isystem/dict', N'system/DictList', NULL, NULL, N'1', N'sys:dict:list', NULL, N'5', N'0', NULL, N'1', N'0', N'0', N'0', NULL, NULL, N'2018-12-28 13:54:43.0000000', N'admin', N'2020-02-23 22:45:25.0000000', N'0', N'0', N'1', N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'f23d9bfff4d9aa6b68569ba2cff38415', N'540a2936940846cb98114ffb0d145cb8', N'标准列表', N'/list/basic-list', N'demo/list/StandardList', NULL, NULL, N'1', NULL, NULL, N'6', NULL, NULL, N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-25 20:34:38.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'f780d0d3083d849ccbdb1b1baee4911d', N'5c8042bd6c601270b2bbd9b20bccc68b', N'模板管理', N'/modules/message/sysMessageTemplateList', N'modules/message/SysMessageTemplateList', NULL, NULL, N'1', NULL, NULL, N'1', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-09 11:50:31.0000000', N'admin', N'2019-04-12 10:16:34.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'fb07ca05a3e13674dbf6d3245956da2e', N'540a2936940846cb98114ffb0d145cb8', N'搜索列表', N'/list/search', N'demo/list/search/SearchLayout', NULL, N'/list/search/article', N'1', NULL, NULL, N'8', N'0', NULL, N'1', N'0', NULL, N'0', NULL, NULL, N'2018-12-25 20:34:38.0000000', N'admin', N'2019-02-12 15:09:13.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'fb367426764077dcf94640c843733985', N'2a470fc0c3954d9dbb61de6d80846549', N'一对多示例', N'/demo/jeroOrderMainList', N'demo/JeroOrderMainList', NULL, NULL, N'1', NULL, NULL, N'2', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2019-02-15 16:24:11.0000000', N'admin', N'2021-03-16 22:18:47.0000000', N'0', N'0', NULL, N'0') +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'fc810a2267dd183e4ef7c71cc60f4670', N'700b7f95165c46cc7a78bf227aa8fed3', N'请求追踪', N'/monitor/HttpTrace', N'modules/monitor/HttpTrace', NULL, NULL, N'1', NULL, NULL, N'4', N'0', NULL, N'1', N'1', NULL, N'0', NULL, N'admin', N'2019-04-02 09:46:19.0000000', N'admin', N'2019-04-02 11:37:27.0000000', N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'fedfbf4420536cacc0218557d263dfea', N'6e73eb3c26099c191bf03852ee1310a1', N'新消息通知', N'/account/settings/notification', N'account/settings/Notification', NULL, NULL, N'1', N'NotificationSettings', NULL, NULL, NULL, N'', N'1', N'1', NULL, NULL, NULL, NULL, N'2018-12-26 19:02:05.0000000', NULL, NULL, N'0', N'0', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383952003393466369', N'190c2b43bec6a5f7a4194a85db67d96a', N'角色添加', NULL, NULL, NULL, NULL, N'2', N'sys:role:add', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383952499906785282', N'190c2b43bec6a5f7a4194a85db67d96a', N'角色编辑', NULL, NULL, NULL, NULL, N'2', N'sys:role:edit', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383952680177971201', N'190c2b43bec6a5f7a4194a85db67d96a', N'角色删除', NULL, NULL, NULL, NULL, N'2', N'sys:role:del', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383952988471898113', N'45c966826eeff4c99b8f8ebfe74511fc', N'部门添加', NULL, NULL, NULL, NULL, N'2', N'sys:depart:add', N'1', N'1.00', N'0', NULL,N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383953084483710977', N'45c966826eeff4c99b8f8ebfe74511fc', N'部门编辑', NULL, NULL, NULL, NULL, N'2', N'sys:depart:edit', N'1', N'1.00', N'0', NULL,N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383953171704262657', N'45c966826eeff4c99b8f8ebfe74511fc', N'部门删除', NULL, NULL, NULL, NULL, N'2', N'sys:depart:del', N'1',N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL,N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383953340499832833', N'f1cb187abf927c88b89470d08615f5ac', N'数据字典添加', NULL, NULL, NULL, NULL, N'2', N'sys:dict:add', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383953594972450818', N'f1cb187abf927c88b89470d08615f5ac', N'数据字典编辑', NULL, NULL, NULL, NULL, N'2', N'sys:dict:edit', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383953732851806210', N'f1cb187abf927c88b89470d08615f5ac', N'数据字典删除', NULL, NULL, NULL, NULL, N'2', N'sys:dict:del', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL,N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383953875781103617', N'ebb9d82ea16ad864071158e0c449d186', N'分类字典添加', NULL, NULL, NULL, NULL, N'2', N'sys:category:add', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL,N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383954065124569090', N'ebb9d82ea16ad864071158e0c449d186', N'分类字典编辑', NULL, NULL, NULL, NULL, N'2', N'sys:category:edit', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383954151342682114', N'ebb9d82ea16ad864071158e0c449d186', N'分类字典删除', NULL, NULL, NULL, NULL, N'2', N'sys:category:del', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383956546739056641', N'3f915b2769fc80648e92d04e84ca059d', N'用户删除', NULL, NULL, NULL, NULL, N'2', N'sys:user:sel', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383956678637334529', N'3f915b2769fc80648e92d04e84ca059d', N'用户导入', NULL, NULL, NULL, NULL, N'2', N'sys:user:import', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383956779212550146', N'3f915b2769fc80648e92d04e84ca059d', N'用户导出', NULL, NULL, NULL, NULL, N'2', N'sys:user:export', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383956904978755586', N'190c2b43bec6a5f7a4194a85db67d96a', N'角色导入', NULL, NULL, NULL, NULL, N'2', N'sys:role:import', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957016807288833', N'190c2b43bec6a5f7a4194a85db67d96a', N'角色导出', NULL, NULL, NULL, NULL, N'2', N'sys:role:export', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957130082856962', N'45c966826eeff4c99b8f8ebfe74511fc', N'部门导入', NULL, NULL, NULL, NULL, N'2', N'sys:depart:import', N'1', N'1.00', N'0', NULL,N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957217370517506', N'45c966826eeff4c99b8f8ebfe74511fc', N'部门导出', NULL, NULL, NULL, NULL, N'2', N'sys:depart:export', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957378981244930', N'f1cb187abf927c88b89470d08615f5ac', N'数据字典导入', NULL, NULL, NULL, NULL, N'2', N'sys:dict:import', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957508945948674', N'f1cb187abf927c88b89470d08615f5ac', N'数据字典导出', NULL, NULL, NULL, NULL, N'2', N'sys:dict:export', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957660913971202', N'ebb9d82ea16ad864071158e0c449d186', N'分类字典导入', NULL, NULL, NULL, NULL, N'2', N'sys:category:import', N'1', N'1.00', N'0', NULL,N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', NULL, NULL, N'0', N'0', N'1', N'0'); +GO + +INSERT INTO [dbo].[sys_permission] ([id], [parent_id], [name], [url], [component], [component_name], [redirect], [menu_type], [perms], [perms_type], [sort_no], [always_show], [icon], [is_route], [is_leaf], [keep_alive], [hidden], [description], [create_by], [create_time], [update_by], [update_time], [del_flag], [rule_flag], [status], [internal_or_external]) VALUES (N'1383957793466560514', N'ebb9d82ea16ad864071158e0c449d186', N'分类字典导出', NULL, NULL, NULL, NULL, N'2', N'sys:category:export', N'1', N'1.00', N'0', NULL, N'1', N'1', N'0', N'0', NULL, N'admin', N'2021-04-19 09:14:05', N'admin', N'2021-04-19 09:14:05', N'0', N'0', N'1', N'0'); +GO + + +-- ---------------------------- +-- Table structure for sys_permission_data_rule +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_permission_data_rule]') AND type IN ('U')) + DROP TABLE [dbo].[sys_permission_data_rule] +GO + +CREATE TABLE [dbo].[sys_permission_data_rule] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [permission_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_column] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_conditions] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rule_value] nvarchar(300) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] nvarchar(3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_permission_data_rule] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'permission_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'rule_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'rule_column' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'条件', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'rule_conditions' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则值', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'rule_value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限有效状态1有0否', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'sys_permission_data_rule', +'COLUMN', N'update_by' +GO + + +-- ---------------------------- +-- Records of sys_permission_data_rule +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_quartz_job +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_quartz_job]') AND type IN ('U')) + DROP TABLE [dbo].[sys_quartz_job] +GO + +CREATE TABLE [dbo].[sys_quartz_job] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [del_flag] int NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [job_class_name] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [cron_expression] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [parameter] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] int NULL +) +GO + +ALTER TABLE [dbo].[sys_quartz_job] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改人', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'修改时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务类名', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'job_class_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'cron表达式', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'cron_expression' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'parameter' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态 0正常 -1停止', +'SCHEMA', N'dbo', +'TABLE', N'sys_quartz_job', +'COLUMN', N'status' +GO + + +-- ---------------------------- +-- Records of sys_quartz_job +-- ---------------------------- +INSERT INTO [dbo].[sys_quartz_job] ([id], [create_by], [create_time], [del_flag], [update_by], [update_time], [job_class_name], [cron_expression], [parameter], [description], [status]) VALUES (N'a253cdfc811d69fa0efc70d052bc8128', N'admin', N'2019-03-30 12:44:48.0000000', N'0', N'admin', N'2021-03-16 16:47:05.0000000', N'com.jero.modules.quartz.job.SampleJob', N'0/1 * * * * ?', NULL, N'Demo', N'-1') +GO + +INSERT INTO [dbo].[sys_quartz_job] ([id], [create_by], [create_time], [del_flag], [update_by], [update_time], [job_class_name], [cron_expression], [parameter], [description], [status]) VALUES (N'df26ecacf0f75d219d746750fe84bbee', NULL, NULL, N'0', N'admin', N'2021-03-16 16:47:23.0000000', N'com.jero.modules.quartz.job.SampleParamJob', N'0/1 * * * * ?', N'scott', N'Demo-带参测试,后台将每隔1秒执行输出日志', N'-1') +GO + + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_role]') AND type IN ('U')) + DROP TABLE [dbo].[sys_role] +GO + +CREATE TABLE [dbo].[sys_role] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [role_name] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [role_code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_role] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'role_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'role_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_role', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色表', +'SCHEMA', N'dbo', +'TABLE', N'sys_role' +GO + + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO [dbo].[sys_role] ([id], [role_name], [role_code], [description], [create_by], [create_time], [update_by], [update_time]) VALUES (N'f6817f48af4fb3af11b9e8bf182f618b', N'开发管理员', N'admin', N'开发人员使用的最高管理员', NULL, N'2018-12-21 18:03:39.0000000', N'admin', N'2021-03-16 13:55:05.0000000') +GO + + +-- ---------------------------- +-- Table structure for sys_role_permission +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_role_permission]') AND type IN ('U')) + DROP TABLE [dbo].[sys_role_permission] +GO + +CREATE TABLE [dbo].[sys_role_permission] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [role_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [permission_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [data_rule_ids] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [operate_date] datetime2(7) NULL, + [operate_ip] nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_role_permission] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色id', +'SCHEMA', N'dbo', +'TABLE', N'sys_role_permission', +'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限id', +'SCHEMA', N'dbo', +'TABLE', N'sys_role_permission', +'COLUMN', N'permission_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据权限ids', +'SCHEMA', N'dbo', +'TABLE', N'sys_role_permission', +'COLUMN', N'data_rule_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_role_permission', +'COLUMN', N'operate_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作ip', +'SCHEMA', N'dbo', +'TABLE', N'sys_role_permission', +'COLUMN', N'operate_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色权限表', +'SCHEMA', N'dbo', +'TABLE', N'sys_role_permission' +GO + + +-- ---------------------------- +-- Records of sys_role_permission +-- ---------------------------- +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'00b82058779cca5106fbb84783534c9b', N'f6817f48af4fb3af11b9e8bf182f618b', N'4148ec82b6acd69f470bea75fe41c357', N'', NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'0254c0b25694ad5479e6d6935bbc176e', N'f6817f48af4fb3af11b9e8bf182f618b', N'944abf0a8fc22fe1f1154a389a574154', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'09bd4fc30ffe88c4a44ed3868f442719', N'f6817f48af4fb3af11b9e8bf182f618b', N'e6bfd1fcabfd7942fdd05f076d1dad38', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'0c2d2db76ee3aa81a4fe0925b0f31365', N'f6817f48af4fb3af11b9e8bf182f618b', N'024f1fd1283dc632458976463d8984e1', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'0c6b8facbb1cc874964c87a8cf01e4b1', N'f6817f48af4fb3af11b9e8bf182f618b', N'841057b8a1bef8f6b4b20f9a618a7fa6', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'0c6e1075e422972083c3e854d9af7851', N'f6817f48af4fb3af11b9e8bf182f618b', N'08e6b9dc3c04489c8e1ff2ce6f105aa4', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'0e1469997af2d3b97fff56a59ee29eeb', N'f6817f48af4fb3af11b9e8bf182f618b', N'e41b69c57a941a3bbcce45032fe57605', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'0f861cb988fdc639bb1ab943471f3a72', N'f6817f48af4fb3af11b9e8bf182f618b', N'97c8629abc7848eccdb6d77c24bb3ebb', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1185039870537576450', N'f6817f48af4fb3af11b9e8bf182f618b', N'1166535831146504193', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1197431682208206850', N'f6817f48af4fb3af11b9e8bf182f618b', N'1192318987661234177', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1197795315916271617', N'f6817f48af4fb3af11b9e8bf182f618b', N'109c78a583d4693ce2f16551b7786786', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1209423530518761473', N'f6817f48af4fb3af11b9e8bf182f618b', N'1205097455226462210', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1209423530594258945', N'f6817f48af4fb3af11b9e8bf182f618b', N'1205098241075453953', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1209423530606841858', N'f6817f48af4fb3af11b9e8bf182f618b', N'1205306106780364802', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1209423580355481602', N'f6817f48af4fb3af11b9e8bf182f618b', N'190c2b43bec6a5f7a4194a85db67d96a', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1231590078632955905', N'f6817f48af4fb3af11b9e8bf182f618b', N'1224641973866467330', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1231590078658121729', N'f6817f48af4fb3af11b9e8bf182f618b', N'1209731624921534465', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1260928399955836929', N'f6817f48af4fb3af11b9e8bf182f618b', N'1260928341675982849', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1269526122208522241', N'f6817f48af4fb3af11b9e8bf182f618b', N'1267412134208319489', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'126ea9faebeec2b914d6d9bef957afb6', N'f6817f48af4fb3af11b9e8bf182f618b', N'f1cb187abf927c88b89470d08615f5ac', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1281494164924653569', N'f6817f48af4fb3af11b9e8bf182f618b', N'1280350452934307841', NULL, N'2020-07-10 15:43:13.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1281494164945625089', N'f6817f48af4fb3af11b9e8bf182f618b', N'1280464606292099074', NULL, N'2020-07-10 15:43:13.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1281494684632473602', N'f6817f48af4fb3af11b9e8bf182f618b', N'1265162119913824258', NULL, N'2020-07-10 15:45:16.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1303585080082485250', N'f6817f48af4fb3af11b9e8bf182f618b', N'1287715272999944193', NULL, N'2020-09-09 14:44:37.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1303585080103456769', N'f6817f48af4fb3af11b9e8bf182f618b', N'1287715783966834689', NULL, N'2020-09-09 14:44:37.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1303585080116039682', N'f6817f48af4fb3af11b9e8bf182f618b', N'1287716451494510593', NULL, N'2020-09-09 14:44:37.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1303585080124428290', N'f6817f48af4fb3af11b9e8bf182f618b', N'1287718919049691137', NULL, N'2020-09-09 14:44:37.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1303585080128622593', N'f6817f48af4fb3af11b9e8bf182f618b', N'1287718938179911682', NULL, N'2020-09-09 14:44:37.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1303585080141205506', N'f6817f48af4fb3af11b9e8bf182f618b', N'1287718956957810689', NULL, N'2020-09-09 14:44:37.0000000', N'127.0.0.1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1335960787783098369', N'f6817f48af4fb3af11b9e8bf182f618b', N'1335960713267093506', NULL, N'2020-12-07 22:54:07.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624661061633', N'f6817f48af4fb3af11b9e8bf182f618b', N'1371831353354936322', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624677838849', N'f6817f48af4fb3af11b9e8bf182f618b', N'1260929666434318338', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624677838850', N'f6817f48af4fb3af11b9e8bf182f618b', N'1260931366557696001', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624677838851', N'f6817f48af4fb3af11b9e8bf182f618b', N'1260933542969458689', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624677838852', N'f6817f48af4fb3af11b9e8bf182f618b', N'1a0811914300741f4e11838ff37a1d3a', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624677838853', N'f6817f48af4fb3af11b9e8bf182f618b', N'1371830841603710977', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1371832624686227457', N'f6817f48af4fb3af11b9e8bf182f618b', N'277bfabef7d76e89b33062b16a9a5020', NULL, N'2021-03-16 22:36:00.0000000', N'0:0:0:0:0:0:0:1') +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'154edd0599bd1dc2c7de220b489cd1e2', N'f6817f48af4fb3af11b9e8bf182f618b', N'7ac9eb9ccbde2f7a033cd4944272bf1e', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'165acd6046a0eaf975099f46a3c898ea', N'f6817f48af4fb3af11b9e8bf182f618b', N'4f66409ef3bbd69c1d80469d6e2a885e', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1664b92dff13e1575e3a929caa2fa14d', N'f6817f48af4fb3af11b9e8bf182f618b', N'd2bbf9ebca5a8fa2e227af97d2da7548', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1c1dbba68ef1817e7fb19c822d2854e8', N'f6817f48af4fb3af11b9e8bf182f618b', N'fb367426764077dcf94640c843733985', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'1e47db875601fd97723254046b5bba90', N'f6817f48af4fb3af11b9e8bf182f618b', N'baf16b7174bd821b6bab23fa9abb200d', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'20e53c87a785688bdc0a5bb6de394ef1', N'f6817f48af4fb3af11b9e8bf182f618b', N'540a2936940846cb98114ffb0d145cb8', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'25491ecbd5a9b34f09c8bc447a10ede1', N'f6817f48af4fb3af11b9e8bf182f618b', N'd07a2c87a451434c99ab06296727ec4f', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'2779cdea8367fff37db26a42c1a1f531', N'f6817f48af4fb3af11b9e8bf182f618b', N'fef097f3903caf3a3c3a6efa8de43fbb', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'29fb6b0ad59a7e911c8d27e0bdc42d23', N'f6817f48af4fb3af11b9e8bf182f618b', N'9a90363f216a6a08f32eecb3f0bf12a3', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'2ad37346c1b83ddeebc008f6987b2227', N'f6817f48af4fb3af11b9e8bf182f618b', N'8d1ebd663688965f1fd86a2f0ead3416', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'38a2e55db0960262800576e34b3af44c', N'f6817f48af4fb3af11b9e8bf182f618b', N'5c2f42277948043026b7a14692456828', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'3b1886f727ac503c93fecdd06dcb9622', N'f6817f48af4fb3af11b9e8bf182f618b', N'c431130c0bc0ec71b0a5be37747bb36a', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'3de2a60c7e42a521fecf6fcc5cb54978', N'f6817f48af4fb3af11b9e8bf182f618b', N'2d83d62bd2544b8994c8f38cf17b0ddf', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'3e4e38f748b8d87178dd62082e5b7b60', N'f6817f48af4fb3af11b9e8bf182f618b', N'7960961b0063228937da5fa8dd73d371', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'3f1d04075e3c3254666a4138106a4e51', N'f6817f48af4fb3af11b9e8bf182f618b', N'3fac0d3c9cd40fa53ab70d4c583821f8', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'4204f91fb61911ba8ce40afa7c02369f', N'f6817f48af4fb3af11b9e8bf182f618b', N'3f915b2769fc80648e92d04e84ca059d', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'444126230885d5d38b8fa6072c9f43f8', N'f6817f48af4fb3af11b9e8bf182f618b', N'f780d0d3083d849ccbdb1b1baee4911d', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'445656dd187bd8a71605f4bbab1938a3', N'f6817f48af4fb3af11b9e8bf182f618b', N'020b06793e4de2eee0007f603000c769', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'455cdb482457f529b79b479a2ff74427', N'f6817f48af4fb3af11b9e8bf182f618b', N'e1979bb53e9ea51cecc74d86fd9d2f64', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'45a358bb738782d1a0edbf7485e81459', N'f6817f48af4fb3af11b9e8bf182f618b', N'0ac2ad938963b6c6d1af25477d5b8b51', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'4dab5a06acc8ef3297889872caa74747', N'f6817f48af4fb3af11b9e8bf182f618b', N'ffb423d25cc59dcd0532213c4a518261', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'4e0a37ed49524df5f08fc6593aee875c', N'f6817f48af4fb3af11b9e8bf182f618b', N'f23d9bfff4d9aa6b68569ba2cff38415', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'4ea403fc1d19feb871c8bdd9f94a4ecc', N'f6817f48af4fb3af11b9e8bf182f618b', N'2e42e3835c2b44ec9f7bc26c146ee531', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'4f254549d9498f06f4cc9b23f3e2c070', N'f6817f48af4fb3af11b9e8bf182f618b', N'93d5cfb4448f11e9916698e7f462b4b6', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'504e326de3f03562cdd186748b48a8c7', N'f6817f48af4fb3af11b9e8bf182f618b', N'027aee69baee98a0ed2e01806e89c891', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'520b5989e6fe4a302a573d4fee12a40a', N'f6817f48af4fb3af11b9e8bf182f618b', N'6531cf3421b1265aeeeabaab5e176e6d', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'54fdf85e52807bdb32ce450814abc256', N'f6817f48af4fb3af11b9e8bf182f618b', N'cc50656cf9ca528e6f2150eba4714ad2', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'5d230e6cd2935c4117f6cb9a7a749e39', N'f6817f48af4fb3af11b9e8bf182f618b', N'fc810a2267dd183e4ef7c71cc60f4670', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'5de6871fadb4fe1cdd28989da0126b07', N'f6817f48af4fb3af11b9e8bf182f618b', N'a400e4f4d54f79bf5ce160a3432231af', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'5e4015a9a641cbf3fb5d28d9f885d81a', N'f6817f48af4fb3af11b9e8bf182f618b', N'2dbbafa22cda07fa5d169d741b81fe12', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'60eda4b4db138bdb47edbe8e10e71675', N'f6817f48af4fb3af11b9e8bf182f618b', N'fb07ca05a3e13674dbf6d3245956da2e', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'61835e48f3e675f7d3f5c9dd3a10dcf3', N'f6817f48af4fb3af11b9e8bf182f618b', N'f0675b52d89100ee88472b6800754a08', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'660fbc40bcb1044738f7cabdf1708c28', N'f6817f48af4fb3af11b9e8bf182f618b', N'b3c824fc22bd953e2eb16ae6914ac8f9', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'66b202f8f84fe766176b3f51071836ef', N'f6817f48af4fb3af11b9e8bf182f618b', N'1367a93f2c410b169faa7abcbad2f77c', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'6c74518eb6bb9a353f6a6c459c77e64b', N'f6817f48af4fb3af11b9e8bf182f618b', N'b4dfc7d5dd9e8d5b6dd6d4579b1aa559', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'6daddafacd7eccb91309530c17c5855d', N'f6817f48af4fb3af11b9e8bf182f618b', N'edfa74d66e8ea63ea432c2910837b150', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'6fb4c2142498dd6d5b6c014ef985cb66', N'f6817f48af4fb3af11b9e8bf182f618b', N'6e73eb3c26099c191bf03852ee1310a1', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'7413acf23b56c906aedb5a36fb75bd3a', N'f6817f48af4fb3af11b9e8bf182f618b', N'a4fc7b64b01a224da066bb16230f9c5a', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'76a54a8cc609754360bf9f57e7dbb2db', N'f6817f48af4fb3af11b9e8bf182f618b', N'c65321e57b7949b7a975313220de0422', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'7ca833caa5eac837b7200d8b6de8b2e3', N'f6817f48af4fb3af11b9e8bf182f618b', N'fedfbf4420536cacc0218557d263dfea', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'84eac2f113c23737128fb099d1d1da89', N'f6817f48af4fb3af11b9e8bf182f618b', N'03dc3d93261dda19fc86dd7ca486c6cf', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'86060e2867a5049d8a80d9fe5d8bc28b', N'f6817f48af4fb3af11b9e8bf182f618b', N'765dd244f37b804e3d00f475fd56149b', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'884f147c20e003cc80ed5b7efa598cbe', N'f6817f48af4fb3af11b9e8bf182f618b', N'e5973686ed495c379d829ea8b2881fc6', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'8b09925bdc194ab7f3559cd3a7ea0507', N'f6817f48af4fb3af11b9e8bf182f618b', N'ebb9d82ea16ad864071158e0c449d186', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'8d154c2382a8ae5c8d1b84bd38df2a93', N'f6817f48af4fb3af11b9e8bf182f618b', N'd86f58e7ab516d3bc6bfb1fe10585f97', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'8dd64f65a1014196078d0882f767cd85', N'f6817f48af4fb3af11b9e8bf182f618b', N'e3c13679c73a4f829bcff2aba8fd68b1', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'8e3dc1671abad4f3c83883b194d2e05a', N'f6817f48af4fb3af11b9e8bf182f618b', N'b1cb0a3fedf7ed0e4653cb5a229837ee', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'905bf419332ebcb83863603b3ebe30f0', N'f6817f48af4fb3af11b9e8bf182f618b', N'8fb8172747a78756c11916216b8b8066', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'9380121ca9cfee4b372194630fce150e', N'f6817f48af4fb3af11b9e8bf182f618b', N'65a8f489f25a345836b7f44b1181197a', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'94911fef73a590f6824105ebf9b6cab3', N'f6817f48af4fb3af11b9e8bf182f618b', N'8b3bff2eee6f1939147f5c68292a1642', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'9700d20dbc1ae3cbf7de1c810b521fe6', N'f6817f48af4fb3af11b9e8bf182f618b', N'ec8d607d0156e198b11853760319c646', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'980171fda43adfe24840959b1d048d4d', N'f6817f48af4fb3af11b9e8bf182f618b', N'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'987c23b70873bd1d6dca52f30aafd8c2', N'f6817f48af4fb3af11b9e8bf182f618b', N'00a2a0ae65cdca5e93209cdbde97cbe6', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'9b2ad767f9861e64a20b097538feafd3', N'f6817f48af4fb3af11b9e8bf182f618b', N'73678f9daa45ed17a3674131b03432fb', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'9d980ec0489040e631a9c24a6af42934', N'f6817f48af4fb3af11b9e8bf182f618b', N'05b3c82ddb2536a4a5ee1a4c46b5abef', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'a034ed7c38c996b880d3e78f586fe0ae', N'f6817f48af4fb3af11b9e8bf182f618b', N'c89018ea6286e852b424466fd92a2ffc', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'a307a9349ad64a2eff8ab69582fa9be4', N'f6817f48af4fb3af11b9e8bf182f618b', N'0620e402857b8c5b605e1ad9f4b89350', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'a5d25fdb3c62904a8474182706ce11a0', N'f6817f48af4fb3af11b9e8bf182f618b', N'418964ba087b90a84897b62474496b93', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'acacce4417e5d7f96a9c3be2ded5b4be', N'f6817f48af4fb3af11b9e8bf182f618b', N'f9d3f4f27653a71c52faa9fb8070fbe7', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'ae1852fb349d8513eb3fdc173da3ee56', N'f6817f48af4fb3af11b9e8bf182f618b', N'8d4683aacaa997ab86b966b464360338', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'af60ac8fafd807ed6b6b354613b9ccbc', N'f6817f48af4fb3af11b9e8bf182f618b', N'58857ff846e61794c69208e9d3a85466', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'b0c8a20800b8bf1ebdd7be473bceb44f', N'f6817f48af4fb3af11b9e8bf182f618b', N'58b9204feaf07e47284ddb36cd2d8468', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'b128ebe78fa5abb54a3a82c6689bdca3', N'f6817f48af4fb3af11b9e8bf182f618b', N'aedbf679b5773c1f25e9f7b10111da73', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'b21b07951bb547b09cc85624a841aea0', N'f6817f48af4fb3af11b9e8bf182f618b', N'4356a1a67b564f0988a484f5531fd4d9', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'b64c4ab9cd9a2ea8ac1e9db5fb7cf522', N'f6817f48af4fb3af11b9e8bf182f618b', N'2aeddae571695cd6380f6d6d334d6e7d', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'bbec16ad016efec9ea2def38f4d3d9dc', N'f6817f48af4fb3af11b9e8bf182f618b', N'13212d3416eb690c2e1d5033166ff47a', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'bea2986432079d89203da888d99b3f16', N'f6817f48af4fb3af11b9e8bf182f618b', N'54dd5457a3190740005c1bfec55b1c34', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'c56fb1658ee5f7476380786bf5905399', N'f6817f48af4fb3af11b9e8bf182f618b', N'de13e0f6328c069748de7399fcc1dbbd', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'c6fee38d293b9d0596436a0cbd205070', N'f6817f48af4fb3af11b9e8bf182f618b', N'4f84f9400e5e92c95f05b554724c2b58', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'c90b0b01c7ca454d2a1cb7408563e696', N'f6817f48af4fb3af11b9e8bf182f618b', N'882a73768cfd7f78f3a37584f7299656', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'cf1feb1bf69eafc982295ad6c9c8d698', N'f6817f48af4fb3af11b9e8bf182f618b', N'a2b11669e98c5fe54a53c3e3c4f35d14', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'cf2ef620217673e4042f695743294f01', N'f6817f48af4fb3af11b9e8bf182f618b', N'717f6bee46f44a3897eca9abd6e2ec44', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'cf43895aef7fc684669483ab00ef2257', N'f6817f48af4fb3af11b9e8bf182f618b', N'700b7f95165c46cc7a78bf227aa8fed3', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'd281a95b8f293d0fa2a136f46c4e0b10', N'f6817f48af4fb3af11b9e8bf182f618b', N'5c8042bd6c601270b2bbd9b20bccc68b', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'd37ad568e26f46ed0feca227aa9c2ffa', N'f6817f48af4fb3af11b9e8bf182f618b', N'9502685863ab87f0ad1134142788a385', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'd3ddcacee1acdfaa0810618b74e38ef2', N'f6817f48af4fb3af11b9e8bf182f618b', N'c6cf95444d80435eb37b2f9db3971ae6', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'd83282192a69514cfe6161b3087ff962', N'f6817f48af4fb3af11b9e8bf182f618b', N'53a9230444d33de28aa11cc108fb1dba', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'd8a5c9079df12090e108e21be94b4fd7', N'f6817f48af4fb3af11b9e8bf182f618b', N'078f9558cdeab239aecb2bda1a8ed0d1', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'dc83bb13c0e8c930e79d28b2db26f01f', N'f6817f48af4fb3af11b9e8bf182f618b', N'63b551e81c5956d5c861593d366d8c57', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'dc8fd3f79bd85bd832608b42167a1c71', N'f6817f48af4fb3af11b9e8bf182f618b', N'91c23960fab49335831cf43d820b0a61', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'de82e89b8b60a3ea99be5348f565c240', N'f6817f48af4fb3af11b9e8bf182f618b', N'56ca78fe0f22d815fabc793461af67b8', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'e7467726ee72235baaeb47df04a35e73', N'f6817f48af4fb3af11b9e8bf182f618b', N'e08cb190ef230d5d4f03824198773950', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'eaef4486f1c9b0408580bbfa2037eb66', N'f6817f48af4fb3af11b9e8bf182f618b', N'2a470fc0c3954d9dbb61de6d80846549', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'ec4bc97829ab56afd83f428b6dc37ff6', N'f6817f48af4fb3af11b9e8bf182f618b', N'200006f0edf145a2b50eacca07585451', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'ec846a3f85fdb6813e515be71f11b331', N'f6817f48af4fb3af11b9e8bf182f618b', N'732d48f8e0abe99fe6a23d18a3171cd1', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'ec93bb06f5be4c1f19522ca78180e2ef', N'f6817f48af4fb3af11b9e8bf182f618b', N'265de841c58907954b8877fb85212622', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'ecdd72fe694e6bba9c1d9fc925ee79de', N'f6817f48af4fb3af11b9e8bf182f618b', N'45c966826eeff4c99b8f8ebfe74511fc', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'edefd8d468f5727db465cf1b860af474', N'f6817f48af4fb3af11b9e8bf182f618b', N'6ad53fd1b220989a8b71ff482d683a5a', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'ef8bdd20d29447681ec91d3603e80c7b', N'f6817f48af4fb3af11b9e8bf182f618b', N'ae4fed059f67086fd52a73d913cf473d', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'f177acac0276329dc66af0c9ad30558a', N'f6817f48af4fb3af11b9e8bf182f618b', N'c2c356bf4ddd29975347a7047a062440', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'f99f99cc3bc27220cdd4f5aced33b7d7', N'f6817f48af4fb3af11b9e8bf182f618b', N'655563cd64b75dcf52ef7bcdd4836953', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'fafe73c4448b977fe42880a6750c3ee8', N'f6817f48af4fb3af11b9e8bf182f618b', N'9cb91b8851db0cf7b19d7ecc2a8193dd', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'fced905c7598973b970d42d833f73474', N'f6817f48af4fb3af11b9e8bf182f618b', N'4875ebe289344e14844d8e3ea1edd73f', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[sys_role_permission] ([id], [role_id], [permission_id], [data_rule_ids], [operate_date], [operate_ip]) VALUES (N'fd97963dc5f144d3aecfc7045a883427', N'f6817f48af4fb3af11b9e8bf182f618b', N'043780fa095ff1b2bec4dc406d76f023', NULL, NULL, NULL) +GO + + +-- ---------------------------- +-- Table structure for sys_sms +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_sms]') AND type IN ('U')) + DROP TABLE [dbo].[sys_sms] +GO + +CREATE TABLE [dbo].[sys_sms] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [es_title] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [es_type] nvarchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [es_receiver] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [es_param] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [es_content] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [es_send_time] datetime2(7) NULL, + [es_send_status] nvarchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [es_send_num] int NULL, + [es_result] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL +) +GO + +ALTER TABLE [dbo].[sys_sms] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'消息标题', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_title' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送方式:1短信 2邮件 3微信', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'接收人', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_receiver' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送所需参数Json格式', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_param' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'推送内容', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'推送时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_send_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'推送状态 0未推送 1推送成功 2推送失败 -1失败不再发送', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_send_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送次数 超过5次不再发送', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_send_num' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'推送失败原因', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'es_result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms', +'COLUMN', N'update_time' +GO + + +-- ---------------------------- +-- Records of sys_sms +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_sms_template +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_sms_template]') AND type IN ('U')) + DROP TABLE [dbo].[sys_sms_template] +GO + +CREATE TABLE [dbo].[sys_sms_template] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [template_code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_type] nvarchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_content] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_test_json] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_sms_template] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板标题', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'template_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板CODE', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'template_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板类型:1短信 2邮件 3微信', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'template_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板内容', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'template_content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板测试json', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'template_test_json' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_sms_template', +'COLUMN', N'update_by' +GO + + +-- ---------------------------- +-- Records of sys_sms_template +-- ---------------------------- +INSERT INTO [dbo].[sys_sms_template] ([id], [template_name], [template_code], [template_type], [template_content], [template_test_json], [create_time], [create_by], [update_time], [update_by]) VALUES (N'1199606397416775681', N'系统消息通知-Demo', N'sys_ts_note', N'4', N'

    系统通知

+
    +
  • 通知时间:  ${ts_date}
  • +
  • 通知内容:  ${ts_content}
  • +
', NULL, N'2019-11-27 16:30:27.0000000', N'admin', N'2021-03-16 16:56:36.0000000', N'admin') +GO + +INSERT INTO [dbo].[sys_sms_template] ([id], [template_name], [template_code], [template_type], [template_content], [template_test_json], [create_time], [create_by], [update_time], [update_by]) VALUES (N'1199648914107625473', N'流程办理超时提醒-Demo', N'bpm_chaoshi_tip', N'4', N'

   流程办理超时提醒

+
    +
  •    超时提醒信息:    您有待处理的超时任务,请尽快处理!
  • +
  •    超时任务标题:    ${title}
  • +
  •    超时任务节点:    ${task}
  • +
  •    任务处理人:       ${user}
  • +
  •    任务开始时间:    ${time}
  • +
', NULL, N'2019-11-27 19:19:24.0000000', N'admin', N'2021-03-16 16:56:20.0000000', N'admin') +GO + +INSERT INTO [dbo].[sys_sms_template] ([id], [template_name], [template_code], [template_type], [template_content], [template_test_json], [create_time], [create_by], [update_time], [update_by]) VALUES (N'4028608164691b000164693108140003', N'催办:${taskName}-Demo', N'SYS001', N'3', N'${userName},您好! +请前待办任务办理事项!${taskName} + + +=========================== +此消息由系统发出', N'{ +"taskName":"HR审批", +"userName":"admin" +}', N'2018-07-05 14:46:18.0000000', N'admin', N'2021-03-16 16:57:00.0000000', N'admin') +GO + + +-- ---------------------------- +-- Table structure for sys_tenant +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_tenant]') AND type IN ('U')) + DROP TABLE [dbo].[sys_tenant] +GO + +CREATE TABLE [dbo].[sys_tenant] ( + [id] int NOT NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [create_by] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [begin_date] datetime2(7) NULL, + [end_date] datetime2(7) NULL, + [status] int NULL +) +GO + +ALTER TABLE [dbo].[sys_tenant] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'begin_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'end_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态 1正常 0冻结', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'多租户信息表', +'SCHEMA', N'dbo', +'TABLE', N'sys_tenant' +GO + + +-- ---------------------------- +-- Records of sys_tenant +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_third_account +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_third_account]') AND type IN ('U')) + DROP TABLE [dbo].[sys_third_account] +GO + +CREATE TABLE [dbo].[sys_third_account] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [sys_user_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [third_type] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [avatar] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NULL, + [del_flag] tinyint NULL, + [realname] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [third_user_uuid] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_third_account] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'第三方登录id', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'sys_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'登录来源', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'third_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'头像', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(1-正常,2-冻结)', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态(0-正常,1-已删除)', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'真实姓名', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'realname' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'第三方账号', +'SCHEMA', N'dbo', +'TABLE', N'sys_third_account', +'COLUMN', N'third_user_uuid' +GO + + +-- ---------------------------- +-- Records of sys_third_account +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_user]') AND type IN ('U')) + DROP TABLE [dbo].[sys_user] +GO + +CREATE TABLE [dbo].[sys_user] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [username] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [realname] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [password] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [salt] nvarchar(45) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [avatar] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [birthday] datetime2(7) NULL, + [sex] tinyint NULL, + [email] nvarchar(45) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [phone] nvarchar(45) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [org_code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NULL, + [del_flag] tinyint NULL, + [third_id] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [third_type] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [activiti_sync] tinyint NULL, + [work_no] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [telephone] nvarchar(45) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [user_identity] tinyint NULL, + [depart_ids] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [rel_tenant_ids] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [client_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_user] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'登录账号', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'真实姓名', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'realname' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'密码', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'md5密码盐', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'salt' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'头像', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'生日', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'birthday' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'性别(0-默认未知,1-男,2-女)', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'电子邮件', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'email' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'电话', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'phone' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'机构编码', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'org_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'性别(1-正常,2-冻结)', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除状态(0-正常,1-已删除)', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'第三方登录的唯一标识', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'third_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'第三方类型', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'third_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'同步工作流引擎(1-同步,0-不同步)', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'activiti_sync' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'工号,唯一键', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'work_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'座机号', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'telephone' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'身份(1普通成员 2上级)', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'user_identity' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'负责部门', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'depart_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'多租户标识', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'rel_tenant_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'设备ID', +'SCHEMA', N'dbo', +'TABLE', N'sys_user', +'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户表', +'SCHEMA', N'dbo', +'TABLE', N'sys_user' +GO + + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO [dbo].[sys_user] ([id], [username], [realname], [password], [salt], [avatar], [birthday], [sex], [email], [phone], [org_code], [status], [del_flag], [third_id], [third_type], [activiti_sync], [work_no], [telephone], [create_by], [create_time], [update_by], [update_time], [user_identity], [depart_ids], [rel_tenant_ids], [client_id]) VALUES (N'e9ca23d68d884d4ebb19d07889727dae', N'admin', N'开发管理员', N'cb362cfeefbf3d8d', N'RCGTeGiH', NULL, N'2018-12-05 00:00:00.0000000', N'1', N'lixuetao@syxysoft.com', N'18608732661', N'A01', N'1', N'0', NULL, NULL, N'1', N'00001', NULL, NULL, N'2019-06-21 17:54:10.0000000', N'admin', N'2021-03-16 18:00:16.0000000', N'2', N'c6d7cb4deeac411cb3384b1b31278596', N'', NULL) +GO + + +-- ---------------------------- +-- Table structure for sys_user_agent +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_user_agent]') AND type IN ('U')) + DROP TABLE [dbo].[sys_user_agent] +GO + +CREATE TABLE [dbo].[sys_user_agent] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [agent_user_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [start_time] datetime2(7) NULL, + [end_time] datetime2(7) NULL, + [status] nvarchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [sys_org_code] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [sys_company_code] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_user_agent] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'序号', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户名', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'user_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'代理人用户名', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'agent_user_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'代理开始时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'start_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'代理结束时间', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态0无效1有效', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'create_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'update_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'所属部门', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'sys_org_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'所属公司', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent', +'COLUMN', N'sys_company_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户代理人设置', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_agent' +GO + + +-- ---------------------------- +-- Records of sys_user_agent +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_user_depart +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_user_depart]') AND type IN ('U')) + DROP TABLE [dbo].[sys_user_depart] +GO + +CREATE TABLE [dbo].[sys_user_depart] ( + [ID] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [dep_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_user_depart] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_depart', +'COLUMN', N'ID' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_depart', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_depart', +'COLUMN', N'dep_id' +GO + + +-- ---------------------------- +-- Records of sys_user_depart +-- ---------------------------- +INSERT INTO [dbo].[sys_user_depart] ([ID], [user_id], [dep_id]) VALUES (N'1371763232992583682', N'e9ca23d68d884d4ebb19d07889727dae', N'c6d7cb4deeac411cb3384b1b31278596') +GO + + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_user_role]') AND type IN ('U')) + DROP TABLE [dbo].[sys_user_role] +GO + +CREATE TABLE [dbo].[sys_user_role] ( + [id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [role_id] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[sys_user_role] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_role', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_role', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色id', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_role', +'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户角色表', +'SCHEMA', N'dbo', +'TABLE', N'sys_user_role' +GO + + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO [dbo].[sys_user_role] ([id], [user_id], [role_id]) VALUES (N'1371763232468295682', N'e9ca23d68d884d4ebb19d07889727dae', N'f6817f48af4fb3af11b9e8bf182f618b') +GO + + +-- ---------------------------- +-- Table structure for test_demo +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[test_demo]') AND type IN ('U')) + DROP TABLE [dbo].[test_demo] +GO + +CREATE TABLE [dbo].[test_demo] ( + [id] nvarchar(36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [create_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [update_by] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [name] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [sex] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [age] int NULL, + [descc] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [birthday] datetime2(7) NULL, + [user_code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [file_kk] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [top_pic] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [chegnshi] nvarchar(300) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ceck] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [xiamuti] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [search_sel] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [pop] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[test_demo] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建日期', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新人登录名称', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新日期', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户名', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'性别', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'年龄', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'age' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'descc' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'生日', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'birthday' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编码', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'user_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'附件', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'file_kk' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'头像', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'top_pic' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'城市', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'chegnshi' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'checkbox', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'ceck' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'下拉多选', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'xiamuti' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'搜索下拉', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'search_sel' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'弹窗', +'SCHEMA', N'dbo', +'TABLE', N'test_demo', +'COLUMN', N'pop' +GO + + +-- ---------------------------- +-- Records of test_demo +-- ---------------------------- +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'1331884149004910593', N'admin', N'2020-11-26 16:55:01.0000000', NULL, NULL, N'张三', N'1', NULL, NULL, NULL, NULL, N'', N'', N'130304', NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'1331901553776869377', N'admin', N'2020-11-26 18:04:10.0000000', N'admin', N'2020-11-26 18:04:24.0000000', N'张三', N'2', NULL, N'', NULL, N'', N'', N'', N'', N'1', N'1,2', N'hr', N'') +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'1335522992002248706', N'admin', N'2020-12-06 17:54:28.0000000', NULL, NULL, N'333', NULL, NULL, NULL, NULL, NULL, N'Javagongzuoliuxuqiu-20200703_1607248465493.docx', N'jerocloudweifuwujiagoutu-fuben_1607248465493.png', NULL, NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'1335523137875947522', N'admin', N'2020-12-06 17:55:03.0000000', NULL, NULL, N'张三66778888', NULL, NULL, NULL, NULL, NULL, N'Javagongzuoliuxuqiu-20200703_1607248489440.docx', N'jerocloudweifuwujiagoutu-fuben_1607248485629.png,jero_cloud_project_ref_1607248495491.png', NULL, N'2', NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'4028810c6aed99e1016aed9b31b40002', NULL, NULL, N'admin', N'2019-10-19 15:37:27.0000000', N'jero', N'2', N'55', N'5', N'2019-05-15 00:00:00.0000000', NULL, N'', N'', NULL, NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'4028810c6b02cba2016b02cba21f0000', N'admin', N'2019-05-29 16:53:48.0000000', N'admin', N'2019-08-23 23:45:21.0000000', N'张小红', N'1', N'8222', N'8', N'2019-04-01 00:00:00.0000000', NULL, N'', N'', NULL, NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'4028810c6b40244b016b4030a0e40001', N'admin', N'2019-06-10 15:00:57.0000000', N'admin', N'2020-05-03 01:28:34.0000000', N'小芳', N'2', N'0', NULL, N'2019-04-01 00:00:00.0000000', NULL, N'', N'11_1582482670686.jpg', NULL, NULL, NULL, NULL, NULL) +GO + +INSERT INTO [dbo].[test_demo] ([id], [create_by], [create_time], [update_by], [update_time], [name], [sex], [age], [descc], [birthday], [user_code], [file_kk], [top_pic], [chegnshi], [ceck], [xiamuti], [search_sel], [pop]) VALUES (N'fa1d1c249461498d90f405b94f60aae0', N'', NULL, N'admin', N'2019-05-15 12:30:28.0000000', N'战三', N'2', N'222', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) +GO + + +-- ---------------------------- +-- Primary Key structure for table demo +-- ---------------------------- +ALTER TABLE [dbo].[demo] ADD CONSTRAINT [PK__demo__3213E83F0C1C9E6E] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table jero_order_customer +-- ---------------------------- +ALTER TABLE [dbo].[jero_order_customer] ADD CONSTRAINT [PK__jero_or__3213E83F6A4BE210] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table jero_order_main +-- ---------------------------- +ALTER TABLE [dbo].[jero_order_main] ADD CONSTRAINT [PK__jero_or__3213E83F76300DC2] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table jero_order_ticket +-- ---------------------------- +ALTER TABLE [dbo].[jero_order_ticket] ADD CONSTRAINT [PK__jero_or__3213E83FEE844B2F] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_auth_data +-- ---------------------------- +ALTER TABLE [dbo].[onl_auth_data] ADD CONSTRAINT [PK__onl_auth__3213E83F4445AD09] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_auth_page +-- ---------------------------- +ALTER TABLE [dbo].[onl_auth_page] ADD CONSTRAINT [PK__onl_auth__3213E83FD3EEDFFB] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_auth_relation +-- ---------------------------- +ALTER TABLE [dbo].[onl_auth_relation] ADD CONSTRAINT [PK__onl_auth__3213E83F430BD9C0] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_button +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_formid] +ON [dbo].[onl_cgform_button] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_button_code] +ON [dbo].[onl_cgform_button] ( + [BUTTON_CODE] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_button_status] +ON [dbo].[onl_cgform_button] ( + [BUTTON_STATUS] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_button_order] +ON [dbo].[onl_cgform_button] ( + [ORDER_NUM] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocb_CGFORM_HEAD_ID] +ON [dbo].[onl_cgform_button] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocb_BUTTON_CODE] +ON [dbo].[onl_cgform_button] ( + [BUTTON_CODE] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocb_BUTTON_STATUS] +ON [dbo].[onl_cgform_button] ( + [BUTTON_STATUS] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocb_ORDER_NUM] +ON [dbo].[onl_cgform_button] ( + [ORDER_NUM] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_button +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_button] ADD CONSTRAINT [PK__onl_cgfo__3214EC27C20A8933] PRIMARY KEY CLUSTERED ([ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_enhance_java +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_fmid] +ON [dbo].[onl_cgform_enhance_java] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_buttoncode] +ON [dbo].[onl_cgform_enhance_java] ( + [BUTTON_CODE] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_status] +ON [dbo].[onl_cgform_enhance_java] ( + [ACTIVE_STATUS] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ejava_cgform_head_id] +ON [dbo].[onl_cgform_enhance_java] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocej_BUTTON_CODE] +ON [dbo].[onl_cgform_enhance_java] ( + [BUTTON_CODE] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocej_ACTIVE_STATUS] +ON [dbo].[onl_cgform_enhance_java] ( + [ACTIVE_STATUS] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_enhance_java +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_enhance_java] ADD CONSTRAINT [PK__onl_cgfo__3214EC27D3001FF6] PRIMARY KEY CLUSTERED ([ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_enhance_js +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_fmid] +ON [dbo].[onl_cgform_enhance_js] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_jstype] +ON [dbo].[onl_cgform_enhance_js] ( + [CG_JS_TYPE] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ejs_cgform_head_id] +ON [dbo].[onl_cgform_enhance_js] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ejs_cg_js_type] +ON [dbo].[onl_cgform_enhance_js] ( + [CG_JS_TYPE] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_enhance_js +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_enhance_js] ADD CONSTRAINT [PK__onl_cgfo__3214EC2738DBF3D3] PRIMARY KEY CLUSTERED ([ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_enhance_sql +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_formid] +ON [dbo].[onl_cgform_enhance_sql] ( + [CGFORM_HEAD_ID] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_oces_CGFORM_HEAD_ID] +ON [dbo].[onl_cgform_enhance_sql] ( + [CGFORM_HEAD_ID] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_enhance_sql +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_enhance_sql] ADD CONSTRAINT [PK__onl_cgfo__3214EC27882C12C9] PRIMARY KEY CLUSTERED ([ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_field +-- ---------------------------- +CREATE NONCLUSTERED INDEX [inex_table_id] +ON [dbo].[onl_cgform_field] ( + [cgform_head_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocf_cgform_head_id] +ON [dbo].[onl_cgform_field] ( + [cgform_head_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_field +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_field] ADD CONSTRAINT [PK__onl_cgfo__3213E83FBC56A0FF] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_head +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_onlineform_table_name] +ON [dbo].[onl_cgform_head] ( + [table_name] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_form_templdate] +ON [dbo].[onl_cgform_head] ( + [form_template] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_templdate_mobile] +ON [dbo].[onl_cgform_head] ( + [form_template_mobile] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_onlineform_table_version] +ON [dbo].[onl_cgform_head] ( + [table_version] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_och_cgform_head_id] +ON [dbo].[onl_cgform_head] ( + [table_name] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_och_table_name] +ON [dbo].[onl_cgform_head] ( + [form_template] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_och_form_template_mobile] +ON [dbo].[onl_cgform_head] ( + [form_template_mobile] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_och_table_version] +ON [dbo].[onl_cgform_head] ( + [table_version] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_head +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_head] ADD CONSTRAINT [PK__onl_cgfo__3213E83F1F74FCBC] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgform_index +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_table_id] +ON [dbo].[onl_cgform_index] ( + [cgform_head_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_oci_cgform_head_id] +ON [dbo].[onl_cgform_index] ( + [cgform_head_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgform_index +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgform_index] ADD CONSTRAINT [PK__onl_cgfo__3213E83F7872576F] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgreport_head +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_onlinereport_code] +ON [dbo].[onl_cgreport_head] ( + [code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_och_code] +ON [dbo].[onl_cgreport_head] ( + [code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgreport_head +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgreport_head] ADD CONSTRAINT [PK__onl_cgre__3213E83FD82C7EC4] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgreport_item +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_CGRHEAD_ID] +ON [dbo].[onl_cgreport_item] ( + [cgrhead_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_isshow] +ON [dbo].[onl_cgreport_item] ( + [is_show] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_order_num] +ON [dbo].[onl_cgreport_item] ( + [order_num] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_oci_cgrhead_id] +ON [dbo].[onl_cgreport_item] ( + [cgrhead_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_oci_is_show] +ON [dbo].[onl_cgreport_item] ( + [is_show] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_oci_order_num] +ON [dbo].[onl_cgreport_item] ( + [order_num] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgreport_item +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgreport_item] ADD CONSTRAINT [PK__onl_cgre__3213E83FDB9A9C1D] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table onl_cgreport_param +-- ---------------------------- +CREATE NONCLUSTERED INDEX [idx_cgrheadid] +ON [dbo].[onl_cgreport_param] ( + [cgrhead_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ocp_cgrhead_id] +ON [dbo].[onl_cgreport_param] ( + [cgrhead_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table onl_cgreport_param +-- ---------------------------- +ALTER TABLE [dbo].[onl_cgreport_param] ADD CONSTRAINT [PK__onl_cgre__3213E83F3451466A] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table oss_file +-- ---------------------------- +ALTER TABLE [dbo].[oss_file] ADD CONSTRAINT [PK__oss_file__3213E83F8493BFC5] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CALENDARS] ADD CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [CALENDAR_NAME]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [ENTRY_ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] ADD CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_LOCKS] ADD CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [LOCK_NAME]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ADD CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] ADD CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY CLUSTERED ([SCHED_NAME], [INSTANCE_NAME]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_announcement +-- ---------------------------- +ALTER TABLE [dbo].[sys_announcement] ADD CONSTRAINT [PK__sys_anno__3213E83FB38A6E7B] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_category +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_code] +ON [dbo].[sys_category] ( + [code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sc_code] +ON [dbo].[sys_category] ( + [code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_category +-- ---------------------------- +ALTER TABLE [dbo].[sys_category] ADD CONSTRAINT [PK__sys_cate__3213E83FFA6DB462] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_check_rule +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uni_sys_check_rule_code] +ON [dbo].[sys_check_rule] ( + [rule_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uk_scr_rule_code] +ON [dbo].[sys_check_rule] ( + [rule_code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_check_rule +-- ---------------------------- +ALTER TABLE [dbo].[sys_check_rule] ADD CONSTRAINT [PK__sys_chec__3213E83F36137584] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_data_log +-- ---------------------------- +CREATE NONCLUSTERED INDEX [sindex] +ON [dbo].[sys_data_log] ( + [data_table] ASC, + [data_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdl_data_table_id] +ON [dbo].[sys_data_log] ( + [data_table] ASC, + [data_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_data_log +-- ---------------------------- +ALTER TABLE [dbo].[sys_data_log] ADD CONSTRAINT [PK__sys_data__3213E83F2FE0546C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_data_source +-- ---------------------------- +CREATE NONCLUSTERED INDEX [sys_data_source_code_uni] +ON [dbo].[sys_data_source] ( + [code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uk_sdc_rule_code] +ON [dbo].[sys_data_source] ( + [code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_data_source +-- ---------------------------- +ALTER TABLE [dbo].[sys_data_source] ADD CONSTRAINT [PK__sys_data__3213E83F83EA109D] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_depart +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uniq_depart_org_code] +ON [dbo].[sys_depart] ( + [org_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_depart_parent_id] +ON [dbo].[sys_depart] ( + [parent_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_depart_depart_order] +ON [dbo].[sys_depart] ( + [depart_order] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_depart_org_code] +ON [dbo].[sys_depart] ( + [org_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sd_parent_id] +ON [dbo].[sys_depart] ( + [parent_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sd_depart_order] +ON [dbo].[sys_depart] ( + [depart_order] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sd_org_code] +ON [dbo].[sys_depart] ( + [org_code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_depart +-- ---------------------------- +ALTER TABLE [dbo].[sys_depart] ADD CONSTRAINT [PK__sys_depa__3213E83F03E49A86] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_depart_permission +-- ---------------------------- +ALTER TABLE [dbo].[sys_depart_permission] ADD CONSTRAINT [PK__sys_depa__3213E83FAE0168C1] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_depart_role +-- ---------------------------- +ALTER TABLE [dbo].[sys_depart_role] ADD CONSTRAINT [PK__sys_depa__3213E83FD3FE48EB] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_depart_role_permission +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_group_role_per_id] +ON [dbo].[sys_depart_role_permission] ( + [role_id] ASC, + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_group_role_id] +ON [dbo].[sys_depart_role_permission] ( + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_group_per_id] +ON [dbo].[sys_depart_role_permission] ( + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdrp_role_per_id] +ON [dbo].[sys_depart_role_permission] ( + [role_id] ASC, + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdrp_role_id] +ON [dbo].[sys_depart_role_permission] ( + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdrp_per_id] +ON [dbo].[sys_depart_role_permission] ( + [permission_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_depart_role_permission +-- ---------------------------- +ALTER TABLE [dbo].[sys_depart_role_permission] ADD CONSTRAINT [PK__sys_depa__3213E83F1D8B962B] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_depart_role_user +-- ---------------------------- +ALTER TABLE [dbo].[sys_depart_role_user] ADD CONSTRAINT [PK__sys_depa__3213E83FA05CDB64] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_dict +-- ---------------------------- +CREATE NONCLUSTERED INDEX [indextable_dict_code] +ON [dbo].[sys_dict] ( + [dict_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uk_sd_dict_code] +ON [dbo].[sys_dict] ( + [dict_code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_dict +-- ---------------------------- +ALTER TABLE [dbo].[sys_dict] ADD CONSTRAINT [PK__sys_dict__3213E83F515C481C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_dict_item +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_table_dict_id] +ON [dbo].[sys_dict_item] ( + [dict_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_table_sort_order] +ON [dbo].[sys_dict_item] ( + [sort_order] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_table_dict_status] +ON [dbo].[sys_dict_item] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdi_role_dict_id] +ON [dbo].[sys_dict_item] ( + [dict_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdi_role_sort_order] +ON [dbo].[sys_dict_item] ( + [sort_order] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdi_status] +ON [dbo].[sys_dict_item] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sdi_dict_val] +ON [dbo].[sys_dict_item] ( + [dict_id] ASC, + [item_value] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_dict_item +-- ---------------------------- +ALTER TABLE [dbo].[sys_dict_item] ADD CONSTRAINT [PK__sys_dict__3213E83F93F7A848] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_fill_rule +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uni_sys_fill_rule_code] +ON [dbo].[sys_fill_rule] ( + [rule_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uk_sfr_rule_code] +ON [dbo].[sys_fill_rule] ( + [rule_code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_fill_rule +-- ---------------------------- +ALTER TABLE [dbo].[sys_fill_rule] ADD CONSTRAINT [PK__sys_fill__3213E83F42339EB4] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_gateway_route +-- ---------------------------- +ALTER TABLE [dbo].[sys_gateway_route] ADD CONSTRAINT [PK__sys_gate__3213E83F1C70877C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_log +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_table_userid] +ON [dbo].[sys_log] ( + [userid] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_logt_ype] +ON [dbo].[sys_log] ( + [log_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_operate_type] +ON [dbo].[sys_log] ( + [operate_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_log_type] +ON [dbo].[sys_log] ( + [log_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sl_userid] +ON [dbo].[sys_log] ( + [userid] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sl_log_type] +ON [dbo].[sys_log] ( + [log_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sl_operate_type] +ON [dbo].[sys_log] ( + [operate_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sl_create_time] +ON [dbo].[sys_log] ( + [create_time] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_log +-- ---------------------------- +ALTER TABLE [dbo].[sys_log] ADD CONSTRAINT [PK__sys_log__3213E83F5CF1ADE3] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_permission +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_prem_pid] +ON [dbo].[sys_permission] ( + [parent_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_prem_is_route] +ON [dbo].[sys_permission] ( + [is_route] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_prem_is_leaf] +ON [dbo].[sys_permission] ( + [is_leaf] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_prem_sort_no] +ON [dbo].[sys_permission] ( + [sort_no] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_prem_del_flag] +ON [dbo].[sys_permission] ( + [del_flag] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_menu_type] +ON [dbo].[sys_permission] ( + [menu_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_menu_hidden] +ON [dbo].[sys_permission] ( + [hidden] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_menu_status] +ON [dbo].[sys_permission] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_parent_id] +ON [dbo].[sys_permission] ( + [parent_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_is_route] +ON [dbo].[sys_permission] ( + [is_route] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_is_leaf] +ON [dbo].[sys_permission] ( + [is_leaf] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_sort_no] +ON [dbo].[sys_permission] ( + [sort_no] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_del_flag] +ON [dbo].[sys_permission] ( + [del_flag] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_menu_type] +ON [dbo].[sys_permission] ( + [menu_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_hidden] +ON [dbo].[sys_permission] ( + [hidden] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sp_status] +ON [dbo].[sys_permission] ( + [status] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_permission +-- ---------------------------- +ALTER TABLE [dbo].[sys_permission] ADD CONSTRAINT [PK__sys_perm__3213E83F96711202] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_permission_data_rule +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_fucntionid] +ON [dbo].[sys_permission_data_rule] ( + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_spdr_permission_id] +ON [dbo].[sys_permission_data_rule] ( + [permission_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_permission_data_rule +-- ---------------------------- +ALTER TABLE [dbo].[sys_permission_data_rule] ADD CONSTRAINT [PK__sys_perm__3213E83F8057475D] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_quartz_job +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uniq_job_class_name] +ON [dbo].[sys_quartz_job] ( + [job_class_name] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_quartz_job +-- ---------------------------- +ALTER TABLE [dbo].[sys_quartz_job] ADD CONSTRAINT [PK__sys_quar__3213E83F7F61164A] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_role +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uniq_sys_role_role_code] +ON [dbo].[sys_role] ( + [role_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sr_role_code] +ON [dbo].[sys_role] ( + [role_code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_role +-- ---------------------------- +ALTER TABLE [dbo].[sys_role] ADD CONSTRAINT [PK__sys_role__3213E83F79AA536A] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_role_permission +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_group_role_per_id] +ON [dbo].[sys_role_permission] ( + [role_id] ASC, + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_group_role_id] +ON [dbo].[sys_role_permission] ( + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_group_per_id] +ON [dbo].[sys_role_permission] ( + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_srp_role_per_id] +ON [dbo].[sys_role_permission] ( + [role_id] ASC, + [permission_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_srp_role_id] +ON [dbo].[sys_role_permission] ( + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_srp_permission_id] +ON [dbo].[sys_role_permission] ( + [permission_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_role_permission +-- ---------------------------- +ALTER TABLE [dbo].[sys_role_permission] ADD CONSTRAINT [PK__sys_role__3213E83F4F6AB5F2] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_sms +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_type] +ON [dbo].[sys_sms] ( + [es_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_receiver] +ON [dbo].[sys_sms] ( + [es_receiver] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_sendtime] +ON [dbo].[sys_sms] ( + [es_send_time] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_status] +ON [dbo].[sys_sms] ( + [es_send_status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ss_es_type] +ON [dbo].[sys_sms] ( + [es_type] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ss_es_receiver] +ON [dbo].[sys_sms] ( + [es_receiver] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ss_es_send_time] +ON [dbo].[sys_sms] ( + [es_send_time] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_ss_es_send_status] +ON [dbo].[sys_sms] ( + [es_send_status] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_sms +-- ---------------------------- +ALTER TABLE [dbo].[sys_sms] ADD CONSTRAINT [PK__sys_sms__3213E83FA1A05F81] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_sms_template +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uniq_templatecode] +ON [dbo].[sys_sms_template] ( + [template_code] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uk_sst_template_code] +ON [dbo].[sys_sms_template] ( + [template_code] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_sms_template +-- ---------------------------- +ALTER TABLE [dbo].[sys_sms_template] ADD CONSTRAINT [PK__sys_sms___3213E83F2AF11A98] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_tenant +-- ---------------------------- +ALTER TABLE [dbo].[sys_tenant] ADD CONSTRAINT [PK__sys_tena__3213E83F81327AE6] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_third_account +-- ---------------------------- +ALTER TABLE [dbo].[sys_third_account] ADD CONSTRAINT [PK__sys_thir__3213E83F27A1B40C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_user +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_user_name] +ON [dbo].[sys_user] ( + [username] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uniq_sys_user_work_no] +ON [dbo].[sys_user] ( + [work_no] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uniq_sys_user_username] +ON [dbo].[sys_user] ( + [username] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uniq_sys_user_phone] +ON [dbo].[sys_user] ( + [phone] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uniq_sys_user_email] +ON [dbo].[sys_user] ( + [email] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_user_status] +ON [dbo].[sys_user] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_user_del_flag] +ON [dbo].[sys_user] ( + [del_flag] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_su_username] +ON [dbo].[sys_user] ( + [username] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_su_status] +ON [dbo].[sys_user] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_su_del_flag] +ON [dbo].[sys_user] ( + [del_flag] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_user +-- ---------------------------- +ALTER TABLE [dbo].[sys_user] ADD CONSTRAINT [PK__sys_user__3213E83F16F4CD9E] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_user_agent +-- ---------------------------- +CREATE NONCLUSTERED INDEX [uniq_username] +ON [dbo].[sys_user_agent] ( + [user_name] ASC +) +GO + +CREATE NONCLUSTERED INDEX [uk_sug_user_name] +ON [dbo].[sys_user_agent] ( + [user_name] ASC +) +GO + +CREATE NONCLUSTERED INDEX [statux_index] +ON [dbo].[sys_user_agent] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [begintime_index] +ON [dbo].[sys_user_agent] ( + [start_time] ASC +) +GO + +CREATE NONCLUSTERED INDEX [endtime_index] +ON [dbo].[sys_user_agent] ( + [end_time] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sug_status] +ON [dbo].[sys_user_agent] ( + [status] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sug_start_time] +ON [dbo].[sys_user_agent] ( + [start_time] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sug_end_time] +ON [dbo].[sys_user_agent] ( + [end_time] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_user_agent +-- ---------------------------- +ALTER TABLE [dbo].[sys_user_agent] ADD CONSTRAINT [PK__sys_user__3213E83F5DA02E6F] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_user_depart +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index_depart_groupk_userid] +ON [dbo].[sys_user_depart] ( + [user_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_depart_groupkorgid] +ON [dbo].[sys_user_depart] ( + [dep_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index_depart_groupk_uidanddid] +ON [dbo].[sys_user_depart] ( + [user_id] ASC, + [dep_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sud_user_id] +ON [dbo].[sys_user_depart] ( + [user_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sud_dep_id] +ON [dbo].[sys_user_depart] ( + [dep_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sud_user_dep_id] +ON [dbo].[sys_user_depart] ( + [user_id] ASC, + [dep_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_user_depart +-- ---------------------------- +ALTER TABLE [dbo].[sys_user_depart] ADD CONSTRAINT [PK__sys_user__3214EC27611D786D] PRIMARY KEY CLUSTERED ([ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table sys_user_role +-- ---------------------------- +CREATE NONCLUSTERED INDEX [index2_groupuu_user_id] +ON [dbo].[sys_user_role] ( + [user_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index2_groupuu_ole_id] +ON [dbo].[sys_user_role] ( + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [index2_groupuu_useridandroleid] +ON [dbo].[sys_user_role] ( + [user_id] ASC, + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sur_user_id] +ON [dbo].[sys_user_role] ( + [user_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sur_role_id] +ON [dbo].[sys_user_role] ( + [role_id] ASC +) +GO + +CREATE NONCLUSTERED INDEX [idx_sur_user_role_id] +ON [dbo].[sys_user_role] ( + [user_id] ASC, + [role_id] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table sys_user_role +-- ---------------------------- +ALTER TABLE [dbo].[sys_user_role] ADD CONSTRAINT [PK__sys_user__3213E83F1EFC0234] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table test_demo +-- ---------------------------- +ALTER TABLE [dbo].[test_demo] ADD CONSTRAINT [PK__test_dem__3213E83F60EEF18E] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) REFERENCES [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) ON DELETE NO ACTION ON UPDATE NO ACTION +GO + diff --git a/db/tables_nacos.sql b/db/tables_nacos.sql new file mode 100644 index 00000000..f993261b --- /dev/null +++ b/db/tables_nacos.sql @@ -0,0 +1,265 @@ +CREATE database if NOT EXISTS `nacos` default character set utf8mb4 collate utf8mb4_unicode_ci; +use `nacos`; + +/* + Navicat Premium Data Transfer + + Source Server : mysql5.7 + Source Server Type : MySQL + Source Server Version : 50727 + Source Host : 127.0.0.1:3306 + Source Schema : nacos + + Target Server Type : MySQL + Target Server Version : 50727 + File Encoding : 65001 + + Date: 03/03/2021 13:10:08 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for config_info +-- ---------------------------- +DROP TABLE IF EXISTS `config_info`; +CREATE TABLE `config_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user', + `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `c_use` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `effect` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `c_schema` text CHARACTER SET utf8 COLLATE utf8_bin NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfo_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of config_info +-- ---------------------------- +INSERT INTO `config_info` VALUES (1, 'jero-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jero-boot-mysql:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jero-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 4780\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jero专用配置\njero :\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: D://opt//upFiles\n #webapp文件路径\n webapp: D://opt//webapp\n shiro:\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeroos\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jero-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jero.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jero-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jero/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jero-gateway-router\n group: DEFAULT_GROUP\n data-type: yml\n #分布式锁配置\n redisson:\n address: jero-boot-redis:4780\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jero.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n production: false\n basic:\n enable: false\n username: jero\n password: jero1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h', '80f58d32d99203d9b12db85c469b51b1', '2021-03-03 13:01:11', '2021-03-05 17:11:54', NULL, '172.17.0.1', '', '', '', '', '', 'yaml', ''); +INSERT INTO `config_info` VALUES (2, 'jero.yaml', 'DEFAULT_GROUP', 'server:\r\n tomcat:\r\n max-swallow-size: -1\r\n error:\r\n include-exception: true\r\n include-stacktrace: ALWAYS\r\n include-message: ALWAYS\r\n compression:\r\n enabled: true\r\n min-response-size: 1024\r\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\r\nmanagement:\r\n health:\r\n mail:\r\n enabled: false\r\n endpoints:\r\n web:\r\n exposure:\r\n include: \"*\" #暴露所有节点\r\n health:\r\n sensitive: true #关闭过滤敏感信息\r\n endpoint:\r\n health:\r\n show-details: ALWAYS #显示详细信息\r\nspring:\r\n servlet:\r\n multipart:\r\n max-file-size: 10MB\r\n max-request-size: 10MB\r\n mail:\r\n host: smtp.163.com\r\n username: jeroos@163.com\r\n password: ??\r\n properties:\r\n mail:\r\n smtp:\r\n auth: true\r\n starttls:\r\n enable: true\r\n required: true\r\n ## quartz定时任务,采用数据库方式\r\n quartz:\r\n job-store-type: jdbc\r\n initialize-schema: embedded\r\n #设置自动启动,默认为 true\r\n auto-startup: true\r\n #启动时更新己存在的Job\r\n overwrite-existing-jobs: true\r\n properties:\r\n org:\r\n quartz:\r\n scheduler:\r\n instanceName: MyScheduler\r\n instanceId: AUTO\r\n jobStore:\r\n class: org.quartz.impl.jdbcjobstore.JobStoreTX\r\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\r\n tablePrefix: QRTZ_\r\n isClustered: true\r\n misfireThreshold: 60000\r\n clusterCheckinInterval: 10000\r\n threadPool:\r\n class: org.quartz.simpl.SimpleThreadPool\r\n threadCount: 10\r\n threadPriority: 5\r\n threadsInheritContextClassLoaderOfInitializingThread: true\r\n #json 时间戳统一转换\r\n jackson:\r\n date-format: yyyy-MM-dd HH:mm:ss\r\n time-zone: GMT+8\r\n aop:\r\n proxy-target-class: true\r\n activiti:\r\n check-process-definitions: false\r\n #启用作业执行器\r\n async-executor-activate: false\r\n #启用异步执行器\r\n job-executor-activate: false\r\n jpa:\r\n open-in-view: false\r\n #配置freemarker\r\n freemarker:\r\n # 设置模板后缀名\r\n suffix: .ftl\r\n # 设置文档类型\r\n content-type: text/html\r\n # 设置页面编码格式\r\n charset: UTF-8\r\n # 设置页面缓存\r\n cache: false\r\n prefer-file-system-access: false\r\n # 设置ftl文件路径\r\n template-loader-path:\r\n - classpath:/templates\r\n # 设置静态文件路径,js,css等\r\n mvc:\r\n static-path-pattern: /**\r\n resource:\r\n static-locations: classpath:/static/,classpath:/public/\r\n autoconfigure:\r\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\r\n#mybatis plus 设置\r\nmybatis-plus:\r\n mapper-locations: classpath*:com.jero.modules.**/xml/*Mapper.xml\r\n global-config:\r\n # 关闭MP3.0自带的banner\r\n banner: false\r\n db-config:\r\n #主键类型 0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\r\n id-type: ASSIGN_ID\r\n # 默认数据库表下划线命名\r\n table-underline: true\r\n configuration:\r\n # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用\r\n #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\r\n # 返回类型为Map,显示null对应的字段\r\n call-setters-on-nulls: true', 'd695ddf9b45ff9f8e009803c93650263', '2021-03-03 13:01:42', '2021-03-03 13:01:42', NULL, '172.17.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL); +INSERT INTO `config_info` VALUES (3, 'jero-gateway-router.json', 'DEFAULT_GROUP', '[{\r\n \"id\": \"jero-system\",\r\n \"order\": 0,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/sys/**\",\r\n \"_genkey_1\": \"/eoa/**\",\r\n \"_genkey_2\": \"/joa/**\",\r\n \"_genkey_3\": \"/jmreport/**\",\r\n \"_genkey_4\": \"/bigscreen/**\",\r\n \"_genkey_5\": \"/desform/**\",\r\n \"_genkey_6\": \"/online/**\",\r\n \"_genkey_8\": \"/act/**\",\r\n \"_genkey_9\": \"/plug-in/**\",\r\n \"_genkey_10\": \"/generic/**\",\r\n \"_genkey_11\": \"/v1/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb://jero-system\"\r\n}, {\r\n \"id\": \"jero-demo\",\r\n \"order\": 1,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/mock/**\",\r\n \"_genkey_1\": \"/test/**\",\r\n \"_genkey_2\": \"/bigscreen/template1/**\",\r\n \"_genkey_3\": \"/bigscreen/template2/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb://jero-demo\"\r\n}, {\r\n \"id\": \"jero-system-websocket\",\r\n \"order\": 2,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/websocket/**\",\r\n \"_genkey_1\": \"/eoaSocket/**\",\r\n \"_genkey_2\": \"/newsWebsocket/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb:ws://jero-system\"\r\n}, {\r\n \"id\": \"jero-demo-websocket\",\r\n \"order\": 3,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/vxeSocket/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb:ws://jero-demo\"\r\n}]', '82f4033ef6a51ce2ab6ce505be1b729a', '2021-03-03 13:02:14', '2021-03-03 13:02:14', NULL, '172.17.0.1', '', '', NULL, NULL, NULL, 'json', NULL); + +-- ---------------------------- +-- Table structure for config_info_aggr +-- ---------------------------- +DROP TABLE IF EXISTS `config_info_aggr`; +CREATE TABLE `config_info_aggr` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'datum_id', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '内容', + `gmt_modified` datetime(0) NOT NULL COMMENT '修改时间', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfoaggr_datagrouptenantdatum`(`data_id`, `group_id`, `tenant_id`, `datum_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '增加租户字段' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for config_info_beta +-- ---------------------------- +DROP TABLE IF EXISTS `config_info_beta`; +CREATE TABLE `config_info_beta` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user', + `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfobeta_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info_beta' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for config_info_tag +-- ---------------------------- +DROP TABLE IF EXISTS `config_info_tag`; +CREATE TABLE `config_info_tag` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user', + `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfotag_datagrouptenanttag`(`data_id`, `group_id`, `tenant_id`, `tag_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info_tag' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for config_tags_relation +-- ---------------------------- +DROP TABLE IF EXISTS `config_tags_relation`; +CREATE TABLE `config_tags_relation` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `tag_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id', + `nid` bigint(20) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`nid`) USING BTREE, + UNIQUE INDEX `uk_configtagrelation_configidtag`(`id`, `tag_name`, `tag_type`) USING BTREE, + INDEX `idx_tenant_id`(`tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_tag_relation' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for group_capacity +-- ---------------------------- +DROP TABLE IF EXISTS `group_capacity`; +CREATE TABLE `group_capacity` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额,0表示使用默认值', + `usage` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量', + `max_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量', + `gmt_create` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_group_id`(`group_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '集群、各Group容量信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for his_config_info +-- ---------------------------- +DROP TABLE IF EXISTS `his_config_info`; +CREATE TABLE `his_config_info` ( + `id` bigint(64) UNSIGNED NOT NULL, + `nid` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `gmt_create` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00', + `gmt_modified` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL, + `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `op_type` char(10) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`nid`) USING BTREE, + INDEX `idx_gmt_create`(`gmt_create`) USING BTREE, + INDEX `idx_gmt_modified`(`gmt_modified`) USING BTREE, + INDEX `idx_did`(`data_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of his_config_info +-- ---------------------------- +INSERT INTO `his_config_info` VALUES (0, 1, 'jero-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: 127.0.0.1\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 4780\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: 127.0.0.1\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jero专用配置\r\njero :\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: D://opt//upFiles\r\n #webapp文件路径\r\n webapp: D://opt//webapp\r\n shiro:\r\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeroos\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jero-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jero.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://127.0.0.1:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n address: 127.0.0.1:30007\r\n ip: 127.0.0.1\r\n port: 30007\r\n logPath: logs/jero/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jero-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: yml\r\n #分布式锁配置\r\n redisson:\r\n address: 127.0.0.1:4780\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n com.jero.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n production: false\r\n basic:\r\n enable: false\r\n username: jero\r\n password: jero1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: 1000002\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h', 'ee9e4d63cce2009104ccd100c8512c63', '2010-05-05 00:00:00', '2021-03-03 13:01:11', NULL, '172.17.0.1', 'I', ''); +INSERT INTO `his_config_info` VALUES (0, 2, 'jero.yaml', 'DEFAULT_GROUP', '', 'server:\r\n tomcat:\r\n max-swallow-size: -1\r\n error:\r\n include-exception: true\r\n include-stacktrace: ALWAYS\r\n include-message: ALWAYS\r\n compression:\r\n enabled: true\r\n min-response-size: 1024\r\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\r\nmanagement:\r\n health:\r\n mail:\r\n enabled: false\r\n endpoints:\r\n web:\r\n exposure:\r\n include: \"*\" #暴露所有节点\r\n health:\r\n sensitive: true #关闭过滤敏感信息\r\n endpoint:\r\n health:\r\n show-details: ALWAYS #显示详细信息\r\nspring:\r\n servlet:\r\n multipart:\r\n max-file-size: 10MB\r\n max-request-size: 10MB\r\n mail:\r\n host: smtp.163.com\r\n username: jeroos@163.com\r\n password: ??\r\n properties:\r\n mail:\r\n smtp:\r\n auth: true\r\n starttls:\r\n enable: true\r\n required: true\r\n ## quartz定时任务,采用数据库方式\r\n quartz:\r\n job-store-type: jdbc\r\n initialize-schema: embedded\r\n #设置自动启动,默认为 true\r\n auto-startup: true\r\n #启动时更新己存在的Job\r\n overwrite-existing-jobs: true\r\n properties:\r\n org:\r\n quartz:\r\n scheduler:\r\n instanceName: MyScheduler\r\n instanceId: AUTO\r\n jobStore:\r\n class: org.quartz.impl.jdbcjobstore.JobStoreTX\r\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\r\n tablePrefix: QRTZ_\r\n isClustered: true\r\n misfireThreshold: 60000\r\n clusterCheckinInterval: 10000\r\n threadPool:\r\n class: org.quartz.simpl.SimpleThreadPool\r\n threadCount: 10\r\n threadPriority: 5\r\n threadsInheritContextClassLoaderOfInitializingThread: true\r\n #json 时间戳统一转换\r\n jackson:\r\n date-format: yyyy-MM-dd HH:mm:ss\r\n time-zone: GMT+8\r\n aop:\r\n proxy-target-class: true\r\n activiti:\r\n check-process-definitions: false\r\n #启用作业执行器\r\n async-executor-activate: false\r\n #启用异步执行器\r\n job-executor-activate: false\r\n jpa:\r\n open-in-view: false\r\n #配置freemarker\r\n freemarker:\r\n # 设置模板后缀名\r\n suffix: .ftl\r\n # 设置文档类型\r\n content-type: text/html\r\n # 设置页面编码格式\r\n charset: UTF-8\r\n # 设置页面缓存\r\n cache: false\r\n prefer-file-system-access: false\r\n # 设置ftl文件路径\r\n template-loader-path:\r\n - classpath:/templates\r\n # 设置静态文件路径,js,css等\r\n mvc:\r\n static-path-pattern: /**\r\n resource:\r\n static-locations: classpath:/static/,classpath:/public/\r\n autoconfigure:\r\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\r\n#mybatis plus 设置\r\nmybatis-plus:\r\n mapper-locations: classpath*:com.jero.modules.**/xml/*Mapper.xml\r\n global-config:\r\n # 关闭MP3.0自带的banner\r\n banner: false\r\n db-config:\r\n #主键类型 0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\r\n id-type: ASSIGN_ID\r\n # 默认数据库表下划线命名\r\n table-underline: true\r\n configuration:\r\n # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用\r\n #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\r\n # 返回类型为Map,显示null对应的字段\r\n call-setters-on-nulls: true', 'd695ddf9b45ff9f8e009803c93650263', '2010-05-05 00:00:00', '2021-03-03 13:01:42', NULL, '172.17.0.1', 'I', ''); +INSERT INTO `his_config_info` VALUES (0, 3, 'jero-gateway-router.json', 'DEFAULT_GROUP', '', '[{\r\n \"id\": \"jero-system\",\r\n \"order\": 0,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/sys/**\",\r\n \"_genkey_1\": \"/eoa/**\",\r\n \"_genkey_2\": \"/joa/**\",\r\n \"_genkey_3\": \"/jmreport/**\",\r\n \"_genkey_4\": \"/bigscreen/**\",\r\n \"_genkey_5\": \"/desform/**\",\r\n \"_genkey_6\": \"/online/**\",\r\n \"_genkey_8\": \"/act/**\",\r\n \"_genkey_9\": \"/plug-in/**\",\r\n \"_genkey_10\": \"/generic/**\",\r\n \"_genkey_11\": \"/v1/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb://jero-system\"\r\n}, {\r\n \"id\": \"jero-demo\",\r\n \"order\": 1,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/mock/**\",\r\n \"_genkey_1\": \"/test/**\",\r\n \"_genkey_2\": \"/bigscreen/template1/**\",\r\n \"_genkey_3\": \"/bigscreen/template2/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb://jero-demo\"\r\n}, {\r\n \"id\": \"jero-system-websocket\",\r\n \"order\": 2,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/websocket/**\",\r\n \"_genkey_1\": \"/eoaSocket/**\",\r\n \"_genkey_2\": \"/newsWebsocket/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb:ws://jero-system\"\r\n}, {\r\n \"id\": \"jero-demo-websocket\",\r\n \"order\": 3,\r\n \"predicates\": [{\r\n \"name\": \"Path\",\r\n \"args\": {\r\n \"_genkey_0\": \"/vxeSocket/**\"\r\n }\r\n }],\r\n \"filters\": [],\r\n \"uri\": \"lb:ws://jero-demo\"\r\n}]', '82f4033ef6a51ce2ab6ce505be1b729a', '2010-05-05 00:00:00', '2021-03-03 13:02:14', NULL, '172.17.0.1', 'I', ''); +INSERT INTO `his_config_info` VALUES (1, 4, 'jero-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: 127.0.0.1\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 4780\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: 127.0.0.1\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jero专用配置\r\njero :\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: D://opt//upFiles\r\n #webapp文件路径\r\n webapp: D://opt//webapp\r\n shiro:\r\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeroos\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jero-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jero.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://127.0.0.1:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n address: 127.0.0.1:30007\r\n ip: 127.0.0.1\r\n port: 30007\r\n logPath: logs/jero/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jero-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: yml\r\n #分布式锁配置\r\n redisson:\r\n address: 127.0.0.1:4780\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n com.jero.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n production: false\r\n basic:\r\n enable: false\r\n username: jero\r\n password: jero1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: 1000002\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h', 'ee9e4d63cce2009104ccd100c8512c63', '2010-05-05 00:00:00', '2021-03-03 13:03:41', NULL, '172.17.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (1, 5, 'jero-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jero-boot-mysql:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jero-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 4780\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jero专用配置\njero :\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: D://opt//upFiles\n #webapp文件路径\n webapp: D://opt//webapp\n shiro:\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeroos\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jero-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jero.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jero-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n address: 127.0.0.1:30007\n ip: 127.0.0.1\n port: 30007\n logPath: logs/jero/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jero-gateway-router\n group: DEFAULT_GROUP\n data-type: yml\n #分布式锁配置\n redisson:\n address: jero-boot-redis:4780\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n com.jero.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n production: false\n basic:\n enable: false\n username: jero\n password: jero1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h', '14deb24a5927bbf4b7cc010b55cab792', '2010-05-05 00:00:00', '2021-03-03 13:07:28', NULL, '172.17.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (1, 6, 'jero-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jero-boot-mysql:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jero-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 4780\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jero专用配置\njero :\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: D://opt//upFiles\n #webapp文件路径\n webapp: D://opt//webapp\n shiro:\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeroos\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jero-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jero.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jero-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n address: jero-boot-system:30007\n ip: jero-boot-system\n port: 30007\n logPath: logs/jero/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jero-gateway-router\n group: DEFAULT_GROUP\n data-type: yml\n #分布式锁配置\n redisson:\n address: jero-boot-redis:4780\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jero.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n production: false\n basic:\n enable: false\n username: jero\n password: jero1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h', '87a50a11f0eb57d6ee4b927a63619173', '2010-05-05 00:00:00', '2021-03-05 16:14:23', NULL, '172.17.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (1, 7, 'jero-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jero-boot-mysql:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jero-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 4780\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jero专用配置\njero :\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: D://opt//upFiles\n #webapp文件路径\n webapp: D://opt//webapp\n shiro:\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeroos\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jero-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jero.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: true\n adminAddresses: http://jero-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n address: jero-boot-system:30007\n ip: jero-boot-system\n port: 30007\n logPath: logs/jero/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jero-gateway-router\n group: DEFAULT_GROUP\n data-type: yml\n #分布式锁配置\n redisson:\n address: jero-boot-redis:4780\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jero.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n production: false\n basic:\n enable: false\n username: jero\n password: jero1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h', 'b41b822c64ba94a798ebde3419ab640b', '2010-05-05 00:00:00', '2021-03-05 16:45:46', NULL, '172.17.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (1, 8, 'jero-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jero-boot-mysql:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jero-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 4780\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jero专用配置\njero :\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: D://opt//upFiles\n #webapp文件路径\n webapp: D://opt//webapp\n shiro:\n excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeroos\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jero-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jero.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: true\n adminAddresses: http://jero-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n #address: jero-boot-system:30007\n ip: jero-boot-system\n #port: 30007\n logPath: logs/jero/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jero-gateway-router\n group: DEFAULT_GROUP\n data-type: yml\n #分布式锁配置\n redisson:\n address: jero-boot-redis:4780\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jero.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n production: false\n basic:\n enable: false\n username: jero\n password: jero1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jero-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h', '5265825f119e8058400d24581d81215f', '2010-05-05 00:00:00', '2021-03-05 16:46:22', NULL, '172.17.0.1', 'U', ''); +jero +-- ---------------------------- +-- Table structure for permissions +-- ---------------------------- +DROP TABLE IF EXISTS `permissions`; +CREATE TABLE `permissions` ( + `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `resource` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `action` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + UNIQUE INDEX `uk_role_permission`(`role`, `resource`, `action`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for roles +-- ---------------------------- +DROP TABLE IF EXISTS `roles`; +CREATE TABLE `roles` ( + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + UNIQUE INDEX `uk_username_role`(`username`, `role`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of roles +-- ---------------------------- +INSERT INTO `roles` VALUES ('nacos', 'ROLE_ADMIN'); + +-- ---------------------------- +-- Table structure for tenant_capacity +-- ---------------------------- +DROP TABLE IF EXISTS `tenant_capacity`; +CREATE TABLE `tenant_capacity` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额,0表示使用默认值', + `usage` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量', + `max_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数', + `max_aggr_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量', + `gmt_create` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime(0) NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_tenant_id`(`tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '租户容量信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for tenant_info +-- ---------------------------- +DROP TABLE IF EXISTS `tenant_info`; +CREATE TABLE `tenant_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id', + `tenant_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', + `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_tenant_info_kptenantid`(`kp`, `tenant_id`) USING BTREE, + INDEX `idx_tenant_id`(`tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'tenant_info' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for users +-- ---------------------------- +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `enabled` tinyint(1) NOT NULL, + PRIMARY KEY (`username`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of users +-- ---------------------------- +INSERT INTO `users` VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/tables_xxl_job.sql b/db/tables_xxl_job.sql new file mode 100644 index 00000000..52e015c4 --- /dev/null +++ b/db/tables_xxl_job.sql @@ -0,0 +1,119 @@ +# +# XXL-JOB v2.2.0 +# Copyright (c) 2015-present, xuxueli. + +CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci; +use `xxl_job`; + +SET NAMES utf8mb4; + +CREATE TABLE `xxl_job_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job_group` int(11) NOT NULL COMMENT '执行器主键ID', + `job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON', + `job_desc` varchar(255) NOT NULL, + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `author` varchar(64) DEFAULT NULL COMMENT '作者', + `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', + `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', + `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略', + `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', + `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext COMMENT 'GLUE源代码', + `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注', + `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间', + `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔', + `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行', + `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间', + `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `job_group` int(11) NOT NULL COMMENT '执行器主键ID', + `job_id` int(11) NOT NULL COMMENT '任务,主键ID', + `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址', + `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2', + `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', + `trigger_code` int(11) NOT NULL COMMENT '调度-结果', + `trigger_msg` text COMMENT '调度-日志', + `handle_time` datetime DEFAULT NULL COMMENT '执行-时间', + `handle_code` int(11) NOT NULL COMMENT '执行-状态', + `handle_msg` text COMMENT '执行-日志', + `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败', + PRIMARY KEY (`id`), + KEY `I_trigger_time` (`trigger_time`), + KEY `I_handle_code` (`handle_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_log_report` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间', + `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量', + `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量', + `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + PRIMARY KEY (`id`), + UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_logglue` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job_id` int(11) NOT NULL COMMENT '任务,主键ID', + `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext COMMENT 'GLUE源代码', + `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注', + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_registry` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `registry_group` varchar(50) NOT NULL, + `registry_key` varchar(255) NOT NULL, + `registry_value` varchar(255) NOT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_name` varchar(64) NOT NULL COMMENT '执行器AppName', + `title` varchar(12) NOT NULL COMMENT '执行器名称', + `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', + `address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(50) NOT NULL COMMENT '账号', + `password` varchar(50) NOT NULL COMMENT '密码', + `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员', + `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', + PRIMARY KEY (`id`), + UNIQUE KEY `i_username` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_lock` ( + `lock_name` varchar(50) NOT NULL COMMENT '锁名称', + PRIMARY KEY (`lock_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL); +INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', ''); +INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL); +INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock'); + +commit; + diff --git a/db/增量SQL/2.4升级到2.4.2增量mysql.sql b/db/增量SQL/2.4升级到2.4.2增量mysql.sql new file mode 100644 index 00000000..5585807b --- /dev/null +++ b/db/增量SQL/2.4升级到2.4.2增量mysql.sql @@ -0,0 +1,28 @@ +INSERT INTO SYS_DICT_ITEM(ID, DICT_ID, ITEM_TEXT, ITEM_VALUE, DESCRIPTION, SORT_ORDER, STATUS, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME) VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', NULL, '1', '1', 'admin', '2020-12-03 18:16:02', 'admin', '2020-12-03 18:16:02'); +UPDATE SYS_DICT_ITEM SET ITEM_TEXT = 'MySQL5.5' WHERE ID = '1209733775114702850'; +UPDATE SYS_DICT_ITEM SET SORT_ORDER = '3' WHERE ID = '1209733839933476865'; +UPDATE SYS_DICT_ITEM SET SORT_ORDER = '4' WHERE ID = '1209733903020003330'; + +ALTER TABLE `sys_gateway_route` +CHANGE COLUMN `persist` `persistable` int(3) NULL DEFAULT NULL COMMENT '是否为保留数据:0-否 1-是' AFTER `strip_prefix`; + +DROP TABLE IF EXISTS `test_online_link`; +CREATE TABLE `test_online_link` ( + `id` varchar(32) NOT NULL, + `pid` varchar(32) DEFAULT NULL COMMENT 'pid', + `name` varchar(255) DEFAULT NULL COMMENT 'name', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `test_online_link` VALUES ('1', NULL, '中国'); +INSERT INTO `test_online_link` VALUES ('10', '8', '庐阳区'); +INSERT INTO `test_online_link` VALUES ('11', '7', '黄山市'); +INSERT INTO `test_online_link` VALUES ('2', '1', '山东省'); +INSERT INTO `test_online_link` VALUES ('3', '2', '济南市'); +INSERT INTO `test_online_link` VALUES ('4', '3', '历城区'); +INSERT INTO `test_online_link` VALUES ('5', '3', '长青区'); +INSERT INTO `test_online_link` VALUES ('6', '2', '青岛市'); +INSERT INTO `test_online_link` VALUES ('7', '1', '安徽省'); +INSERT INTO `test_online_link` VALUES ('8', '7', '合肥市'); +INSERT INTO `test_online_link` VALUES ('9', '8', '包河区'); + +update ONL_CGFORM_FIELD set DB_TYPE = 'Date' WHERE DB_TYPE = 'date'; \ No newline at end of file diff --git a/db/增量SQL/jimureport/jimureport.mysql5.7.create.sql b/db/增量SQL/jimureport/jimureport.mysql5.7.create.sql new file mode 100644 index 00000000..a54fec45 --- /dev/null +++ b/db/增量SQL/jimureport/jimureport.mysql5.7.create.sql @@ -0,0 +1,1641 @@ +/* + Navicat Premium Data Transfer + + Source Server : mysql5.7 + Source Server Type : MySQL + Source Server Version : 50727 + Source Host : 127.0.0.1:3306 + Source Schema : jero-boot + + Target Server Type : MySQL + Target Server Version : 50727 + File Encoding : 65001 + + Date: 13/01/2021 14:36:01 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for jimu_report +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report`; +CREATE TABLE `jimu_report` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', + `note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '说明', + `status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态', + `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型', + `json_str` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'json字符串', + `api_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求地址', + `thumb` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除', + `api_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `api_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求编码', + `template` tinyint(1) NULL DEFAULT NULL COMMENT '是否是模板 0-是,1-不是', + `view_count` bigint(15) NULL DEFAULT NULL COMMENT '浏览次数', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_jmreport_code`(`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '在线excel设计器' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report +-- ---------------------------- +INSERT INTO `jimu_report` VALUES ('1314846205892759552', '20201010163252', 'XXX有限公司员工登记表', NULL, NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":10,\"eri\":8,\"eci\":10,\"width\":146,\"height\":34},\"printElWidth\":794,\"excel_config_id\":\"1314846205892759552\",\"printElHeight\":1011,\"rows\":{\"0\":{\"cells\":{\"1\":{\"merge\":[0,8]},\"10\":{}},\"height\":22},\"1\":{\"cells\":{\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"},\"9\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"1\":{\"text\":\"所在部门\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"3\":{\"style\":13,\"text\":\" \"},\"4\":{\"style\":13,\"text\":\" \"},\"5\":{\"text\":\"职务\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"7\":{\"text\":\"填写日期\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]},\"9\":{\"style\":12,\"text\":\" \"}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"1\":{\"text\":\"姓名\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"3\":{\"text\":\"性别\",\"style\":93},\"4\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"5\":{\"text\":\"出生日期\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"7\":{\"text\":\"政治面貌\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"1\":{\"text\":\"机关\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"3\":{\"style\":93,\"text\":\"民族\"},\"4\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"5\":{\"style\":93,\"text\":\"健康状况\"},\"6\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"7\":{\"style\":93,\"text\":\"户籍类型\"},\"8\":{\"text\":\"${yuangongjiben.register}\",\"style\":26},\"9\":{\"style\":35,\"text\":\" \",\"merge\":[3,0],\"virtual\":\"1KT8bnqRT4bi8Z7b\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"1\":{\"text\":\"最高学历\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"3\":{\"text\":\"所学专业\",\"style\":93},\"4\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"text\":\"毕业时间\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"1\":{\"text\":\"电子邮箱\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"3\":{\"text\":\"手机号\",\"style\":93},\"4\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"text\":\"家庭电话\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"style\":37,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"4\":{\"style\":134,\"text\":\" \"},\"5\":{\"style\":134,\"text\":\" \"},\"6\":{\"style\":93,\"text\":\"入职时间\"},\"7\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]},\"8\":{\"style\":13,\"text\":\" \"}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"style\":37,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"4\":{\"style\":13,\"text\":\" \"},\"5\":{\"style\":13,\"text\":\" \"},\"6\":{\"style\":93,\"text\":\"身份证号\"},\"7\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"style\":95,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"4\":{\"style\":13,\"text\":\" \"},\"5\":{\"style\":13,\"text\":\" \"},\"6\":{\"text\":\"婚姻状况\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"8\":{\"text\":\"有无子女\",\"style\":93},\"9\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"style\":37,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"4\":{\"style\":13,\"text\":\" \"},\"5\":{\"style\":13,\"text\":\" \"},\"6\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"style\":37,\"text\":\" \"},\"8\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]},\"9\":{\"text\":\" \",\"style\":7}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"1\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"3\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"}},\"isDrag\":true},\"12\":{\"cells\":{\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"}}},\"13\":{\"cells\":{\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"12\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"style\":39,\"text\":\" \"},\"8\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]},\"9\":{\"text\":\" \",\"style\":7}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\"有无公积金\",\"style\":98},\"6\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\"兴趣爱好\",\"style\":98},\"9\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]},\"4\":{\"style\":117,\"text\":\" \"},\"5\":{\"style\":117,\"text\":\" \"},\"6\":{\"style\":117,\"text\":\" \"},\"7\":{\"style\":117,\"text\":\" \"},\"8\":{\"style\":117,\"text\":\" \"},\"9\":{\"style\":117,\"text\":\" \"}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]},\"4\":{\"style\":117,\"text\":\" \"},\"5\":{\"style\":117,\"text\":\" \"},\"6\":{\"style\":117,\"text\":\" \"},\"7\":{\"style\":117,\"text\":\" \"},\"8\":{\"style\":117,\"text\":\" \"},\"9\":{\"style\":117,\"text\":\" \"}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"1\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"2\":{\"style\":99,\"text\":\" \"},\"3\":{\"style\":99,\"text\":\" \"},\"4\":{\"style\":99,\"text\":\" \"},\"5\":{\"style\":99,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"1\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"style\":37,\"text\":\" \"},\"3\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"style\":39,\"text\":\" \"},\"7\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"style\":39,\"text\":\" \"},\"9\":{\"text\":\"担任职务\",\"style\":38},\"10\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"1\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":6},\"3\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"5\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"7\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"9\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"10\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"1\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"2\":{\"style\":124,\"text\":\" \"},\"3\":{\"style\":124,\"text\":\" \"},\"4\":{\"style\":124,\"text\":\" \"},\"5\":{\"style\":124,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"1\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"style\":37,\"text\":\" \"},\"3\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"7\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"style\":39,\"text\":\" \"},\"9\":{\"text\":\"联系方式\",\"style\":38},\"10\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"1\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\" \",\"style\":6},\"3\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"5\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"9\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"10\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"1\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"2\":{\"style\":125,\"text\":\" \"},\"3\":{\"style\":125,\"text\":\" \"},\"4\":{\"style\":125,\"text\":\" \"},\"5\":{\"style\":125,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"1\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"style\":37,\"text\":\" \"},\"3\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"9\":{\"text\":\"备注\",\"style\":38},\"10\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"1\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\" \",\"style\":6},\"3\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"5\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"9\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"10\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":125,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":7,\"text\":\" \"},\"10\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"text\":\"年龄\",\"style\":38},\"6\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"政治面貌\",\"style\":38},\"9\":{\"text\":\"联系方式\",\"style\":38},\"10\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"1\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"style\":6,\"text\":\" \"},\"3\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"style\":6,\"text\":\" \"},\"5\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"6\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"9\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"10\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"text\":\" \",\"style\":7},\"10\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"1\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"2\":{\"text\":\" \",\"style\":125},\"3\":{\"text\":\" \",\"style\":125},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"text\":\" \",\"style\":7},\"10\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"1\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"4\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"7\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"10\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"1\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"4\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"7\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"10\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":885,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":59},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":70},\"9\":{\"width\":102},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":27},\"merges\":[\"I3:J3\",\"C3:E3\",\"B2:J2\",\"E6:G6\",\"E7:G7\",\"B8:C8\",\"H8:I8\",\"B9:C9\",\"B10:C10\",\"D10:F10\",\"D8:F8\",\"D9:F9\",\"B11:C11\",\"D11:F11\",\"G11:H11\",\"I11:J11\",\"D12:J14\",\"B15:C15\",\"D15:F15\",\"G15:H15\",\"I15:J15\",\"B16:C16\",\"B17:C17\",\"B18:C18\",\"D17:J17\",\"D18:J18\",\"B20:F20\",\"B21:C21\",\"D21:E21\",\"F21:G21\",\"H21:I21\",\"B22:C22\",\"B24:F24\",\"B25:C25\",\"D25:E25\",\"H25:I25\",\"B26:C26\",\"B28:F28\",\"B29:C29\",\"D29:E29\",\"B30:C30\",\"B32:C32\",\"B33:C33\",\"D33:E33\",\"B34:C34\",\"D34:E34\",\"B36:D36\",\"D16:E16\",\"G16:H16\",\"LAAAAAABJ1:A38\",\"B1:J1\",\"I4:J4\",\"H9:J9\",\"H22:I22\",\"F22:G22\",\"D22:E22\",\"D26:E26\",\"H26:I26\",\"D30:E30\",\"H30:I30\",\"F30:G30\",\"E37:G37\",\"E38:G38\",\"B38:D38\",\"B37:D37\",\"H37:J37\",\"H38:J38\",\"F29:G29\",\"H29:I29\",\"F25:G25\",\"F26:G26\",\"G33:H33\",\"G34:H34\",\"B12:C14\",\"J5:J8\"],\"imgList\":[{\"row\":4,\"col\":9,\"width\":\"101\",\"height\":\"126\",\"src\":\"excel_online/QQ截图20210113140514_1610517928204.png\",\"layer_id\":\"1KT8bnqRT4bi8Z7b\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,9]]}]}', NULL, 'https://static.jero.com/designreport/images/1122_1607312336469.png', 'admin', '2020-10-10 16:32:53', 'admin', '2021-01-13 14:12:38', 0, NULL, NULL, 1, 579); +INSERT INTO `jimu_report` VALUES ('1316944968992034816', '20201016113231', '员工信息登记', NULL, NULL, 'printinfo', '{\"area\":false,\"printElWidth\":787,\"excel_config_id\":\"1316944968992034816\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\"员工信息登记表\",\"merge\":[0,6],\"style\":28},\"1\":{\"style\":21,\"text\":\" \"},\"2\":{\"style\":21,\"text\":\" \"},\"3\":{\"style\":21,\"text\":\" \"},\"4\":{\"style\":21,\"text\":\" \"},\"5\":{\"style\":21,\"text\":\" \"},\"6\":{\"style\":21,\"text\":\" \"}},\"height\":46},\"2\":{\"cells\":{\"0\":{\"text\":\"编号:\",\"style\":29},\"1\":{\"text\":\"${employee.num}\",\"style\":30,\"merge\":[0,3]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\"填写日期:\",\"style\":29},\"6\":{\"text\":\"${employee.create_time}\",\"style\":36}},\"isDrag\":true,\"height\":44},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名:\",\"style\":29},\"1\":{\"text\":\"${employee.name}\",\"style\":30},\"2\":{\"text\":\"性别:\",\"style\":29},\"3\":{\"text\":\"${employee.sex}\",\"style\":30},\"4\":{\"text\":\"出生年月:\",\"style\":29},\"5\":{\"text\":\"${employee.birthday}\",\"style\":36},\"6\":{\"style\":3,\"text\":\" \",\"merge\":[4,0],\"virtual\":\"Ym8ny6lYTdutY5tT\"}},\"isDrag\":true,\"height\":42},\"4\":{\"cells\":{\"0\":{\"text\":\"民族:\",\"style\":29},\"1\":{\"text\":\"${employee.nation}\",\"style\":30},\"2\":{\"text\":\"政治面貌:\",\"style\":29},\"3\":{\"text\":\"${employee.political}\",\"style\":30},\"4\":{\"text\":\"籍贯:\",\"style\":29},\"5\":{\"text\":\"${employee.native_place}\",\"style\":30}},\"isDrag\":true,\"height\":38},\"5\":{\"cells\":{\"0\":{\"text\":\"身高(cm):\",\"style\":29},\"1\":{\"text\":\"${employee.height}\",\"style\":30},\"2\":{\"text\":\"体重(kg):\",\"style\":29},\"3\":{\"text\":\"${employee.weight}\",\"style\":30},\"4\":{\"text\":\"健康状况:\",\"style\":29},\"5\":{\"text\":\"${employee.health}\",\"style\":30}},\"isDrag\":true,\"height\":38},\"6\":{\"cells\":{\"0\":{\"text\":\"身份证号:\",\"style\":29},\"1\":{\"text\":\"${employee.id_card}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"学历:\",\"style\":29},\"5\":{\"text\":\"${employee.education}\",\"style\":30}},\"isDrag\":true,\"height\":40},\"7\":{\"cells\":{\"0\":{\"text\":\"毕业学校:\",\"style\":29},\"1\":{\"text\":\"${employee.school}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"专业:\",\"style\":29},\"5\":{\"text\":\"${employee.major}\",\"style\":30}},\"isDrag\":true,\"height\":44},\"8\":{\"cells\":{\"0\":{\"text\":\"联系地址:\",\"style\":29},\"1\":{\"text\":\"${employee.address}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"邮编:\",\"style\":29},\"5\":{\"text\":\"${employee.zip_code}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":45},\"9\":{\"cells\":{\"0\":{\"text\":\"Email:\",\"style\":29},\"1\":{\"text\":\"${employee.email}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"手机号:\",\"style\":29},\"5\":{\"text\":\"${employee.phone}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":40},\"10\":{\"cells\":{\"0\":{\"text\":\"外语语种:\",\"style\":29},\"1\":{\"text\":\"${employee.foreign_language}\",\"style\":30},\"2\":{\"text\":\"外语水平:\",\"style\":29},\"3\":{\"text\":\"${employee.foreign_language_level}\",\"style\":30},\"4\":{\"text\":\"计算机水平:\",\"style\":29},\"5\":{\"text\":\"${employee.computer_level}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":41},\"11\":{\"cells\":{\"0\":{\"text\":\"毕业时间:\",\"style\":29},\"1\":{\"text\":\"${employee.graduation_time}\",\"style\":34},\"2\":{\"text\":\"到职时间:\",\"style\":29},\"3\":{\"text\":\"${employee.arrival_time}\",\"style\":34},\"4\":{\"text\":\"职称:\",\"style\":29},\"5\":{\"text\":\"${employee.positional_titles}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":42},\"12\":{\"cells\":{\"0\":{\"text\":\"教育经历:\",\"style\":32},\"1\":{\"text\":\"\",\"style\":35,\"merge\":[0,5]},\"2\":{\"text\":\" \",\"style\":40},\"3\":{\"text\":\" \",\"style\":40},\"4\":{\"text\":\" \",\"style\":40},\"5\":{\"text\":\" \",\"style\":40},\"6\":{\"text\":\" \",\"style\":40}},\"isDrag\":true,\"height\":39},\"13\":{\"cells\":{\"0\":{\"text\":\"${employee.education_experience}\",\"style\":33,\"merge\":[0,6]},\"1\":{\"style\":27,\"text\":\" \"},\"2\":{\"style\":27,\"text\":\" \"},\"3\":{\"style\":27,\"text\":\" \"},\"4\":{\"style\":27,\"text\":\" \"},\"5\":{\"style\":27,\"text\":\" \"},\"6\":{\"style\":27,\"text\":\" \"}},\"isDrag\":true,\"height\":70},\"14\":{\"cells\":{\"0\":{\"text\":\"工作经历:\",\"style\":32},\"1\":{\"merge\":[0,5],\"style\":30,\"text\":\" \"},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\" \",\"style\":24},\"6\":{\"text\":\" \",\"style\":24}},\"height\":43},\"15\":{\"cells\":{\"0\":{\"text\":\"${employee.work_experience}\",\"style\":30,\"merge\":[0,6]},\"1\":{\"text\":\" \",\"style\":24},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\" \",\"style\":24},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":61},\"17\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":37}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[\"sex1\"],\"freeze\":\"A1\",\"dataRectWidth\":787,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date\"},{\"format\":\"date2\"},{\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"time\"},{\"font\":{\"name\":\"宋体\"},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":76},\"1\":{\"width\":132},\"2\":{\"width\":86},\"3\":{\"width\":134},\"5\":{\"width\":123},\"6\":{\"width\":136},\"len\":26},\"merges\":[\"A2:G2\",\"B3:E3\",\"B7:D7\",\"B8:D8\",\"B9:D9\",\"B10:D10\",\"F9:G9\",\"F10:G10\",\"F11:G11\",\"F12:G12\",\"B13:G13\",\"A14:G14\",\"B15:G15\",\"A16:G16\",\"G4:G8\"],\"imgList\":[{\"row\":3,\"col\":6,\"width\":\"135\",\"height\":\"192\",\"src\":\"https://static.jero.com/designreport/images/QQ截图20210108095848_1610071294294.png\",\"layer_id\":\"Ym8ny6lYTdutY5tT\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[3,6]]}]}', NULL, 'https://static.jero.com/designreport/images/1133_1607312428261.png', 'admin', '2020-10-16 11:32:32', 'admin', '2021-01-13 14:34:09', 0, NULL, NULL, 1, 1394); +INSERT INTO `jimu_report` VALUES ('1331429368098066432', '20201125104813', '制作业产能监控大屏', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":2,\"col\":5,\"width\":\"908\",\"height\":\"218\",\"config\":\"{\\\"yAxis\\\":[{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"},{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1\\\",\\\"2\\\",\\\"3\\\",\\\"4\\\",\\\"5\\\",\\\"6\\\",\\\"7\\\",\\\"8\\\",\\\"9\\\",\\\"10\\\",\\\"11\\\",\\\"12\\\",\\\"13\\\",\\\"14\\\",\\\"15\\\",\\\"16\\\",\\\"17\\\",\\\"18\\\",\\\"19\\\",\\\"20\\\",\\\"21\\\",\\\"22\\\",\\\"23\\\",\\\"24\\\",\\\"25\\\",\\\"26\\\",\\\"27\\\",\\\"28\\\",\\\"29\\\",\\\"30\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"计划生产\\\",\\\"实际完成量\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"grid\\\":{\\\"top\\\":56,\\\"left\\\":34,\\\"bottom\\\":37,\\\"right\\\":53},\\\"series\\\":[{\\\"barWidth\\\":8,\\\"itemStyle\\\":{\\\"color\\\":\\\"#70BDD1\\\"},\\\"barMinHeight\\\":2,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"labelPositionArray\\\":[{\\\"value\\\":\\\"top\\\",\\\"text\\\":\\\"上方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"left\\\",\\\"text\\\":\\\"左边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"right\\\",\\\"text\\\":\\\"右边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"bottom\\\",\\\"text\\\":\\\"下方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"inside\\\",\\\"text\\\":\\\"内部\\\",\\\"type\\\":\\\"bar\\\"}]},\\\"type\\\":\\\"bar\\\",\\\"name\\\":\\\"计划生产\\\",\\\"data\\\":[100,130,140,108,200,130,160,180,200,300,110,120,130,140,150,100,100,100,100,100,200,300,110,120,130,140,105,120,150,100],\\\"typeData\\\":[{\\\"name\\\":\\\"实际完成量\\\",\\\"type\\\":\\\"line\\\"}]},{\\\"itemStyle\\\":{\\\"color\\\":\\\"#D69071\\\"},\\\"symbolSize\\\":8,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"labelPositionArray\\\":[{\\\"value\\\":\\\"top\\\",\\\"text\\\":\\\"上方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"left\\\",\\\"text\\\":\\\"左边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"right\\\",\\\"text\\\":\\\"右边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"bottom\\\",\\\"text\\\":\\\"下方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"inside\\\",\\\"text\\\":\\\"内部\\\",\\\"type\\\":\\\"bar\\\"}]},\\\"type\\\":\\\"line\\\",\\\"yAxisIndex\\\":1,\\\"name\\\":\\\"实际完成量\\\",\\\"data\\\":[100,130,140,108,200,130,160,180,200,300,110,120,130,140,150,100,100,100,100,100,200,300,110,120,130,140,105,120,150,100],\\\"typeData\\\":[{\\\"name\\\":\\\"实际完成量\\\",\\\"type\\\":\\\"line\\\"}]}],\\\"chartType\\\":\\\"linebar\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"crossStyle\\\":{\\\"color\\\":\\\"#999\\\"},\\\"type\\\":\\\"cross\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"text\\\":\\\"日生产效率监控\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":\\\"#104C7E\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331474698436915202\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"rishengchan\",\"chartType\":\"mixed.linebar\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"Or4klM9AZS51JMuK\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[2,11],[2,12],[2,13]]},{\"row\":2,\"col\":1,\"width\":\"459\",\"height\":\"217\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"ARD\\\",\\\"RLD\\\",\\\"LCL\\\",\\\"ULC\\\",\\\"SQPS\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"计划值\\\",\\\"完成值\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":42,\\\"bottom\\\":42,\\\"right\\\":42},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[1000,1300,1400,1080,1000],\\\"name\\\":\\\"计划值\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#216055\\\",\\\"barBorderRadius\\\":13},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]},{\\\"barWidth\\\":9,\\\"data\\\":[1300,1600,1800,1500,1200],\\\"name\\\":\\\"完成值\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#287E75\\\",\\\"barBorderRadius\\\":13},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"text\\\":\\\"指标计划值和完成值\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":\\\"#104C7E\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331447376279285762\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"jihua\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"VbAARZSMlEAikJif\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[2,1],[2,2],[2,3],[2,4]]},{\"row\":11,\"col\":1,\"width\":\"298\",\"height\":\"148\",\"config\":\"{\\\"series\\\":[{\\\"axisLabel\\\":{\\\"color\\\":\\\"auto\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"fontSize\\\":10}},\\\"pointer\\\":{\\\"show\\\":true},\\\"data\\\":[{\\\"name\\\":\\\"完成率\\\",\\\"value\\\":80}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":10,\\\"color\\\":[[0.2,\\\"rgba(183,243,214,1)\\\"],[0.8,\\\"rgba(232,240,61,1)\\\"],[1,\\\"rgba(64,150,241,1)\\\"]]}},\\\"name\\\":\\\"业务指标\\\",\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"length\\\":4},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"width\\\":3},\\\"length\\\":8},\\\"itemStyle\\\":{\\\"color\\\":\\\"#D0D2D3\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}%\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"auto\\\",\\\"fontSize\\\":\\\"14\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"79%\\\",\\\"title\\\":{\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"shadowBlur\\\":10,\\\"fontSize\\\":\\\"10\\\",\\\"shadowColor\\\":\\\"#000\\\"}},\\\"axisLine_lineStyle_color\\\":[[0.2,\\\"rgba(183,243,214,1)\\\"],[0.8,\\\"rgba(232,240,61,1)\\\"],[1,\\\"rgba(64,150,241,1)\\\"]]}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"上海\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331491194517106690\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bing1\",\"chartType\":\"gauge.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"lNI3TJORqfhUpaK2\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[11,1],[11,2],[11,3]]},{\"row\":11,\"col\":4,\"width\":\"362\",\"height\":\"149\",\"config\":\"{\\\"series\\\":[{\\\"pointer\\\":{\\\"show\\\":true},\\\"startAngle\\\":190,\\\"data\\\":[{\\\"name\\\":\\\"完成率\\\",\\\"value\\\":60}],\\\"endAngle\\\":-10,\\\"itemStyle\\\":{\\\"color\\\":\\\"#D0D2D3\\\"},\\\"type\\\":\\\"gauge\\\",\\\"title\\\":{\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#000\\\",\\\"shadowBlur\\\":10,\\\"fontSize\\\":20,\\\"shadowColor\\\":\\\"#000\\\"}},\\\"axisLabel\\\":{\\\"color\\\":\\\"auto\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"fontSize\\\":10}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":10,\\\"color\\\":[[0.2,\\\"rgba(128,211,243,1)\\\"],[0.8,\\\"rgba(64,246,66,1)\\\"],[1,\\\"rgba(237,56,247,1)\\\"]]}},\\\"name\\\":\\\"业务指标\\\",\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"length\\\":4},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"width\\\":3},\\\"length\\\":8},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}%\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"auto\\\",\\\"fontSize\\\":\\\"14\\\"}},\\\"axisLine_lineStyle_color\\\":[[0.2,\\\"rgba(128,211,243,1)\\\"],[0.8,\\\"rgba(64,246,66,1)\\\"],[1,\\\"rgba(237,56,247,1)\\\"]],\\\"radius\\\":\\\"79%\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"北京\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331493951013695490\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bing2\",\"chartType\":\"gauge.simple180\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"M3GodY7v2JCBfnGC\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[11,4],[11,5],[11,6],[11,7]]},{\"row\":11,\"col\":7,\"width\":\"402\",\"height\":\"148\",\"config\":\"{\\\"series\\\":[{\\\"pointer\\\":{\\\"show\\\":true},\\\"startAngle\\\":190,\\\"data\\\":[{\\\"name\\\":\\\"成绩\\\",\\\"value\\\":60}],\\\"endAngle\\\":-10,\\\"itemStyle\\\":{\\\"color\\\":\\\"#D0D2D3\\\"},\\\"type\\\":\\\"gauge\\\",\\\"title\\\":{\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#000\\\",\\\"shadowBlur\\\":10,\\\"fontSize\\\":20,\\\"shadowColor\\\":\\\"#000\\\"}},\\\"axisLabel\\\":{\\\"color\\\":\\\"auto\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"fontSize\\\":10}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":10,\\\"color\\\":[[0.2,\\\"rgba(45,140,240,1)\\\"],[0.8,\\\"rgba(237,203,102,1)\\\"],[1,\\\"#C23531\\\"]]}},\\\"name\\\":\\\"业务指标\\\",\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"length\\\":4},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"width\\\":3},\\\"length\\\":8},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}%\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"auto\\\",\\\"fontSize\\\":\\\"14\\\"}},\\\"axisLine_lineStyle_color\\\":[[0.2,\\\"#91c7ae\\\"],[0.8,\\\"#63869E\\\"],[1,\\\"#C23531\\\"]],\\\"radius\\\":\\\"79%\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"深圳\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"chartType\":\"gauge.simple180\"},\"layer_id\":\"xyRbp6UANWOKoRvq\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[11,7],[11,8],[11,9],[11,10],[11,11]]},{\"row\":11,\"col\":11,\"width\":\"298\",\"height\":\"153\",\"config\":\"{\\\"series\\\":[{\\\"axisLabel\\\":{\\\"color\\\":\\\"auto\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"fontSize\\\":10}},\\\"pointer\\\":{\\\"show\\\":true},\\\"data\\\":[{\\\"name\\\":\\\"完成率\\\",\\\"value\\\":50}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":10,\\\"color\\\":[[0.2,\\\"#91c7ae\\\"],[0.8,\\\"#63869E\\\"],[1,\\\"#C23531\\\"]]}},\\\"name\\\":\\\"业务指标\\\",\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"length\\\":4},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"width\\\":3},\\\"length\\\":8},\\\"itemStyle\\\":{\\\"color\\\":\\\"#D0D2D3\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}%\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"auto\\\",\\\"fontSize\\\":\\\"14\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"78%\\\",\\\"title\\\":{\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"shadowBlur\\\":10,\\\"fontSize\\\":20,\\\"shadowColor\\\":\\\"#000\\\"}},\\\"axisLine_lineStyle_color\\\":[[0.2,\\\"#91c7ae\\\"],[0.8,\\\"#63869E\\\"],[1,\\\"#C23531\\\"]]}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"上海\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"chartType\":\"gauge.simple\"},\"layer_id\":\"19iwE10hJoRRKvbh\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[11,11],[11,12]]},{\"row\":17,\"col\":10,\"width\":\"401\",\"height\":\"223\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"制冷剂\\\",\\\"冷凝机\\\",\\\"电机\\\",\\\"压缩机\\\",\\\"分离机\\\",\\\"电动机\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":45,\\\"left\\\":34,\\\"bottom\\\":44,\\\"right\\\":26},\\\"series\\\":[{\\\"barWidth\\\":14,\\\"data\\\":[14,10,8,2,0,0],\\\"showBackground\\\":true,\\\"name\\\":\\\"销量\\\",\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#C6C4C4\\\"},\\\"itemStyle\\\":{\\\"barBorderRadius\\\":6,\\\"color\\\":\\\"#EDCB66\\\"},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"各机型已开工天数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":\\\"rgba(16,76,126,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331486475245629441\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"kaigong\",\"chartType\":\"bar.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"ZT3srpW2drL8WBl1\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[17,10],[17,11],[17,12],[17,13]]},{\"row\":17,\"col\":1,\"width\":\"957\",\"height\":\"226\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1\\\",\\\"2\\\",\\\"3\\\",\\\"4\\\",\\\"5\\\",\\\"6\\\",\\\"7\\\",\\\"8\\\",\\\"9\\\",\\\"10\\\",\\\"11\\\",\\\"12\\\",\\\"13\\\",\\\"14\\\",\\\"15\\\",\\\"16\\\",\\\"17\\\",\\\"18\\\",\\\"19\\\",\\\"20\\\",\\\"21\\\",\\\"22\\\",\\\"23\\\",\\\"24\\\",\\\"25\\\",\\\"26\\\",\\\"27\\\",\\\"28\\\",\\\"29\\\",\\\"30\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":35,\\\"bottom\\\":43,\\\"right\\\":35},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#4D9F78\\\",\\\"opacity\\\":0.2},\\\"data\\\":[100,75,40,58,40,30,60,80,20,30,10,50,80,40,50,100,100,100,100,80,90,30,10,50,70,80,95,80,80,90],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#3B816C\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"日生产计划完成率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(16,76,126,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331483873661464578\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"wanchenglv\",\"chartType\":\"line.area\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"0Nsiok8oY1DR0gRU\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[17,1],[17,2],[17,3],[17,4],[17,5],[17,6],[17,7],[17,8],[17,9]]}],\"area\":{\"sri\":21,\"sci\":4,\"eri\":21,\"eci\":4,\"width\":161,\"height\":25},\"printElWidth\":1800,\"excel_config_id\":\"1331429368098066432\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\"制作业产能监控大屏\",\"merge\":[0,11],\"style\":44},\"2\":{\"style\":44,\"text\":\" \"},\"3\":{\"style\":44,\"text\":\" \"},\"4\":{\"style\":44,\"text\":\" \"},\"5\":{\"style\":44,\"text\":\" \"},\"6\":{\"style\":44,\"text\":\" \"},\"7\":{\"style\":44,\"text\":\" \"},\"8\":{\"style\":44,\"text\":\" \"},\"9\":{\"style\":44,\"text\":\" \"},\"10\":{\"style\":44,\"text\":\" \"},\"11\":{\"style\":44,\"text\":\" \"},\"12\":{\"style\":44,\"text\":\" \"}},\"height\":60},\"1\":{\"cells\":{\"0\":{\"text\":\" \"},\"6\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"},\"7\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"},\"8\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"},\"9\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"},\"10\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"},\"11\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"},\"12\":{\"style\":32,\"virtual\":\"Or4klM9AZS51JMuK\",\"text\":\" \"}},\"height\":43},\"2\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \",\"virtual\":\"VbAARZSMlEAikJif\"},\"2\":{\"text\":\" \",\"virtual\":\"VbAARZSMlEAikJif\"},\"3\":{\"text\":\" \",\"virtual\":\"VbAARZSMlEAikJif\"},\"4\":{\"text\":\" \",\"virtual\":\"VbAARZSMlEAikJif\"},\"5\":{\"style\":17,\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"6\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"7\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"8\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"9\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"10\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"11\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"12\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"},\"13\":{\"text\":\" \",\"virtual\":\"Or4klM9AZS51JMuK\"}},\"height\":24},\"3\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"5\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"6\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"12\":{\"text\":\" \"}},\"height\":25},\"7\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}},\"height\":23},\"8\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}},\"height\":20},\"9\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"10\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"11\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \",\"virtual\":\"lNI3TJORqfhUpaK2\"},\"2\":{\"text\":\" \",\"virtual\":\"lNI3TJORqfhUpaK2\"},\"3\":{\"text\":\" \",\"virtual\":\"lNI3TJORqfhUpaK2\"},\"4\":{\"text\":\" \",\"virtual\":\"M3GodY7v2JCBfnGC\"},\"5\":{\"text\":\" \",\"virtual\":\"M3GodY7v2JCBfnGC\"},\"6\":{\"text\":\" \",\"virtual\":\"M3GodY7v2JCBfnGC\"},\"7\":{\"text\":\" \",\"virtual\":\"xyRbp6UANWOKoRvq\"},\"8\":{\"text\":\" \",\"virtual\":\"xyRbp6UANWOKoRvq\"},\"9\":{\"text\":\" \",\"virtual\":\"xyRbp6UANWOKoRvq\"},\"10\":{\"text\":\" \",\"virtual\":\"xyRbp6UANWOKoRvq\"},\"11\":{\"text\":\" \",\"virtual\":\"19iwE10hJoRRKvbh\"},\"12\":{\"text\":\" \",\"virtual\":\"19iwE10hJoRRKvbh\"}},\"height\":20},\"12\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}},\"height\":25},\"13\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}},\"height\":31},\"14\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"15\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"16\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"17\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"2\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"3\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"4\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"5\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"6\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"7\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"8\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"9\":{\"text\":\" \",\"virtual\":\"0Nsiok8oY1DR0gRU\"},\"10\":{\"text\":\" \",\"virtual\":\"ZT3srpW2drL8WBl1\"},\"11\":{\"text\":\" \",\"virtual\":\"ZT3srpW2drL8WBl1\"},\"12\":{\"text\":\" \",\"virtual\":\"ZT3srpW2drL8WBl1\"},\"13\":{\"text\":\" \",\"virtual\":\"ZT3srpW2drL8WBl1\"}},\"height\":37},\"18\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"style\":34,\"text\":\"\",\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"2\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"3\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"4\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"5\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"6\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"7\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"8\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"9\":{\"text\":\" \",\"style\":34,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"10\":{\"style\":32,\"text\":\"\",\"virtual\":\"870QQK6Jl1k12wty\"},\"11\":{\"text\":\" \",\"style\":32,\"virtual\":\"870QQK6Jl1k12wty\"},\"12\":{\"text\":\" \",\"style\":32,\"virtual\":\"870QQK6Jl1k12wty\"}},\"height\":33},\"19\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \",\"style\":17,\"virtual\":\"qBhmWa1xF5KaKC1K\"},\"10\":{\"text\":\" \",\"style\":17,\"virtual\":\"870QQK6Jl1k12wty\"}}},\"20\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"22\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"24\":{\"cells\":{\"0\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"26\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"28\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1542,\"background\":{\"path\":\"https://static.jero.com/designreport/images/bg_1606963700202.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"name\":\"黑体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"name\":\"宋体\",\"bold\":true}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"name\":\"宋体\",\"bold\":false}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"left\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"name\":\"宋体\",\"size\":10.5}},{\"font\":{\"name\":\"宋体\",\"size\":10.5}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\",\"bgcolor\":\"104c7e\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"color\":\"#ffffff\",\"bgcolor\":\"104c7e\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\",\"bgcolor\":\"#104c7e\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"color\":\"#ffffff\",\"bgcolor\":\"#104c7e\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\",\"bgcolor\":\"\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10.5,\"bold\":true},\"color\":\"#ffffff\",\"bgcolor\":\"\"},{\"align\":\"center\",\"font\":{\"size\":16,\"name\":\"宋体\",\"bold\":true},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":16,\"name\":\"宋体\",\"bold\":true},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":80},\"4\":{\"width\":161},\"12\":{\"width\":201},\"len\":27},\"merges\":[\"B1:M1\",\"F2:M2\",\"B12:D17\",\"E12:G17\",\"H12:K17\",\"L12:M17\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201125133720_1606306665506.png', 'admin', '2020-11-25 10:48:14', 'admin', '2021-01-13 14:14:14', 0, NULL, NULL, 1, 1753); +INSERT INTO `jimu_report` VALUES ('1331503965770223616', '20201125155042', '房屋销售综合展示大屏', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"338\",\"height\":\"378\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"缤纷南郡\\\",\\\"中航华府\\\",\\\"3中家属楼\\\",\\\"幸福家园\\\",\\\"水晶国际\\\",\\\"绿城小区\\\",\\\"缤纷南郡二期\\\",\\\"国奥家园\\\",\\\"西西胡同\\\",\\\"融创学府\\\",\\\"蓝湾国际\\\",\\\"广发小区\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":71,\\\"bottom\\\":39,\\\"right\\\":29},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[2,2,2,3,4,3,3,5,2,7,4,8],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#67994B\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"各楼盘成交量排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg2_1606963303501.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331511745851731969\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengjiao\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"5ggWQtDUvSopC4iL\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3]]},{\"row\":1,\"col\":12,\"width\":\"327\",\"height\":\"152\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":34,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"高层\\\",\\\"小高层\\\",\\\"写字楼\\\",\\\"厂房\\\",\\\"公寓\\\",\\\"别墅\\\",\\\"厂房\\\",\\\"四合院\\\",\\\"loft\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":30,\\\"bottom\\\":44,\\\"right\\\":24},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[20,25,10,5,9,1,5,1,20],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#D04672\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"房形分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1607938818911.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331922734933987329\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"fangyuan\",\"chartType\":\"line.smooth\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"nk6I2RCefm9scS1k\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,12],[1,13],[1,14],[1,15]]},{\"row\":7,\"col\":12,\"width\":\"324\",\"height\":\"215\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"1室\\\",\\\"2室\\\",\\\"3室\\\",\\\"4室\\\",\\\"5室\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"1室\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(53,165,180,1)\\\"}},{\\\"name\\\":\\\"2室\\\",\\\"value\\\":30,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(60,140,198,1)\\\"}},{\\\"name\\\":\\\"3室\\\",\\\"value\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(93,144,81,1)\\\"}},{\\\"name\\\":\\\"4室\\\",\\\"value\\\":5,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(191,146,68,1)\\\"}},{\\\"name\\\":\\\"5室\\\",\\\"value\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"160\\\",\\\"120\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":\\\"8\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"50%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同户型销售\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608536502813.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331919172472524801\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"huxingxiaoshou\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"MCJP8uqwe57YoCvF\"},\"layer_id\":\"MCJP8uqwe57YoCvF\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[7,12],[7,13],[7,14],[7,15]]},{\"row\":7,\"col\":4,\"width\":\"662\",\"height\":\"222\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\",\\\"7月\\\",\\\"8月\\\",\\\"9月\\\",\\\"10月\\\",\\\"11月\\\",\\\"12月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#A98E8E\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"成交量\\\",\\\"成交价\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#FBF8F8\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"grid\\\":{\\\"top\\\":58,\\\"left\\\":30,\\\"bottom\\\":43,\\\"right\\\":32},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[10,7,5,5,7,9,3,6,5,8,6,6],\\\"name\\\":\\\"成交量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#37A5B1\\\",\\\"barBorderRadius\\\":13},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":7,\\\"typeData\\\":[{\\\"name\\\":\\\"成交量\\\",\\\"type\\\":\\\"\\\",\\\"_index\\\":0,\\\"_rowKey\\\":136,\\\"stack\\\":\\\"1\\\"},{\\\"name\\\":\\\"成交价\\\",\\\"type\\\":\\\"\\\",\\\"stack\\\":\\\"1\\\",\\\"_index\\\":1,\\\"_rowKey\\\":139}]},{\\\"barWidth\\\":15,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[5,5,12,5,5,5,5,10,5,5,5,5],\\\"name\\\":\\\"成交价\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#2E72A7\\\",\\\"barBorderRadius\\\":13},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":7,\\\"typeData\\\":[{\\\"name\\\":\\\"成交量\\\",\\\"type\\\":\\\"\\\",\\\"_index\\\":0,\\\"_rowKey\\\":136,\\\"stack\\\":\\\"1\\\"},{\\\"name\\\":\\\"成交价\\\",\\\"type\\\":\\\"\\\",\\\"stack\\\":\\\"1\\\",\\\"_index\\\":1,\\\"_rowKey\\\":139}]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"成交量和成交价趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/QQ截图20201207201434_1607343287788.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331872643531526146\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengjiao1\",\"chartType\":\"bar.stack\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Nf6Xud4fZqEfvQw4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[7,4],[7,5],[7,6],[7,7],[7,8],[7,9],[7,10],[7,11]]},{\"row\":16,\"col\":12,\"width\":\"326\",\"height\":\"200\",\"config\":\"{\\\"radar\\\":[{\\\"indicator\\\":[{\\\"name\\\":\\\"房产证\\\",\\\"max\\\":520},{\\\"name\\\":\\\"购房发票\\\",\\\"max\\\":310},{\\\"name\\\":\\\"购房合同\\\",\\\"max\\\":380},{\\\"name\\\":\\\"预售合同\\\",\\\"max\\\":450},{\\\"name\\\":\\\"抵押合同\\\",\\\"max\\\":600},{\\\"name\\\":\\\"预收合同\\\",\\\"max\\\":350}],\\\"shape\\\":\\\"polygon\\\",\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"center\\\":[\\\"50%\\\",\\\"50%\\\"],\\\"name\\\":{\\\"formatter\\\":\\\"【{value}】\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#72ACD1\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}}}],\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"售后产权\\\",\\\"单位产权\\\",\\\"个人产权\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"type\\\":\\\"radar\\\",\\\"data\\\":[{\\\"name\\\":\\\"售后产权\\\",\\\"value\\\":[43,100,280,350,500,250],\\\"areaStyle\\\":{\\\"color\\\":\\\"#3F9AFB\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"#2D8CF0\\\"}},{\\\"name\\\":\\\"单位产权\\\",\\\"value\\\":[190,50,140,280,310,150],\\\"areaStyle\\\":{\\\"color\\\":\\\"#A6F65C\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"#55FE4D\\\"}},{\\\"name\\\":\\\"个人产权\\\",\\\"value\\\":[420,210,160,0,120,130],\\\"areaStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\"}}]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同产权、证件成交量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608274537110.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331916030221602818\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"btchanquan\",\"chartType\":\"radar.basic\",\"isTiming\":true,\"intervalTime\":\"10\",\"id\":\"IWoBtyiRxjkEbkfD\"},\"layer_id\":\"IWoBtyiRxjkEbkfD\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[16,12],[16,13],[16,14],[16,15]]},{\"row\":16,\"col\":1,\"width\":\"337\",\"height\":\"205\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"马小姐\\\",\\\"孙小姐\\\",\\\"王先生\\\",\\\"李先生\\\",\\\"赵小姐\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":70,\\\"bottom\\\":40,\\\"right\\\":24},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[20,15,12,10,7],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#37A5B1\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售量成交排行榜\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1606961907450.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331514838211407873\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"cjpaihang\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Cror94F1kmbP71ip\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[16,1],[16,2],[16,3]]},{\"row\":16,\"col\":4,\"width\":\"334\",\"height\":\"206\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"马小姐\\\",\\\"孙小姐\\\",\\\"王先生\\\",\\\"李先生\\\",\\\"赵小姐\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":56,\\\"bottom\\\":38,\\\"right\\\":30},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[20,15,12,10,7],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#2E72A7\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售员成交金额\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1606961918589.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331514838211407873\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"cjpaihang\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"pBOwp0Q0g4iuJCVm\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[16,4],[16,5],[16,6],[16,7]]},{\"row\":16,\"col\":8,\"width\":\"324\",\"height\":\"206\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"简装\\\",\\\"中装\\\",\\\"精装\\\",\\\"豪装\\\",\\\"毛坯\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"简装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(52,158,172,1)\\\"}},{\\\"name\\\":\\\"中装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(56,131,185,1)\\\"}},{\\\"name\\\":\\\"精装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(103,153,75,1)\\\"}},{\\\"name\\\":\\\"豪装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(230,165,55,1)\\\"}},{\\\"name\\\":\\\"毛坯\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"180\\\",\\\"100\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"52%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同装修类型销售销量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608535503498.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331878107552010242\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhuangxiu\",\"chartType\":\"pie.simple\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"rQgkcYfLy4x0EP6h\"},\"layer_id\":\"rQgkcYfLy4x0EP6h\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[16,8],[16,9],[16,10],[16,11]]}],\"area\":false,\"printElWidth\":794,\"excel_config_id\":\"1331503965770223616\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"style\":60,\"merge\":[0,13],\"text\":\"房屋销售综合展示大屏\"},\"2\":{\"style\":61,\"text\":\" \"},\"3\":{\"style\":61,\"text\":\" \"},\"4\":{\"style\":61,\"text\":\" \"},\"5\":{\"style\":61,\"text\":\" \"},\"6\":{\"style\":61,\"text\":\" \"},\"7\":{\"style\":61,\"text\":\" \"},\"8\":{\"style\":61,\"text\":\" \"},\"9\":{\"style\":61,\"text\":\" \"},\"10\":{\"style\":61,\"text\":\" \"},\"11\":{\"style\":61,\"text\":\" \"},\"12\":{\"style\":61,\"text\":\" \"},\"13\":{\"style\":61,\"text\":\" \"},\"14\":{\"style\":61,\"text\":\" \"}},\"height\":113},\"1\":{\"cells\":{\"1\":{\"merge\":[14,2],\"style\":43,\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"2\":{\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"3\":{\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"4\":{\"style\":53,\"text\":\"成交量:\",\"merge\":[2,0],\"virtual\":\"5ggWQtDUvSopC4iL\"},\"5\":{\"text\":\"#{qingkuang.cjl}\",\"style\":64,\"merge\":[2,0]},\"7\":{\"style\":53,\"text\":\"成交金额:\",\"merge\":[2,0]},\"8\":{\"text\":\"#{qingkuang.cjje}\",\"style\":68,\"merge\":[2,0]},\"10\":{\"style\":53,\"text\":\"销售面积:\",\"merge\":[2,0]},\"11\":{\"text\":\"#{qingkuang.xsmj}\",\"style\":64,\"merge\":[2,0]},\"12\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"13\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"14\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"15\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"}},\"isDrag\":true},\"2\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"style\":53,\"text\":\" \"},\"5\":{\"style\":64,\"text\":\" \"},\"7\":{\"style\":53,\"text\":\" \"},\"8\":{\"style\":68,\"text\":\" \"},\"10\":{\"style\":53,\"text\":\" \"},\"11\":{\"style\":64,\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"3\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"style\":53,\"text\":\" \"},\"5\":{\"style\":64,\"text\":\" \"},\"7\":{\"style\":53,\"text\":\" \"},\"8\":{\"style\":68,\"text\":\" \"},\"10\":{\"style\":53,\"text\":\" \"},\"11\":{\"style\":64,\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"style\":58,\"text\":\"成交均价:\",\"merge\":[2,0]},\"5\":{\"text\":\"#{qingkuang.cjjj}\",\"style\":65,\"merge\":[2,0]},\"7\":{\"style\":58,\"text\":\"售房佣金:\",\"merge\":[2,0]},\"8\":{\"text\":\"#{qingkuang.sfyj}\",\"style\":65,\"merge\":[2,0]},\"10\":{\"style\":58,\"text\":\"预定客户:\",\"merge\":[2,0]},\"11\":{\"text\":\"#{qingkuang.ydkh}\",\"style\":65,\"merge\":[2,0]},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}},\"isDrag\":true,\"height\":25},\"5\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"style\":58,\"text\":\" \"},\"5\":{\"style\":65,\"text\":\" \"},\"7\":{\"style\":58,\"text\":\" \"},\"8\":{\"style\":65,\"text\":\" \"},\"10\":{\"style\":58,\"text\":\" \"},\"11\":{\"style\":65,\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"6\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"style\":58,\"text\":\" \"},\"5\":{\"style\":65,\"text\":\" \"},\"7\":{\"style\":58,\"text\":\" \"},\"8\":{\"style\":65,\"text\":\" \"},\"10\":{\"style\":58,\"text\":\" \"},\"11\":{\"style\":65,\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"7\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"5\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"6\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"7\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"8\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"9\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"10\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"11\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"12\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"13\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"14\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"15\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"}}},\"8\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"9\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"10\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"11\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"12\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"14\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"15\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"16\":{\"cells\":{\"1\":{\"style\":43,\"text\":\" \",\"merge\":[7,2],\"virtual\":\"Cror94F1kmbP71ip\"},\"2\":{\"text\":\" \",\"virtual\":\"Cror94F1kmbP71ip\"},\"3\":{\"text\":\" \",\"virtual\":\"Cror94F1kmbP71ip\"},\"4\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"5\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"6\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"7\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"8\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"9\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"10\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"11\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"12\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"13\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"14\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"15\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"}}},\"17\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"18\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"19\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"20\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"21\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"22\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"23\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"24\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1546,\"background\":{\"path\":\"https://static.jero.com/designreport/images/bg_1606961893275.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":18}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":18}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":16}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\"},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11}},{\"align\":\"right\",\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":11}},{\"align\":\"center\",\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":11}},{\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true}},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":22},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":22},\"align\":\"center\",\"color\":\"#000100\"},{\"color\":\"#000100\",\"font\":{\"size\":22}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\"},{},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\",\"border\":{\"right\":[\"thin\",\"#eee\"]}},{\"align\":\"right\",\"font\":{\"size\":16,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":15,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"bgcolor\":\"#ffff01\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"bgcolor\":\"\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\",\"bgcolor\":\"\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":117},\"3\":{\"width\":140},\"4\":{\"width\":136},\"5\":{\"width\":79},\"6\":{\"width\":1},\"7\":{\"width\":123},\"8\":{\"width\":102},\"9\":{\"width\":24},\"11\":{\"width\":100},\"14\":{\"width\":124},\"len\":28},\"merges\":[\"B2:D16\",\"E8:L16\",\"B17:D24\",\"E17:H24\",\"E2:E4\",\"F2:F4\",\"E5:E7\",\"F5:F7\",\"H2:H4\",\"H5:H7\",\"I5:I7\",\"I2:I4\",\"K2:K4\",\"L2:L4\",\"K5:K7\",\"L5:L7\",\"M17:O24\",\"B1:O1\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201125161646_1606705892603.png', 'admin', '2020-11-25 15:50:43', 'admin', '2021-01-13 14:14:11', 0, NULL, NULL, 1, 693); +INSERT INTO `jimu_report` VALUES ('1333962561053396992', '20201202103422', '房地产大屏', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"366\",\"height\":\"230\",\"config\":\"{\\\"yAxis\\\":[{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"},{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"萧山\\\",\\\"主城\\\",\\\"余杭\\\",\\\"江东\\\",\\\"阜阳\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"出让资金(亿元)\\\",\\\"出让面积(万平方米)\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFD700\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":36,\\\"bottom\\\":65,\\\"right\\\":50},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"color\\\":\\\"#2249B1\\\",\\\"barBorderRadius\\\":0},\\\"barMinHeight\\\":2,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"labelPositionArray\\\":[{\\\"value\\\":\\\"top\\\",\\\"text\\\":\\\"上方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"left\\\",\\\"text\\\":\\\"左边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"right\\\",\\\"text\\\":\\\"右边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"bottom\\\",\\\"text\\\":\\\"下方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"inside\\\",\\\"text\\\":\\\"内部\\\",\\\"type\\\":\\\"bar\\\"}]},\\\"type\\\":\\\"bar\\\",\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"data\\\":[90,100,80,20,30],\\\"typeData\\\":[{\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"type\\\":\\\"bar\\\"},{\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"type\\\":\\\"line\\\"}]},{\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"itemStyle\\\":{\\\"color\\\":\\\"#D8807E\\\"},\\\"step\\\":false,\\\"smooth\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"labelPositionArray\\\":[{\\\"value\\\":\\\"top\\\",\\\"text\\\":\\\"上方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"left\\\",\\\"text\\\":\\\"左边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"right\\\",\\\"text\\\":\\\"右边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"bottom\\\",\\\"text\\\":\\\"下方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"inside\\\",\\\"text\\\":\\\"内部\\\",\\\"type\\\":\\\"bar\\\"}]},\\\"type\\\":\\\"line\\\",\\\"yAxisIndex\\\":1,\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"data\\\":[70,90,40,10,20],\\\"typeData\\\":[{\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"type\\\":\\\"bar\\\"},{\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"type\\\":\\\"line\\\"}]}],\\\"chartType\\\":\\\"linebar\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"crossStyle\\\":{\\\"color\\\":\\\"#999\\\"},\\\"type\\\":\\\"cross\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"土地出让面积走势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1606877611717.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1333968597264900097\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"mianji\",\"chartType\":\"mixed.linebar\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"MqcEkZ87DgSKlNKU\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5]]},{\"row\":1,\"col\":13,\"width\":\"298\",\"height\":\"224\",\"config\":\"{\\\"yAxis\\\":[{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"},{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"出让资金(亿元)\\\",\\\"出让面积(万平方米)\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFD700\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":49,\\\"bottom\\\":63,\\\"right\\\":61},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"color\\\":\\\"#2249B1\\\",\\\"barBorderRadius\\\":0},\\\"barMinHeight\\\":2,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"labelPositionArray\\\":[{\\\"value\\\":\\\"top\\\",\\\"text\\\":\\\"上方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"left\\\",\\\"text\\\":\\\"左边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"right\\\",\\\"text\\\":\\\"右边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"bottom\\\",\\\"text\\\":\\\"下方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"inside\\\",\\\"text\\\":\\\"内部\\\",\\\"type\\\":\\\"bar\\\"}]},\\\"type\\\":\\\"bar\\\",\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"data\\\":[27000,11000,18000,17000,15000,22000],\\\"typeData\\\":[{\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"type\\\":\\\"line\\\"},{\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"type\\\":\\\"bar\\\"}]},{\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"itemStyle\\\":{\\\"color\\\":\\\"#D8807E\\\"},\\\"step\\\":false,\\\"smooth\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"labelPositionArray\\\":[{\\\"value\\\":\\\"top\\\",\\\"text\\\":\\\"上方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"left\\\",\\\"text\\\":\\\"左边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"right\\\",\\\"text\\\":\\\"右边\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"bottom\\\",\\\"text\\\":\\\"下方\\\",\\\"type\\\":\\\"bar\\\"},{\\\"value\\\":\\\"inside\\\",\\\"text\\\":\\\"内部\\\",\\\"type\\\":\\\"bar\\\"}]},\\\"type\\\":\\\"line\\\",\\\"yAxisIndex\\\":1,\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"data\\\":[24312,25450,26161,26303,27156,27440],\\\"typeData\\\":[{\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"type\\\":\\\"line\\\"},{\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"type\\\":\\\"bar\\\"}]}],\\\"chartType\\\":\\\"linebar\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"crossStyle\\\":{\\\"color\\\":\\\"#999\\\"},\\\"type\\\":\\\"cross\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"土地出让面积成交走势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1606887574795.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334008609356390402\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"churang1\",\"chartType\":\"mixed.linebar\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"rxyH40yMvbmwdgoU\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,13],[1,14],[1,15]]},{\"row\":1,\"col\":5,\"width\":\"680\",\"height\":\"421\",\"config\":\"{\\\"geo\\\":{\\\"map\\\":\\\"hangzhou\\\",\\\"zoom\\\":0.8,\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"6\\\",\\\"show\\\":true},\\\"itemStyle\\\":{\\\"borderWidth\\\":0.5,\\\"areaColor\\\":\\\"#3BB7C4\\\",\\\"borderColor\\\":\\\"#000\\\"},\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"#2D5D81\\\"}},\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"roam\\\":true,\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"encode\\\":{\\\"value\\\":[2]},\\\"data\\\":[{\\\"name\\\":\\\"西湖区\\\",\\\"value\\\":[120.147376,30.272934,120]},{\\\"name\\\":\\\"萧山区\\\",\\\"value\\\":[120.27069,30.162932,130]},{\\\"name\\\":\\\"余杭区\\\",\\\"value\\\":[120.301737,30.421187,56]},{\\\"name\\\":\\\"富阳区\\\",\\\"value\\\":[119.949869,30.049871,100]}],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#F6F469\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\"},\\\"type\\\":\\\"scatter\\\",\\\"symbolSize\\\":8}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"主要城市空气质量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1335901385547431937\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"ditu\",\"chartType\":\"map.scatter\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"L8v349B78nEYLOh4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11],[1,12]]},{\"row\":10,\"col\":1,\"width\":\"365\",\"height\":\"203\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"1万以下\\\",\\\"1万-2万\\\",\\\"2万-3万\\\",\\\"3万-4万\\\",\\\"4万-5万\\\",\\\"5万-6万\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"1万以下\\\",\\\"value\\\":7800,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(239,223,133,1)\\\"}},{\\\"name\\\":\\\"1万-2万\\\",\\\"value\\\":35900,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(24,141,240,1)\\\"}},{\\\"name\\\":\\\"2万-3万\\\",\\\"value\\\":46800,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(136,232,137,1)\\\"}},{\\\"name\\\":\\\"3万-4万\\\",\\\"value\\\":25631,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(0,206,209,1)\\\"}},{\\\"name\\\":\\\"4万-5万\\\",\\\"value\\\":17583,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(217,96,172,1)\\\"}},{\\\"name\\\":\\\"5万-6万\\\",\\\"value\\\":1563,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(109,172,234,1)\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"180\\\",\\\"120\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"住宅成交量单价分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608534816945.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1333974073679552514\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"danjia\",\"chartType\":\"pie.simple\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"ciJhTy5hoC2HlZ3v\"},\"layer_id\":\"ciJhTy5hoC2HlZ3v\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[10,1],[10,2],[10,3],[10,4],[10,5]]},{\"row\":10,\"col\":13,\"width\":\"301\",\"height\":\"203\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"80平\\\",\\\"80-100平\\\",\\\"100-120平\\\",\\\"120-140平\\\",\\\"140-180平\\\",\\\"180-250平\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"80平\\\",\\\"value\\\":20839,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(131,191,246,1)\\\"}},{\\\"name\\\":\\\"80-100平\\\",\\\"value\\\":35141,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(136,232,137,1)\\\"}},{\\\"name\\\":\\\"100-120平\\\",\\\"value\\\":27135,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(154,168,212,1)\\\"}},{\\\"name\\\":\\\"120-140平\\\",\\\"value\\\":17502,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(24,141,240,1)\\\"}},{\\\"name\\\":\\\"140-180平\\\",\\\"value\\\":14510,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(86,74,163,1)\\\"}},{\\\"name\\\":\\\"180-250平\\\",\\\"value\\\":9350,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(239,223,133,1)\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"180\\\",\\\"110\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"住宅成交量单价分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608535190322.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334013423209422849\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhuzhaichengjiao\",\"chartType\":\"pie.simple\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"ySncqf3fM8HfjJf0\"},\"layer_id\":\"ySncqf3fM8HfjJf0\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[10,13],[10,14],[10,15],[10,16]]},{\"row\":18,\"col\":13,\"width\":\"307\",\"height\":\"214\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":38,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"余杭\\\",\\\"大江东\\\",\\\"之江\\\",\\\"江干\\\",\\\"上城\\\",\\\"滨江\\\",\\\"拱墅\\\",\\\"西湖\\\",\\\"临安\\\",\\\"阜阳\\\",\\\"下沙\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":57,\\\"left\\\":53,\\\"bottom\\\":51,\\\"right\\\":39},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[23000,55000,32000,38000,45000,42000,41000,18000,22000,21000,30000],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#EEF349\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"各类型土地成交金额表\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1607936269772.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1333977108195581953\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"junjia\",\"chartType\":\"line.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"tc7fqIIJW5HgcaGl\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[18,13],[18,14],[18,15],[18,16]]},{\"row\":18,\"col\":5,\"width\":\"350\",\"height\":\"215\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":true},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"出让资金(亿元)\\\",\\\"出让面积(万平方米)\\\",\\\"盈亏\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFD700\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":36,\\\"bottom\\\":59,\\\"right\\\":32},\\\"series\\\":[{\\\"barWidth\\\":8,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[420,150,410,250,180,100],\\\"name\\\":\\\"出让资金(亿元)\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#2249B1\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]},{\\\"barWidth\\\":8,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[410,139,330,190,250,13],\\\"name\\\":\\\"出让面积(万平方米)\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#D8807E\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]},{\\\"barWidth\\\":8,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[-410,-139,-330,-190,-250,-13],\\\"name\\\":\\\"盈亏\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#88E889\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"各区域土地出让面积、成交金额对比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1607393405721.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1333980382663548929\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"churang\",\"chartType\":\"bar.stack.horizontal\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"FlAtAueGAEeNYmrK\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[18,5],[18,6],[18,7],[18,8]]},{\"row\":18,\"col\":9,\"width\":\"332\",\"height\":\"214\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E90FF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"供给\\\",\\\"需求\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFD700\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":54,\\\"bottom\\\":60,\\\"right\\\":28},\\\"series\\\":[{\\\"barWidth\\\":0,\\\"data\\\":[1000,3500,5032,1966,7964,11532],\\\"name\\\":\\\"供给\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#188DF0\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]},{\\\"barWidth\\\":0,\\\"data\\\":[12854,59873,83241,60075,42035,95812],\\\"name\\\":\\\"需求\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#88E889\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"新住宅供需\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1606880990858.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1333983587241828354\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xinzhuzhai\",\"chartType\":\"bar.multi\"},\"layer_id\":\"6mjMdjSCbjMXtpk5\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[18,9],[18,10],[18,11],[18,12]]},{\"row\":18,\"col\":1,\"width\":\"357\",\"height\":\"216\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":28,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"余杭\\\",\\\"大江东\\\",\\\"之江\\\",\\\"江干\\\",\\\"上城\\\",\\\"滨江\\\",\\\"拱墅\\\",\\\"西湖\\\",\\\"临安\\\",\\\"阜阳\\\",\\\"下沙\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":49,\\\"left\\\":51,\\\"bottom\\\":50,\\\"right\\\":30},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[23000,55000,32000,38000,45000,42000,41000,18000,22000,21000,30000],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#88E889\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"各区域住宅成交均价\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1607935883871.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1333977108195581953\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"junjia\",\"chartType\":\"line.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"m4YsRktrtZgDdIrS\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[18,1],[18,2],[18,3],[18,4]]}],\"area\":{\"sri\":0,\"sci\":1,\"eri\":0,\"eci\":15,\"width\":1346,\"height\":71},\"printElWidth\":13001,\"excel_config_id\":\"1333962561053396992\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"杭州房地产市场监控\",\"style\":3,\"merge\":[0,14]},\"2\":{\"style\":4},\"3\":{\"style\":4},\"4\":{\"style\":4},\"5\":{\"style\":4},\"6\":{\"style\":4},\"7\":{\"style\":4},\"8\":{\"style\":4},\"9\":{\"style\":4},\"10\":{\"style\":4},\"11\":{\"style\":4},\"12\":{\"style\":4},\"13\":{\"style\":4},\"14\":{\"style\":4},\"15\":{\"style\":4}},\"height\":71},\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"MqcEkZ87DgSKlNKU\"},\"2\":{\"text\":\" \",\"virtual\":\"MqcEkZ87DgSKlNKU\"},\"3\":{\"text\":\" \",\"virtual\":\"MqcEkZ87DgSKlNKU\"},\"4\":{\"text\":\" \",\"virtual\":\"MqcEkZ87DgSKlNKU\"},\"5\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"6\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"7\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"8\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"9\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"10\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"11\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"12\":{\"text\":\" \",\"virtual\":\"L8v349B78nEYLOh4\"},\"13\":{\"text\":\" \",\"virtual\":\"rxyH40yMvbmwdgoU\"},\"14\":{\"text\":\" \",\"virtual\":\"rxyH40yMvbmwdgoU\"},\"15\":{\"text\":\" \",\"virtual\":\"rxyH40yMvbmwdgoU\"}}},\"10\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"ciJhTy5hoC2HlZ3v\"},\"2\":{\"text\":\" \",\"virtual\":\"ciJhTy5hoC2HlZ3v\"},\"3\":{\"text\":\" \",\"virtual\":\"ciJhTy5hoC2HlZ3v\"},\"4\":{\"text\":\" \",\"virtual\":\"ciJhTy5hoC2HlZ3v\"},\"5\":{\"text\":\" \",\"virtual\":\"ciJhTy5hoC2HlZ3v\"},\"13\":{\"text\":\" \",\"virtual\":\"ySncqf3fM8HfjJf0\"},\"14\":{\"text\":\" \",\"virtual\":\"ySncqf3fM8HfjJf0\"},\"15\":{\"text\":\" \",\"virtual\":\"ySncqf3fM8HfjJf0\"},\"16\":{\"text\":\" \",\"virtual\":\"ySncqf3fM8HfjJf0\"}}},\"18\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"m4YsRktrtZgDdIrS\"},\"2\":{\"text\":\" \",\"virtual\":\"m4YsRktrtZgDdIrS\"},\"3\":{\"text\":\" \",\"virtual\":\"m4YsRktrtZgDdIrS\"},\"4\":{\"text\":\" \",\"virtual\":\"m4YsRktrtZgDdIrS\"},\"5\":{\"text\":\" \",\"virtual\":\"FlAtAueGAEeNYmrK\"},\"6\":{\"text\":\" \",\"virtual\":\"FlAtAueGAEeNYmrK\"},\"7\":{\"text\":\" \",\"virtual\":\"FlAtAueGAEeNYmrK\"},\"8\":{\"text\":\" \",\"virtual\":\"FlAtAueGAEeNYmrK\"},\"9\":{\"text\":\" \",\"virtual\":\"6mjMdjSCbjMXtpk5\"},\"10\":{\"text\":\" \",\"virtual\":\"6mjMdjSCbjMXtpk5\"},\"11\":{\"text\":\" \",\"virtual\":\"6mjMdjSCbjMXtpk5\"},\"12\":{\"text\":\" \",\"virtual\":\"6mjMdjSCbjMXtpk5\"},\"13\":{\"text\":\" \",\"virtual\":\"tc7fqIIJW5HgcaGl\"},\"14\":{\"text\":\" \",\"virtual\":\"tc7fqIIJW5HgcaGl\"},\"15\":{\"text\":\" \",\"virtual\":\"tc7fqIIJW5HgcaGl\"},\"16\":{\"text\":\" \",\"virtual\":\"tc7fqIIJW5HgcaGl\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1517,\"background\":{\"path\":\"https://static.jero.com/designreport/images/bg_1606876512567.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"align\":\"center\"},{\"align\":\"center\"},{\"color\":\"#ffffff\",\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18}}],\"validations\":[],\"cols\":{\"0\":{\"width\":71},\"4\":{\"width\":60},\"8\":{\"width\":51},\"12\":{\"width\":35},\"len\":26},\"merges\":[\"B1:P1\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201202142202_1606890135640.png', 'admin', '2020-12-02 10:34:22', 'admin', '2021-01-13 14:14:07', 0, NULL, NULL, 1, 562); +INSERT INTO `jimu_report` VALUES ('1334028738995818496', '20201202145702', '大数据可视化展示平台', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":1,\"col\":6,\"width\":\"498\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\",\\\"7月\\\",\\\"8月\\\",\\\"9月\\\",\\\"10月\\\",\\\"11月\\\",\\\"12月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"2017\\\",\\\"2018\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"grid\\\":{\\\"top\\\":68,\\\"left\\\":35,\\\"bottom\\\":45,\\\"right\\\":31},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[2,3,3,9,15,12,6,4,6,7,4,10],\\\"name\\\":\\\"2017\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#49BCF7\\\",\\\"barBorderRadius\\\":8},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]},{\\\"barWidth\\\":9,\\\"data\\\":[1,4,5,11,12,9,5,6,6,3,3,9],\\\"name\\\":\\\"2018\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#62C98D\\\",\\\"barBorderRadius\\\":8},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"柱形图标题\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":\\\"#020F4A\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334052375119273986\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhuxingtu1\",\"chartType\":\"bar.multi\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"aELaGxHbJDssfJ1j\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,6],[1,7],[1,8],[1,9],[1,10]]},{\"row\":1,\"col\":11,\"width\":\"407\",\"height\":\"174\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"图例1\\\",\\\"图例2\\\",\\\"图例3\\\",\\\"图例4\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":true,\\\"data\\\":[{\\\"name\\\":\\\"图例1\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(98,201,141,1)\\\"}},{\\\"name\\\":\\\"图例2\\\",\\\"value\\\":15,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(45,140,240,1)\\\"}},{\\\"name\\\":\\\"图例3\\\",\\\"value\\\":25,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(76,185,207,1)\\\"}},{\\\"name\\\":\\\"图例4\\\",\\\"value\\\":30,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(83,182,102,1)\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"radius\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"170\\\",\\\"90\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"饼图1\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(2,15,74,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334037720053325825\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bingtu1\",\"chartType\":\"pie.rose\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"hBFP1li6wk4SZKZy\"},\"layer_id\":\"hBFP1li6wk4SZKZy\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,11],[1,12],[1,13],[1,14],[1,15]]},{\"row\":4,\"col\":3,\"width\":\"214\",\"height\":\"151\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量结算率\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"数量结算率\\\",\\\"value\\\":80,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(73,188,247,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(220,222,224,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"110\\\",\\\"80\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"38%\\\",\\\"45%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"数据结算率1\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"12\\\"},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(2,15,74,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334060474135748610\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bingtu4\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"7jVBJ8HTXwnRttsp\"},\"layer_id\":\"7jVBJ8HTXwnRttsp\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,3],[4,4],[4,5]]},{\"row\":4,\"col\":1,\"width\":\"198\",\"height\":\"150\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量结算率\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"数量结算率\\\",\\\"value\\\":80,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(73,188,247,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(220,222,224,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"110\\\",\\\"80\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"38%\\\",\\\"45%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"数据结算率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"12\\\"},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(2,15,74,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334060474135748610\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bingtu4\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"mHCyVw72XWRJdiO9\"},\"layer_id\":\"mHCyVw72XWRJdiO9\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,1],[4,2]]},{\"row\":8,\"col\":11,\"width\":\"408\",\"height\":\"164\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"orient\\\":\\\"vertical\\\",\\\"data\\\":[{\\\"name\\\":\\\"1月\\\",\\\"value\\\":9800,\\\"itemStyle\\\":{\\\"color\\\":\\\"#62C98D\\\"}},{\\\"name\\\":\\\"2月\\\",\\\"value\\\":3100,\\\"itemStyle\\\":{\\\"color\\\":\\\"#2F89CF\\\"}},{\\\"name\\\":\\\"3月\\\",\\\"value\\\":7800,\\\"itemStyle\\\":{\\\"color\\\":\\\"#F2E83B\\\"}},{\\\"name\\\":\\\"4月\\\",\\\"value\\\":1500,\\\"itemStyle\\\":{\\\"color\\\":\\\"#F691F8\\\"}},{\\\"name\\\":\\\"5月\\\",\\\"value\\\":500,\\\"itemStyle\\\":{\\\"color\\\":\\\"#A3DEEB\\\"}}],\\\"bottom\\\":26,\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"ascending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\",\\\"top\\\":29,\\\"left\\\":\\\"9%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"漏斗图\\\",\\\"width\\\":\\\"79%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}%\\\",\\\"show\\\":true,\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"backgroundColor\\\":\\\"rgba(2,15,74,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1335889985047478274\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"loudou\",\"chartType\":\"funnel.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"8IhEqgKnyGamOhrE\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[8,11],[8,12],[8,13],[8,14],[8,15]]},{\"row\":10,\"col\":1,\"width\":\"204\",\"height\":\"126\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"金额结算率1\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"金额结算率1\\\",\\\"value\\\":30,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(98,201,141,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":70,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(220,222,224,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"105\\\",\\\"70\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"金额结算率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"12\\\"},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(2,15,74,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334063192933933058\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bingtu5\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"Py8YVZMoRcL4APDN\"},\"layer_id\":\"Py8YVZMoRcL4APDN\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[10,1],[10,2],[10,3]]},{\"row\":10,\"col\":3,\"width\":\"216\",\"height\":\"126\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"金额结算率2\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"金额结算率2\\\",\\\"value\\\":190,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(98,201,141,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(220,222,224,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"105\\\",\\\"70\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"金额结算率2\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(2,15,74,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334063880162254850\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"bingtu6\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"fMnJPCVW1ofDhOYl\"},\"layer_id\":\"fMnJPCVW1ofDhOYl\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[10,3],[10,4],[10,5],[10,6]]},{\"row\":15,\"col\":11,\"width\":\"410\",\"height\":\"273\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\",\\\"7月\\\",\\\"8月\\\",\\\"9月\\\",\\\"10月\\\",\\\"11月\\\",\\\"12月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\",\\\"boundaryGap\\\":true},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"2017\\\",\\\"2018\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":39,\\\"bottom\\\":48,\\\"right\\\":35},\\\"series\\\":[{\\\"data\\\":[2,6,3,8,5,8,10,13,8,5,6,9],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"name\\\":\\\"2017\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#205ACF\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false,\\\"typeData\\\":[]},{\\\"data\\\":[5,2,6,4,5,12,5,17,9,2,6,3],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"name\\\":\\\"2018\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#62C98D\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"多数据折线标题\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":\\\"#020F4A\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334043138246844418\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhexian1\",\"chartType\":\"line.multi\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"aXbsAJNPWFEfutG9\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[15,11],[15,12],[15,13],[15,14],[15,15]]},{\"row\":15,\"col\":6,\"width\":\"495\",\"height\":\"273\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":49,\\\"left\\\":37,\\\"bottom\\\":41,\\\"right\\\":38},\\\"series\\\":[{\\\"data\\\":[[10,35],[20,10],[15,30],[10,10],[15,35],[5,10],[10,35],[20,15],[10,3],[20,40],[16,12],[43,10]],\\\"symbolSize\\\":37,\\\"itemStyle\\\":{\\\"color\\\":\\\"#62C98D\\\",\\\"opacity\\\":0.6},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"scatter\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"散点图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10},\\\"backgroundColor\\\":\\\"#020F4A\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1335886666363158530\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"sandian\",\"chartType\":\"scatter.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"QFBt4au5CSQVFVAq\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[15,6],[15,7],[15,8],[15,9],[15,10]]}],\"area\":false,\"printElWidth\":794,\"excel_config_id\":\"1334028738995818496\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"merge\":[0,13],\"text\":\"大数据可视化展示平台\",\"style\":5},\"2\":{\"style\":5},\"3\":{\"style\":5},\"4\":{\"style\":5},\"5\":{\"style\":5},\"6\":{\"style\":5},\"7\":{\"style\":5},\"8\":{\"style\":5},\"9\":{\"style\":5},\"10\":{\"style\":5},\"11\":{\"style\":5},\"12\":{\"style\":5},\"13\":{\"style\":5},\"14\":{\"style\":5}},\"height\":84},\"1\":{\"cells\":{\"1\":{\"merge\":[1,1],\"text\":\"1922\",\"style\":49},\"2\":{\"style\":49},\"3\":{\"merge\":[1,1],\"text\":\"2047\",\"style\":49},\"4\":{\"style\":49},\"6\":{\"text\":\" \",\"virtual\":\"aELaGxHbJDssfJ1j\"},\"7\":{\"text\":\" \",\"virtual\":\"aELaGxHbJDssfJ1j\"},\"8\":{\"text\":\" \",\"virtual\":\"aELaGxHbJDssfJ1j\"},\"9\":{\"text\":\" \",\"virtual\":\"aELaGxHbJDssfJ1j\"},\"10\":{\"text\":\" \",\"virtual\":\"aELaGxHbJDssfJ1j\"},\"11\":{\"text\":\" \",\"virtual\":\"hBFP1li6wk4SZKZy\"},\"12\":{\"text\":\" \",\"virtual\":\"hBFP1li6wk4SZKZy\"},\"13\":{\"text\":\" \",\"virtual\":\"hBFP1li6wk4SZKZy\"},\"14\":{\"text\":\" \",\"virtual\":\"hBFP1li6wk4SZKZy\"},\"15\":{\"text\":\" \",\"virtual\":\"hBFP1li6wk4SZKZy\"}}},\"2\":{\"cells\":{\"1\":{\"style\":49},\"2\":{\"style\":49},\"3\":{\"style\":49},\"4\":{\"style\":49}}},\"3\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"总金额\",\"style\":68},\"2\":{\"style\":68},\"3\":{\"merge\":[0,1],\"style\":68,\"text\":\"数量\"},\"4\":{\"style\":68}}},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"mHCyVw72XWRJdiO9\"},\"2\":{\"text\":\" \",\"virtual\":\"mHCyVw72XWRJdiO9\"},\"3\":{\"text\":\" \",\"virtual\":\"7jVBJ8HTXwnRttsp\"},\"4\":{\"text\":\" \",\"virtual\":\"7jVBJ8HTXwnRttsp\"},\"5\":{\"text\":\" \",\"virtual\":\"7jVBJ8HTXwnRttsp\"}}},\"8\":{\"cells\":{\"11\":{\"text\":\" \",\"virtual\":\"8IhEqgKnyGamOhrE\"},\"12\":{\"text\":\" \",\"virtual\":\"8IhEqgKnyGamOhrE\"},\"13\":{\"text\":\" \",\"virtual\":\"8IhEqgKnyGamOhrE\"},\"14\":{\"text\":\" \",\"virtual\":\"8IhEqgKnyGamOhrE\"},\"15\":{\"text\":\" \",\"virtual\":\"8IhEqgKnyGamOhrE\"}}},\"9\":{\"cells\":{}},\"10\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"Py8YVZMoRcL4APDN\"},\"2\":{\"text\":\" \",\"virtual\":\"Py8YVZMoRcL4APDN\"},\"3\":{\"text\":\" \",\"virtual\":\"fMnJPCVW1ofDhOYl\"},\"4\":{\"text\":\" \",\"virtual\":\"fMnJPCVW1ofDhOYl\"},\"5\":{\"text\":\" \",\"virtual\":\"fMnJPCVW1ofDhOYl\"},\"6\":{\"text\":\" \",\"virtual\":\"fMnJPCVW1ofDhOYl\"}}},\"15\":{\"cells\":{\"1\":{\"text\":\"标题\",\"style\":72,\"merge\":[0,3]},\"2\":{\"style\":73},\"3\":{\"style\":73},\"4\":{\"style\":73},\"6\":{\"text\":\" \",\"virtual\":\"QFBt4au5CSQVFVAq\"},\"7\":{\"text\":\" \",\"virtual\":\"QFBt4au5CSQVFVAq\"},\"8\":{\"text\":\" \",\"virtual\":\"QFBt4au5CSQVFVAq\"},\"9\":{\"text\":\" \",\"virtual\":\"QFBt4au5CSQVFVAq\"},\"10\":{\"text\":\" \",\"virtual\":\"QFBt4au5CSQVFVAq\"},\"11\":{\"text\":\" \",\"virtual\":\"aXbsAJNPWFEfutG9\"},\"12\":{\"text\":\" \",\"virtual\":\"aXbsAJNPWFEfutG9\"},\"13\":{\"text\":\" \",\"virtual\":\"aXbsAJNPWFEfutG9\"},\"14\":{\"text\":\" \",\"virtual\":\"aXbsAJNPWFEfutG9\"},\"15\":{\"text\":\" \",\"virtual\":\"aXbsAJNPWFEfutG9\"}}},\"16\":{\"cells\":{\"1\":{\"text\":\"订单号\",\"style\":66},\"2\":{\"text\":\"订单金额\",\"style\":66},\"3\":{\"text\":\"计划时间\",\"style\":66},\"4\":{\"text\":\"当前状态\",\"style\":66}},\"height\":22},\"17\":{\"cells\":{\"1\":{\"style\":67,\"text\":\"#{biaoge.yname}\"},\"2\":{\"style\":67,\"text\":\"#{biaoge.ysex}\"},\"3\":{\"style\":67,\"text\":\"#{biaoge.yage}\"},\"4\":{\"style\":67,\"text\":\"#{biaoge.danwei}\"}},\"height\":22},\"18\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":17},\"19\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":19},\"20\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":19},\"21\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":19},\"22\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":19},\"23\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":17},\"24\":{\"cells\":{\"1\":{\"style\":8},\"2\":{\"style\":8},\"3\":{\"style\":8},\"4\":{\"style\":8}},\"height\":16},\"25\":{\"cells\":{\"1\":{\"style\":74},\"2\":{\"style\":74},\"3\":{\"style\":74},\"4\":{\"style\":74}},\"height\":18},\"26\":{\"cells\":{},\"height\":20},\"len\":102,\"NaN\":0},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1520,\"background\":{\"path\":\"https://static.jero.com/designreport/images/bg_1606894559245.jpg\",\"repeat\":\"repeat\",\"width\":\"1700\",\"height\":\"1080\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"align\":\"center\"},{\"align\":\"center\"},{\"color\":\"#ffffff\",\"align\":\"center\",\"font\":{\"size\":22}},{\"align\":\"center\",\"font\":{\"size\":22}},{\"color\":\"#ffffff\",\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":18}},{\"bgcolor\":\"#020F4A\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\"},{\"align\":\"center\",\"color\":\"#C7CD4F\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":24}},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":24}},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":22}},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":22}},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18}},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18}},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18,\"bold\":true}},{\"color\":\"#e\"},{\"color\":\"#e\'e\"},{\"color\":\"#e\'e\'e\"},{\"color\":\"#eee\"},{\"color\":\"#eee\",\"align\":\"center\"},{\"color\":\"#eee\",\"align\":\"center\",\"bgcolor\":\"#020F4A\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"top\"},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"top\"},{\"color\":\"#eee\",\"align\":\"center\",\"bgcolor\":\"#020F4A\",\"valign\":\"top\"},{\"color\":\"#C7CD4F\"},{\"color\":\"#C7CD4F\",\"font\":{\"size\":18}},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#e\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#e\'e\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#e\'e\'e\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#e\'e\'e\'e\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#e\'e\'e\'e\'e\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#e\'e\'e\'e\'e\'e\"},{\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"color\":\"#eeeeee\"},{\"color\":\"#0a0a0\"},{\"color\":\"#0a0a\"},{\"color\":\"#0a0\"},{\"color\":\"#0a\"},{\"color\":\"#0\"},{\"color\":\"#\"},{\"color\":\"\"},{\"color\":\"#0a0a0a\"},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18},\"valign\":\"bottom\"},{\"align\":\"center\",\"color\":\"#C7CD4F\",\"font\":{\"size\":18},\"valign\":\"bottom\",\"bgcolor\":\"#020F4A\"},{\"font\":{\"size\":18},\"bgcolor\":\"#020F4A\"},{\"font\":{\"size\":18},\"bgcolor\":\"#020F4A\",\"align\":\"center\"},{\"font\":{\"size\":18},\"bgcolor\":\"#020F4A\",\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"center\",\"color\":\"#e\"},{\"align\":\"center\",\"color\":\"#e\'e\"},{\"align\":\"center\",\"color\":\"#e\'e\'e\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18}},{\"color\":\"#ffffff\",\"font\":{\"size\":14}},{\"color\":\"#ffffff\",\"font\":{\"size\":12}},{\"color\":\"#ffffff\",\"font\":{\"size\":12,\"bold\":true}},{\"color\":\"#ffffff\",\"font\":{\"size\":12,\"bold\":false}},{\"color\":\"#ffffff\",\"font\":{\"size\":12,\"bold\":false},\"bgcolor\":\"#020F4A\"},{\"bgcolor\":\"#020F4A\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"align\":\"center\",\"bgcolor\":\"001259\"},{\"color\":\"#ffffff\",\"align\":\"center\",\"bgcolor\":\"#001259\"},{\"color\":\"#ffffff\",\"align\":\"center\",\"bgcolor\":\"020f4b\"},{\"color\":\"#ffffff\",\"align\":\"center\",\"bgcolor\":\"#020f4b\"},{\"bgcolor\":\"#020F4A\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"color\":\"#eee\",\"align\":\"center\",\"bgcolor\":\"#020F4A\",\"font\":{\"size\":8}},{\"bgcolor\":\"#020F4A\",\"font\":{\"size\":12}},{\"color\":\"#ffffff\",\"font\":{\"size\":10,\"bold\":false},\"bgcolor\":\"#020F4A\"},{\"bgcolor\":\"#020F4A\",\"font\":{\"size\":10}},{\"color\":\"#ffffff\",\"font\":{\"size\":11,\"bold\":false},\"bgcolor\":\"#020F4A\"},{\"bgcolor\":\"#020F4A\",\"font\":{\"size\":11}},{\"bgcolor\":\"\"}],\"validations\":[],\"cols\":{\"4\":{\"width\":103},\"5\":{\"width\":13},\"13\":{\"width\":104},\"len\":26},\"merges\":[\"AG101:MG101\",\"AG100:BG99\",\"AG98:BG98\",\"CG100:DG99\",\"CG98:DG98\",\"B2:C3\",\"D2:E3\",\"B4:C4\",\"D4:E4\",\"B1:O1\",\"B16:E16\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201203163957_1606984816365.png', 'admin', '2020-12-02 14:57:03', 'admin', '2021-01-13 14:14:02', 0, NULL, NULL, 1, 547); +INSERT INTO `jimu_report` VALUES ('1334074491629867008', '20201202175858', '乡村振兴普惠金融服务平台', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":1,\"col\":5,\"width\":\"575\",\"height\":\"447\",\"config\":\"{\\\"geo\\\":{\\\"map\\\":\\\"shandong\\\",\\\"zoom\\\":0.8,\\\"label\\\":{\\\"color\\\":\\\"#19DEF4\\\",\\\"fontSize\\\":\\\"8\\\",\\\"show\\\":true},\\\"itemStyle\\\":{\\\"borderWidth\\\":0.5,\\\"areaColor\\\":\\\"#0C514B\\\",\\\"borderColor\\\":\\\"#000\\\"},\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"#0A2B34\\\"}},\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"roam\\\":true,\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"encode\\\":{\\\"value\\\":[2]},\\\"data\\\":[{\\\"name\\\":\\\"济南市\\\",\\\"value\\\":[117.000923,36.675807,255]},{\\\"name\\\":\\\"青岛市\\\",\\\"value\\\":[120.355173,36.082982,300]},{\\\"name\\\":\\\"淄博市\\\",\\\"value\\\":[118.047648,36.814939,130]},{\\\"name\\\":\\\"枣庄市\\\",\\\"value\\\":[117.557964,34.856424,150]}],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFF01\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\"},\\\"type\\\":\\\"scatter\\\",\\\"symbolSize\\\":5}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"主要城市空气质量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1335909918854725633\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"ditu1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"map.scatter\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"fEn665Qht92lodc1\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11]]},{\"row\":3,\"col\":11,\"width\":\"362\",\"height\":\"168\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"玉米\\\",\\\"大豆\\\",\\\"花生\\\",\\\"高粱\\\",\\\"小麦\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":60,\\\"bottom\\\":40,\\\"right\\\":24},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#6CE6BC\\\",\\\"opacity\\\":0.4},\\\"data\\\":[1000879,3400879,2300879,2400879,3000],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#9DE4D1\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"五年产业变化趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#81E1B6\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(10,43,52,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334083843610648578\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"wunian\",\"chartType\":\"line.area\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Kkx8cQxh41KDHQKJ\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[3,11],[3,12],[3,13],[3,14]]},{\"row\":8,\"col\":11,\"width\":\"359\",\"height\":\"213\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"玉米\\\",\\\"大豆\\\",\\\"花生\\\",\\\"高粱\\\",\\\"小麦\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":64,\\\"bottom\\\":41,\\\"right\\\":23},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"data\\\":[1000879,3400879,2300879,2400879,3000],\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":5,\\\"color\\\":\\\"#82F1B5\\\"},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"8\\\",\\\"fontWeight\\\":\\\"lighter\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":11,\\\"text\\\":\\\"农产品排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#7AEEBF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":\\\"rgba(10,43,52,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334083843610648578\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"wunian\",\"chartType\":\"bar.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"a7MjSGYTQuijDpR4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[8,11],[8,12],[8,13],[8,14]]},{\"row\":13,\"col\":11,\"width\":\"361\",\"height\":\"235\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"玉米\\\",\\\"大豆\\\",\\\"花生\\\",\\\"高粱\\\",\\\"小麦\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"data\\\":[{\\\"name\\\":\\\"玉米\\\",\\\"value\\\":1000879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(20,235,167,1)\\\"}},{\\\"name\\\":\\\"大豆\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(36,96,221,1)\\\"}},{\\\"name\\\":\\\"花生\\\",\\\"value\\\":2300879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(86,74,163,1)\\\"}},{\\\"name\\\":\\\"高粱\\\",\\\"value\\\":2400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(253,223,80,1)\\\"}},{\\\"name\\\":\\\"小麦\\\",\\\"value\\\":3000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(111,131,168,1)\\\"}}],\\\"bottom\\\":60,\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"minAngle\\\":0,\\\"right\\\":\\\"10%\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"pie\\\",\\\"autoSort\\\":false,\\\"isRose\\\":false,\\\"top\\\":60,\\\"left\\\":\\\"10%\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"radius\\\":\\\"90%\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"农业占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#14EBA7\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"rgba(10,43,52,1)\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1334083843610648578\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"wunian\",\"chartType\":\"pie.simple\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"cvVQrHsdQLGGQu9k\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[13,11],[13,12],[13,13],[13,14]]}],\"area\":{\"sri\":10,\"sci\":1,\"eri\":10,\"eci\":1,\"width\":63,\"height\":62},\"printElWidth\":794,\"excel_config_id\":\"1334074491629867008\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"乡村振兴普惠金融服务平台\",\"style\":18,\"merge\":[0,8]},\"2\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"style\":19},\"8\":{\"style\":19},\"9\":{\"style\":19}},\"height\":57},\"1\":{\"cells\":{\"1\":{\"text\":\"Rural Revitalization-PRATT & WHITNEY FINANCIAL SERVICES PLATFORM\",\"style\":10,\"merge\":[0,3]},\"2\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"},\"6\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"},\"7\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"},\"8\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"},\"9\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"},\"10\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"},\"11\":{\"text\":\" \",\"virtual\":\"fEn665Qht92lodc1\"}},\"height\":46},\"2\":{\"cells\":{\"1\":{\"text\":\"潍坊非常牛的企业\",\"style\":101,\"merge\":[1,3]},\"2\":{\"style\":102},\"3\":{\"style\":102},\"4\":{\"style\":102}},\"height\":20},\"3\":{\"cells\":{\"1\":{\"style\":102},\"2\":{\"style\":102},\"3\":{\"style\":102},\"4\":{\"style\":102},\"11\":{\"text\":\" \",\"virtual\":\"Kkx8cQxh41KDHQKJ\"},\"12\":{\"text\":\" \",\"virtual\":\"Kkx8cQxh41KDHQKJ\"},\"13\":{\"text\":\" \",\"virtual\":\"Kkx8cQxh41KDHQKJ\"},\"14\":{\"text\":\" \",\"virtual\":\"Kkx8cQxh41KDHQKJ\"}},\"height\":16},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"XnSfPgo35Nv22Thw\"},\"2\":{\"text\":\"12345\",\"style\":112,\"virtual\":\"XnSfPgo35Nv22Thw\"},\"3\":{\"text\":\" \",\"virtual\":\"sWakDse7OZ6sTEA0\"},\"4\":{\"text\":\"58963\",\"style\":113,\"virtual\":\"sWakDse7OZ6sTEA0\"}},\"height\":56},\"5\":{\"cells\":{\"2\":{\"text\":\"农牧耕田(亩)\",\"style\":98},\"4\":{\"text\":\"农牧耕田(亩)\",\"style\":57}},\"height\":19},\"6\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"B3anFjJ1WjdaI4dL\"},\"2\":{\"text\":\"123456\",\"style\":113,\"virtual\":\"B3anFjJ1WjdaI4dL\"},\"3\":{\"text\":\" \",\"virtual\":\"XcOdLHt5nq0gnV2s\"},\"4\":{\"text\":\"123456\",\"style\":113,\"virtual\":\"XcOdLHt5nq0gnV2s\"}},\"height\":59},\"7\":{\"cells\":{\"2\":{\"text\":\"农牧耕田(亩)\",\"style\":57},\"4\":{\"text\":\"农牧耕田(亩)\",\"style\":57},\"8\":{\"style\":94}},\"height\":16},\"8\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"DCJWFRnncFjlkJhg\"},\"2\":{\"text\":\"123456\",\"style\":113,\"virtual\":\"DCJWFRnncFjlkJhg\"},\"3\":{\"text\":\" \",\"virtual\":\"o4GJy5VBXOEAxVf5\"},\"4\":{\"text\":\"123456\",\"style\":113},\"11\":{\"text\":\" \",\"virtual\":\"a7MjSGYTQuijDpR4\"},\"12\":{\"text\":\" \",\"virtual\":\"a7MjSGYTQuijDpR4\"},\"13\":{\"text\":\" \",\"virtual\":\"a7MjSGYTQuijDpR4\"},\"14\":{\"text\":\" \",\"virtual\":\"a7MjSGYTQuijDpR4\"}},\"height\":61},\"9\":{\"cells\":{\"2\":{\"text\":\"农牧耕田(亩)\",\"style\":100},\"4\":{\"text\":\"农牧耕田(亩)\",\"style\":100}},\"height\":15},\"10\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"TrmeCgSZwslKMbfC\"},\"2\":{\"text\":\"123456\",\"style\":113,\"virtual\":\"TrmeCgSZwslKMbfC\"},\"3\":{\"text\":\" \",\"virtual\":\"QXdIZ7w5vyCKDLjv\"},\"4\":{\"text\":\"123456\",\"style\":113,\"virtual\":\"QXdIZ7w5vyCKDLjv\"}},\"height\":62},\"11\":{\"cells\":{\"2\":{\"text\":\"农牧耕田(亩)\",\"style\":100},\"4\":{\"text\":\"农牧耕田(亩)\",\"style\":57}},\"height\":15},\"12\":{\"cells\":{\"1\":{\"text\":\"龙头企业\",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":77,\"merge\":[0,2]},\"2\":{\"style\":77},\"3\":{\"style\":77},\"4\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52},\"5\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52},\"6\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52},\"7\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52},\"8\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52},\"9\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52},\"10\":{\"text\":\" \",\"virtual\":\"7LFlMOg9juRt33q7\",\"style\":52}},\"height\":63},\"13\":{\"cells\":{\"1\":{\"style\":116,\"text\":\"排名\",\"merge\":[1,0]},\"2\":{\"style\":116,\"merge\":[1,1],\"text\":\"客户姓名\"},\"3\":{\"style\":117},\"4\":{\"style\":116,\"merge\":[1,1],\"text\":\"放款时间(min)\"},\"5\":{\"style\":116},\"6\":{\"style\":116,\"merge\":[1,1],\"text\":\"担保方式\"},\"7\":{\"style\":116},\"8\":{\"style\":116,\"merge\":[1,0],\"text\":\"放款金额\"},\"9\":{\"style\":116,\"merge\":[1,0],\"text\":\"法人机构\"},\"10\":{\"style\":116,\"merge\":[1,0],\"text\":\"客户经理\"},\"11\":{\"text\":\" \",\"virtual\":\"cvVQrHsdQLGGQu9k\"},\"12\":{\"text\":\" \",\"virtual\":\"cvVQrHsdQLGGQu9k\"},\"13\":{\"text\":\" \",\"virtual\":\"cvVQrHsdQLGGQu9k\"},\"14\":{\"text\":\" \",\"virtual\":\"cvVQrHsdQLGGQu9k\"}},\"height\":15},\"14\":{\"cells\":{\"1\":{\"style\":117},\"2\":{\"style\":117},\"3\":{\"style\":117},\"4\":{\"style\":116},\"5\":{\"style\":116},\"6\":{\"style\":116},\"7\":{\"style\":116},\"8\":{\"style\":116},\"9\":{\"style\":116},\"10\":{\"style\":116}},\"height\":22},\"15\":{\"cells\":{\"1\":{\"style\":118,\"text\":\"#{table2.name}\"},\"2\":{\"style\":118,\"merge\":[0,1],\"text\":\"#{table2.name}\"},\"3\":{\"style\":118},\"4\":{\"style\":118,\"merge\":[0,1],\"text\":\"#{table2.sj}\"},\"5\":{\"style\":118},\"6\":{\"style\":118,\"merge\":[0,1],\"text\":\"#{table2.type}\"},\"7\":{\"style\":118},\"8\":{\"style\":118,\"text\":\"#{table2.je}\"},\"9\":{\"style\":118,\"text\":\"#{table2.jg}\"},\"10\":{\"style\":118,\"text\":\"#{table2.jl}\"}},\"height\":19},\"16\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":20},\"17\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":22},\"18\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":21},\"19\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":20},\"20\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":20},\"21\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":21},\"22\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":20},\"23\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":19},\"24\":{\"cells\":{\"1\":{\"style\":93},\"2\":{\"style\":93},\"3\":{\"style\":93},\"4\":{\"style\":93},\"5\":{\"style\":93},\"6\":{\"style\":93},\"7\":{\"style\":93},\"8\":{\"style\":93},\"9\":{\"style\":93},\"10\":{\"style\":93}},\"height\":22},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1504,\"background\":{\"path\":\"https://static.jero.com/designreport/images/57_1610364468144.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18}},{\"font\":{\"size\":18}},{\"color\":\"#ffffff\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":14}},{\"font\":{\"size\":14}},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"font\":{\"size\":8}},{\"color\":\"#ffffff\",\"font\":{\"size\":8},\"valign\":\"top\"},{\"valign\":\"top\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"valign\":\"middle\"},{\"valign\":\"middle\"},{\"color\":\"#ffffff\",\"font\":{\"size\":16},\"valign\":\"middle\"},{\"valign\":\"middle\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"valign\":\"middle\"},{\"valign\":\"middle\",\"font\":{\"size\":18}},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"font\":{\"size\":18}},{\"color\":\"#14EBA7\"},{\"color\":\"#14EBA7\",\"font\":{\"size\":16}},{\"color\":\"#14EBA7\",\"font\":{\"size\":16,\"bold\":true}},{\"color\":\"#14EBA7\",\"font\":{\"size\":16,\"bold\":true},\"bgcolor\":\"#0A2B34\"},{\"bgcolor\":\"#0A2B34\"},{\"color\":\"#ffffff\",\"font\":{\"size\":16},\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22},\"valign\":\"bottom\"},{\"color\":\"#e\"},{\"color\":\"#e\'e\"},{\"color\":\"#e\'e\'e\"},{\"color\":\"#eee\"},{\"color\":\"#eee\",\"font\":{\"size\":9}},{\"color\":\"#eee\",\"font\":{\"size\":8}},{\"color\":\"#0a0a0a\"},{\"color\":\"#0a0a0\"},{\"color\":\"#0a0a\"},{\"color\":\"#0a0\"},{\"color\":\"#0a\"},{\"color\":\"#0\"},{\"color\":\"#\"},{\"color\":\"#e\'e\'e\'e\"},{\"color\":\"#e\'e\'e\'e\'e\"},{\"color\":\"#e\'e\'e\'e\'e\'e\"},{\"color\":\"#eeeeee\"},{\"bgcolor\":\"#\"},{\"bgcolor\":\"#e\"},{\"bgcolor\":\"#e\'e\"},{\"bgcolor\":\"#e\'e\'e\"},{\"bgcolor\":\"#e\'e\'e\'e\"},{\"bgcolor\":\"#e\'e\'e\'e\'e\"},{\"bgcolor\":\"#e\'e\'e\'e\'e\'e\"},{\"bgcolor\":\"#eeeeee\"},{\"bgcolor\":\"\"},{\"bgcolor\":\"\",\"color\":\"#\"},{\"bgcolor\":\"\",\"color\":\"#e\"},{\"bgcolor\":\"\",\"color\":\"#e\'e\"},{\"bgcolor\":\"\",\"color\":\"#e\'e\'e\"},{\"bgcolor\":\"\",\"color\":\"#eee\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"bgcolor\":\"#0A2B34\"},{\"color\":\"#eeeeee\",\"bgcolor\":\"#0A2B34\"},{\"color\":\"#eee\",\"bgcolor\":\"#0A2B34\"},{\"color\":\"#eee\",\"font\":{\"size\":9},\"bgcolor\":\"#0A2B34\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"valign\":\"bottom\",\"bgcolor\":\"#0A2B34\"},{\"color\":\"#0A2B34\",\"font\":{\"size\":18}},{\"bgcolor\":\"#0A2B34\",\"font\":{\"size\":18}},{\"bgcolor\":\"#0A2B34\",\"font\":{\"size\":16}},{\"bgcolor\":\"#0A2B34\",\"font\":{\"size\":16},\"color\":\"#14EBA7\"},{\"color\":\"#14EBA7\",\"font\":{\"size\":16,\"bold\":false},\"bgcolor\":\"#0A2B34\"},{\"bgcolor\":\"#0A2B34\",\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"bgcolor\":\"#0A2B34\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#0A2B34\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#0A2B34\",\"align\":\"center\"},{\"align\":\"center\"},{\"bgcolor\":\"客户姓名\"},{\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"\",\"font\":{\"size\":16},\"color\":\"#14EBA7\"},{\"bgcolor\":\"#0A2B34\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"bgcolor\":\"#0A2B34\",\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"valign\":\"bottom\",\"align\":\"center\"},{\"bgcolor\":\"#0A2B34\",\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"bgcolor\":\"#0A2B34\",\"valign\":\"bottom\"},{\"bgcolor\":\"1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"bgcolor\":\"1e2f37\"},{\"bgcolor\":\"1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"1e2f37\"},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"bgcolor\":\"#1e2f37\"},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#1e2f37\"},{\"color\":\"#ffff01\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"valign\":\"bottom\",\"bgcolor\":\"#0A2B34\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"bgcolor\":\"#0A2B34\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"valign\":\"bottom\",\"bgcolor\":\"\"},{\"color\":\"#eee\",\"font\":{\"size\":9},\"bgcolor\":\"\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"bgcolor\":\"\"},{\"color\":\"#eeeeee\",\"bgcolor\":\"\"},{\"color\":\"#14EBA7\",\"font\":{\"size\":16,\"bold\":false},\"bgcolor\":\"\"},{\"bgcolor\":\"\",\"font\":{\"bold\":false}},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"size\":12}},{\"valign\":\"bottom\",\"bgcolor\":\"#1e2f37\",\"font\":{\"size\":12}},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"size\":12,\"bold\":true}},{\"valign\":\"bottom\",\"bgcolor\":\"#1e2f37\",\"font\":{\"size\":12,\"bold\":true}},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"size\":14}},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"valign\":\"bottom\",\"bgcolor\":\"\",\"align\":\"center\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"valign\":\"bottom\",\"bgcolor\":\"\",\"align\":\"left\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"valign\":\"top\",\"bgcolor\":\"\",\"align\":\"left\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"valign\":\"middle\",\"bgcolor\":\"\",\"align\":\"left\"},{\"color\":\"#ffff01\",\"font\":{\"size\":18},\"bgcolor\":\"\",\"valign\":\"middle\"},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"size\":12,\"bold\":false}},{\"valign\":\"bottom\",\"bgcolor\":\"#1e2f37\",\"font\":{\"size\":12,\"bold\":false}},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"size\":10,\"bold\":false}},{\"valign\":\"bottom\",\"bgcolor\":\"#1e2f37\",\"font\":{\"size\":10,\"bold\":false}},{\"bgcolor\":\"#1e2f37\",\"color\":\"#ffffff\",\"align\":\"center\",\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"1\":{\"width\":63},\"2\":{\"width\":118},\"3\":{\"width\":61},\"4\":{\"width\":129},\"5\":{\"width\":75},\"13\":{\"width\":158},\"len\":27},\"merges\":[\"B2:E2\",\"B1:J1\",\"B3:E4\",\"B13:D13\",\"B14:B15\",\"C14:D15\",\"E14:F15\",\"G14:H15\",\"I14:I15\",\"J14:J15\",\"K14:K15\",\"C16:D16\",\"E16:F16\",\"G16:H16\"],\"imgList\":[{\"row\":4,\"col\":3,\"width\":\"71\",\"height\":\"68\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364690452.jpg\",\"layer_id\":\"sWakDse7OZ6sTEA0\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,3],[4,4]]},{\"row\":4,\"col\":1,\"width\":\"71\",\"height\":\"68\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364695319.jpg\",\"layer_id\":\"XnSfPgo35Nv22Thw\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,1],[4,2]]},{\"row\":6,\"col\":3,\"width\":\"71\",\"height\":\"68\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364684292.jpg\",\"layer_id\":\"XcOdLHt5nq0gnV2s\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[6,3],[6,4]]},{\"row\":6,\"col\":1,\"width\":\"71\",\"height\":\"68\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364700977.jpg\",\"layer_id\":\"B3anFjJ1WjdaI4dL\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[6,1],[6,2]]},{\"row\":8,\"col\":3,\"width\":\"60\",\"height\":\"60\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364670434.jpg\",\"layer_id\":\"o4GJy5VBXOEAxVf5\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[8,3]]},{\"row\":8,\"col\":1,\"width\":\"71\",\"height\":\"68\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364705821.jpg\",\"layer_id\":\"DCJWFRnncFjlkJhg\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[8,1],[8,2]]},{\"row\":10,\"col\":3,\"width\":\"63\",\"height\":\"58\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364642097.jpg\",\"layer_id\":\"QXdIZ7w5vyCKDLjv\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[10,3],[10,4]]},{\"row\":10,\"col\":1,\"width\":\"71\",\"height\":\"68\",\"src\":\"https://static.jero.com/designreport/images/64320_1610364710787.jpg\",\"layer_id\":\"TrmeCgSZwslKMbfC\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[10,1],[10,2]]}]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201203163924_1606984776379.png', 'admin', '2020-12-02 17:58:59', 'admin', '2021-01-13 14:15:29', 0, NULL, NULL, 1, 503); +INSERT INTO `jimu_report` VALUES ('1334378897302753280', '20201203140834', '区域销售表', NULL, NULL, 'datainfo', '{\"area\":false,\"printElWidth\":1580,\"excel_config_id\":\"1334378897302753280\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"区域销售表\",\"merge\":[0,22],\"style\":10},\"2\":{\"style\":10},\"3\":{\"style\":10},\"4\":{\"style\":10},\"5\":{\"style\":10},\"6\":{\"style\":10},\"7\":{\"style\":10},\"8\":{\"style\":10},\"9\":{\"style\":10},\"10\":{\"style\":10},\"11\":{\"style\":10},\"12\":{\"style\":10},\"13\":{\"style\":10},\"14\":{\"style\":10},\"15\":{\"style\":10},\"16\":{\"style\":10},\"17\":{\"style\":10},\"18\":{\"style\":10},\"19\":{\"style\":10},\"20\":{\"style\":10},\"21\":{\"style\":10},\"22\":{\"style\":10},\"23\":{\"style\":10}},\"height\":72},\"1\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"text\":\"区域\",\"merge\":[1,0],\"style\":65},\"2\":{\"text\":\"省份\",\"merge\":[1,0],\"style\":65},\"3\":{\"text\":\"1月\",\"merge\":[0,2],\"style\":65},\"4\":{\"style\":66,\"text\":\" \"},\"5\":{\"style\":66,\"text\":\" \"},\"6\":{\"text\":\"2月\",\"merge\":[0,2],\"style\":65},\"7\":{\"style\":66,\"text\":\" \"},\"8\":{\"style\":66,\"text\":\" \"},\"9\":{\"text\":\"3月\",\"merge\":[0,2],\"style\":65},\"10\":{\"style\":66,\"text\":\" \"},\"11\":{\"style\":66,\"text\":\" \"},\"12\":{\"text\":\"4月\",\"merge\":[0,2],\"style\":65},\"13\":{\"style\":66,\"text\":\" \"},\"14\":{\"style\":66,\"text\":\" \"},\"15\":{\"text\":\"5月\",\"merge\":[0,2],\"style\":65},\"16\":{\"style\":66,\"text\":\" \"},\"17\":{\"style\":66,\"text\":\" \"},\"18\":{\"text\":\"6月\",\"merge\":[0,2],\"style\":65},\"19\":{\"style\":66,\"text\":\" \"},\"20\":{\"style\":66,\"text\":\" \"},\"21\":{\"text\":\"总合计\",\"merge\":[0,2],\"style\":65},\"22\":{\"style\":66,\"text\":\" \"},\"23\":{\"style\":66,\"text\":\" \"},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":22},\"2\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"style\":66,\"text\":\" \"},\"2\":{\"style\":65,\"text\":\" \"},\"3\":{\"text\":\"销售额\",\"style\":65},\"4\":{\"text\":\"搭赠\",\"style\":65},\"5\":{\"text\":\"比例\",\"style\":65},\"6\":{\"text\":\"销售额\",\"style\":65},\"7\":{\"text\":\"搭赠\",\"style\":65},\"8\":{\"text\":\"比例\",\"style\":65},\"9\":{\"text\":\"销售额\",\"style\":65},\"10\":{\"text\":\"搭赠\",\"style\":65},\"11\":{\"text\":\"比例\",\"style\":65},\"12\":{\"text\":\"销售额\",\"style\":65},\"13\":{\"text\":\"搭赠\",\"style\":65},\"14\":{\"text\":\"比例\",\"style\":65},\"15\":{\"text\":\"销售额\",\"style\":65},\"16\":{\"text\":\"搭赠\",\"style\":65},\"17\":{\"text\":\"比例\",\"style\":65},\"18\":{\"text\":\"销售额\",\"style\":65},\"19\":{\"text\":\"搭赠\",\"style\":65},\"20\":{\"text\":\"比例\",\"style\":65},\"21\":{\"text\":\"销售额\",\"style\":65},\"22\":{\"text\":\"搭赠\",\"style\":65},\"23\":{\"text\":\"比例\",\"style\":65},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":24},\"3\":{\"cells\":{\"0\":{\"style\":67},\"1\":{\"text\":\"#{quyuxiaoshou.group(region)}\",\"style\":52,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{quyuxiaoshou.province}\",\"style\":53},\"3\":{\"text\":\"#{quyuxiaoshou.sales_1}\",\"style\":17},\"4\":{\"text\":\"#{quyuxiaoshou.gift_1}\",\"style\":17},\"5\":{\"text\":\"#{quyuxiaoshou.proportion_1}\",\"style\":17},\"6\":{\"text\":\"#{quyuxiaoshou.sales_2}\",\"style\":17},\"7\":{\"text\":\"#{quyuxiaoshou.gift_2}\",\"style\":17},\"8\":{\"text\":\"#{quyuxiaoshou.proportion_2}\",\"style\":17},\"9\":{\"text\":\"#{quyuxiaoshou.sales_3}\",\"style\":17},\"10\":{\"text\":\"#{quyuxiaoshou.gift_3}\",\"style\":17},\"11\":{\"text\":\"#{quyuxiaoshou.proportion_3}\",\"style\":17},\"12\":{\"text\":\"#{quyuxiaoshou.sales_4}\",\"style\":17},\"13\":{\"text\":\"#{quyuxiaoshou.gift_4}\",\"style\":17},\"14\":{\"text\":\"#{quyuxiaoshou.proportion_4}\",\"style\":17},\"15\":{\"text\":\"#{quyuxiaoshou.sales_5}\",\"style\":17},\"16\":{\"text\":\"#{quyuxiaoshou.gift_5}\",\"style\":17},\"17\":{\"text\":\"#{quyuxiaoshou.proportion_5}\",\"style\":15},\"18\":{\"text\":\"#{quyuxiaoshou.sales_6}\",\"style\":15},\"19\":{\"text\":\"#{quyuxiaoshou.gift_6}\",\"style\":15},\"20\":{\"text\":\"#{quyuxiaoshou.proportion_6}\",\"style\":15},\"21\":{\"text\":\"#{quyuxiaoshou.sales_z}\",\"style\":15},\"22\":{\"text\":\"#{quyuxiaoshou.gift_z}\",\"style\":15},\"23\":{\"text\":\"#{quyuxiaoshou.proportion_z}\",\"style\":15},\"24\":{\"style\":67},\"25\":{\"style\":67}},\"isDrag\":true,\"height\":56},\"4\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"style\":39,\"text\":\"总计\",\"merge\":[0,1]},\"3\":{\"style\":68,\"text\":\"=SUM(D4)\"},\"4\":{\"style\":69,\"text\":\"=SUM(E4)\"},\"5\":{\"style\":70,\"text\":\"=SUM(F4)\"},\"6\":{\"style\":69,\"text\":\"=SUM(G4)\"},\"7\":{\"style\":69,\"text\":\"=SUM(H4)\"},\"8\":{\"style\":70,\"text\":\"=SUM(I4)\"},\"9\":{\"style\":69,\"text\":\"=SUM(J4)\"},\"10\":{\"style\":69,\"text\":\"=SUM(K4)\"},\"11\":{\"style\":70,\"text\":\"=SUM(L4)\"},\"12\":{\"style\":69,\"text\":\"=SUM(M4)\"},\"13\":{\"style\":69,\"text\":\"=SUM(N4)\"},\"14\":{\"style\":70,\"text\":\"=SUM(O4)\"},\"15\":{\"style\":69,\"text\":\"=SUM(P4)\"},\"16\":{\"style\":69,\"text\":\"=SUM(Q4)\"},\"17\":{\"style\":70,\"text\":\"=SUM(R4)\"},\"18\":{\"style\":69,\"text\":\"=SUM(S4)\"},\"19\":{\"style\":69,\"text\":\"=SUM(T4)\"},\"20\":{\"style\":70,\"text\":\"=SUM(U4)\"},\"21\":{\"style\":69,\"text\":\"=SUM(V4)\"},\"22\":{\"style\":69,\"text\":\"=SUM(W4)\"},\"23\":{\"style\":69,\"text\":\"=SUM(X4)\"},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":38},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"quyuxiaoshou.region\",\"freeze\":\"A1\",\"dataRectWidth\":1554,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"隶书\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"华文中宋\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"number\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10,\"name\":\"宋体\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10,\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10,\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":20},\"1\":{\"width\":84},\"2\":{\"width\":81},\"3\":{\"width\":75},\"4\":{\"width\":63},\"5\":{\"width\":59},\"6\":{\"width\":70},\"7\":{\"width\":57},\"8\":{\"width\":60},\"9\":{\"width\":75},\"10\":{\"width\":66},\"11\":{\"width\":64},\"12\":{\"width\":70},\"13\":{\"width\":61},\"14\":{\"width\":61},\"15\":{\"width\":70},\"16\":{\"width\":58},\"17\":{\"width\":63},\"18\":{\"width\":60},\"19\":{\"width\":63},\"20\":{\"width\":59},\"21\":{\"width\":73},\"22\":{\"width\":69},\"23\":{\"width\":73},\"len\":26},\"merges\":[\"B2:B3\",\"C2:C3\",\"D2:F2\",\"G2:I2\",\"J2:L2\",\"M2:O2\",\"P2:R2\",\"S2:U2\",\"V2:X2\",\"B1:X1\",\"B5:C5\"]}', NULL, 'https://static.jero.com/designreport/images/quyu_1607069899537.png', 'admin', '2020-12-03 14:08:34', 'admin', '2021-01-13 14:13:45', 0, NULL, NULL, 1, 432); +INSERT INTO `jimu_report` VALUES ('1334420681185566722', '202012031408346166', '学校经费一览表', NULL, NULL, 'datainfo', '{\"area\":{\"sri\":9,\"sci\":4,\"eri\":9,\"eci\":4,\"width\":63,\"height\":25},\"printElWidth\":1767,\"excel_config_id\":\"1334420681185566722\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"学校经费一览表\",\"merge\":[0,22],\"style\":10},\"2\":{\"style\":10},\"3\":{\"style\":10},\"4\":{\"style\":10},\"5\":{\"style\":10},\"6\":{\"style\":10},\"7\":{\"style\":10},\"8\":{\"style\":10},\"9\":{\"style\":10},\"10\":{\"style\":10},\"11\":{\"style\":10},\"12\":{\"style\":10},\"13\":{\"style\":10},\"14\":{\"style\":10},\"15\":{\"style\":10},\"16\":{\"style\":10},\"17\":{\"style\":10},\"18\":{\"style\":10},\"19\":{\"style\":10},\"20\":{\"style\":10},\"21\":{\"style\":10},\"22\":{\"style\":10},\"23\":{\"style\":10}},\"height\":72},\"1\":{\"cells\":{\"1\":{\"text\":\"学校类别\",\"style\":221,\"merge\":[4,0]},\"2\":{\"merge\":[4,0],\"style\":222,\"text\":\"学校名称\"},\"3\":{\"text\":\"财政教育经费投入(万元)\",\"merge\":[0,8],\"style\":84},\"4\":{\"style\":40,\"text\":\" \"},\"5\":{\"style\":40,\"text\":\" \"},\"6\":{\"style\":40,\"text\":\" \"},\"7\":{\"style\":40,\"text\":\" \"},\"8\":{\"style\":40,\"text\":\" \"},\"9\":{\"style\":40,\"text\":\" \"},\"10\":{\"style\":40,\"text\":\" \"},\"11\":{\"style\":40,\"text\":\" \"},\"12\":{\"text\":\"其他投入\",\"merge\":[0,7],\"style\":84},\"13\":{\"text\":\" \",\"style\":40},\"14\":{\"text\":\" \",\"style\":40},\"15\":{\"text\":\" \",\"style\":40},\"16\":{\"text\":\" \",\"style\":40},\"17\":{\"text\":\" \",\"style\":40},\"18\":{\"text\":\" \",\"style\":40},\"19\":{\"text\":\" \",\"style\":40},\"20\":{\"style\":84,\"text\":\"补充资料\",\"merge\":[0,4]},\"21\":{\"text\":\" \",\"style\":40},\"22\":{\"text\":\" \",\"style\":40},\"23\":{\"text\":\" \",\"style\":40},\"24\":{\"text\":\" \",\"style\":40}},\"height\":28},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"text\":\"总计\",\"style\":117,\"merge\":[3,0]},\"4\":{\"text\":\"教育事业费\",\"style\":117,\"merge\":[0,6]},\"5\":{\"style\":118,\"text\":\" \"},\"6\":{\"style\":118,\"text\":\" \"},\"7\":{\"style\":118,\"text\":\" \"},\"8\":{\"style\":118,\"text\":\" \"},\"9\":{\"style\":118,\"text\":\" \"},\"10\":{\"style\":118,\"text\":\" \"},\"11\":{\"text\":\"基础拨款\",\"style\":117,\"merge\":[3,0]},\"12\":{\"text\":\"村投入\",\"style\":117,\"merge\":[0,4]},\"13\":{\"text\":\" \",\"style\":223},\"14\":{\"text\":\" \",\"style\":223},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"text\":\" \",\"style\":223},\"17\":{\"text\":\"社会捐款\",\"style\":117,\"merge\":[0,2]},\"18\":{\"text\":\" \",\"style\":223},\"19\":{\"text\":\" \",\"style\":223},\"20\":{\"style\":126,\"merge\":[0,4],\"text\":\"信息化建设\"},\"21\":{\"style\":122,\"text\":\" \"},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"style\":122,\"text\":\" \"},\"24\":{\"style\":122,\"text\":\" \"}},\"height\":24},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"merge\":[0,1],\"text\":\"合计\",\"style\":121},\"5\":{\"style\":122,\"text\":\" \"},\"6\":{\"merge\":[2,0],\"text\":\"人员经费\",\"style\":121},\"7\":{\"merge\":[2,0],\"text\":\"日常公用费用\",\"style\":123},\"8\":{\"merge\":[0,2],\"text\":\"项目经费\",\"style\":121},\"9\":{\"style\":122,\"text\":\" \"},\"10\":{\"style\":122,\"text\":\" \"},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"merge\":[2,0],\"text\":\"合计\",\"style\":121},\"13\":{\"merge\":[0,3],\"text\":\"其中\",\"style\":121},\"14\":{\"text\":\" \",\"style\":223},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"text\":\" \",\"style\":223},\"17\":{\"merge\":[2,0],\"text\":\"合计\",\"style\":121},\"18\":{\"merge\":[0,1],\"text\":\"其中\",\"style\":121},\"19\":{\"style\":122,\"text\":\" \"},\"20\":{\"merge\":[2,0],\"text\":\"本年投入金额(万元)\",\"style\":230},\"21\":{\"merge\":[0,1],\"text\":\"电脑数(台数)\",\"style\":121},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"merge\":[0,1],\"text\":\"校园网数(个)\",\"style\":121},\"24\":{\"style\":122,\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"merge\":[1,0],\"text\":\"金额\",\"style\":126},\"5\":{\"merge\":[1,0],\"text\":\"比上年增长(%)\",\"style\":127},\"6\":{\"style\":122,\"text\":\" \"},\"7\":{\"style\":123,\"text\":\" \"},\"8\":{\"merge\":[1,0],\"text\":\"合计\",\"style\":121},\"9\":{\"merge\":[0,1],\"text\":\"其中\",\"style\":121},\"10\":{\"style\":122,\"text\":\" \"},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"style\":121,\"text\":\" \"},\"13\":{\"merge\":[1,0],\"text\":\"人员经费\",\"style\":131},\"14\":{\"merge\":[1,0],\"text\":\"日常公用费用\",\"style\":131},\"15\":{\"merge\":[1,0],\"text\":\"项目经费\",\"style\":131},\"16\":{\"merge\":[1,0],\"text\":\"基建投入\",\"style\":131},\"17\":{\"style\":121,\"text\":\" \"},\"18\":{\"merge\":[1,0],\"text\":\"项目经费\",\"style\":131},\"19\":{\"merge\":[1,0],\"text\":\"基础投入\",\"style\":131},\"20\":{\"style\":231,\"text\":\" \"},\"21\":{\"merge\":[1,0],\"text\":\"合计\",\"style\":121},\"22\":{\"merge\":[1,0],\"text\":\"本年购置数\",\"style\":121},\"23\":{\"style\":121,\"merge\":[1,0],\"text\":\"合计\"},\"24\":{\"merge\":[1,0],\"text\":\"本年建成数\",\"style\":121}}},\"5\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"style\":126,\"text\":\" \"},\"5\":{\"style\":129,\"text\":\" \"},\"6\":{\"style\":121,\"text\":\" \"},\"7\":{\"style\":130,\"text\":\" \"},\"8\":{\"style\":121,\"text\":\" \"},\"9\":{\"text\":\"标准化建设\",\"style\":131},\"10\":{\"text\":\"信息化建设\",\"style\":121},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"style\":121,\"text\":\" \"},\"13\":{\"text\":\" \",\"style\":223},\"14\":{\"style\":131,\"text\":\" \"},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"style\":131,\"text\":\" \"},\"17\":{\"style\":121,\"text\":\" \"},\"18\":{\"text\":\" \",\"style\":223},\"19\":{\"style\":131,\"text\":\" \"},\"20\":{\"style\":231,\"text\":\" \"},\"21\":{\"style\":121,\"text\":\" \"},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"style\":131,\"text\":\" \"},\"24\":{\"style\":122,\"text\":\" \"}}},\"6\":{\"cells\":{\"0\":{\"style\":236},\"1\":{\"text\":\"#{laiyuan.group(class)}\",\"style\":233,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{laiyuan.school}\",\"style\":234},\"3\":{\"style\":15,\"text\":\"=SUM(E7,I7)\"},\"4\":{\"style\":15,\"text\":\"=SUM(G7,H7)\"},\"5\":{\"text\":\"#{laiyuan.lv}\",\"style\":12},\"6\":{\"text\":\"#{laiyuan.renyuan_jy}\",\"style\":12},\"7\":{\"text\":\"#{laiyuan.richang_jy}\",\"style\":12},\"8\":{\"style\":12,\"text\":\"=SUM(J7,K7)\"},\"9\":{\"text\":\"#{laiyuan.biaozhun_jy}\",\"style\":12},\"10\":{\"text\":\"#{laiyuan.xinxi_jy}\",\"style\":12},\"11\":{\"text\":\"#{laiyuan.jichubokuan_jy}\",\"style\":12},\"12\":{\"style\":12,\"text\":\"=SUM(N7,O7)\"},\"13\":{\"text\":\"#{laiyuan.renyuan_ct}\",\"style\":12},\"14\":{\"text\":\"#{laiyuan.richang_ct}\",\"style\":12},\"15\":{\"text\":\"#{laiyuan.xiangmu_ct}\",\"style\":12},\"16\":{\"text\":\"#{laiyuan.jichubokuan_ct}\",\"style\":12},\"17\":{\"style\":12,\"text\":\"=SUM(S7,T7)\"},\"18\":{\"text\":\"#{laiyuan.xiangmu_sh}\",\"style\":12},\"19\":{\"text\":\"#{laiyuan.jichubokuan_sh}\",\"style\":12},\"20\":{\"style\":12,\"text\":\"=SUM(V7,X7)\"},\"21\":{\"style\":12,\"text\":\"#{laiyuan.diannao}\"},\"22\":{\"text\":\"#{laiyuan.diannao}\",\"style\":12},\"23\":{\"style\":12,\"text\":\"#{laiyuan.xiaoyuanwang}\"},\"24\":{\"text\":\"#{laiyuan.xiaoyuanwang}\",\"style\":12},\"25\":{\"style\":236}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"总计\",\"style\":226},\"2\":{\"style\":227,\"text\":\" \"},\"3\":{\"style\":228,\"text\":\"=SUM(D7)\"},\"4\":{\"style\":228,\"text\":\"=SUM(E7)\"},\"5\":{\"style\":228,\"text\":\"\"},\"6\":{\"style\":228,\"text\":\"=SUM(G7)\"},\"7\":{\"style\":228,\"text\":\"=SUM(H7)\"},\"8\":{\"style\":228,\"text\":\"=SUM(I7)\"},\"9\":{\"style\":228,\"text\":\"=SUM(J7)\"},\"10\":{\"style\":228,\"text\":\"=SUM(K7)\"},\"11\":{\"style\":228,\"text\":\"=SUM(L7)\"},\"12\":{\"style\":228,\"text\":\"=SUM(M7)\"},\"13\":{\"style\":229,\"text\":\"=SUM(N7)\"},\"14\":{\"style\":229,\"text\":\"=SUM(O7)\"},\"15\":{\"style\":229,\"text\":\"=SUM(P7)\"},\"16\":{\"style\":229,\"text\":\"=SUM(Q7)\"},\"17\":{\"style\":229,\"text\":\"=SUM(R7)\"},\"18\":{\"style\":229,\"text\":\"=SUM(S7)\"},\"19\":{\"style\":229,\"text\":\"=SUM(T7)\"},\"20\":{\"style\":229,\"text\":\"=SUM(U7)\"},\"21\":{\"style\":229,\"text\":\"=SUM(V8)\"},\"22\":{\"style\":229,\"text\":\"=SUM(W7)\"},\"23\":{\"style\":232,\"text\":\"=SUM(X7)\"},\"24\":{\"style\":229,\"text\":\"=SUM(Y7)\"}}},\"9\":{\"cells\":{\"4\":{\"lineStart\":\"leftbottom\",\"text\":\"\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"laiyuan.class\",\"freeze\":\"A1\",\"dataRectWidth\":1738,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"隶书\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"华文中宋\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"number\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#ffffff\"},{\"textwrap\":true},{\"textwrap\":true,\"font\":{\"size\":9}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"color\":\"#000100\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\",\"color\":\"#000100\"},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\"},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"color\":\"#000100\",\"bgcolor\":\"\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":10},\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"align\":\"center\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"bgcolor\":\"#\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"color\":\"#000100\",\"bgcolor\":\"#fffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#fffff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"textwrap\":true,\"bgcolor\":\"#fffff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"color\":\"#000100\",\"bgcolor\":\"#ffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#ffff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"textwrap\":true,\"bgcolor\":\"#ffff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"color\":\"#000100\",\"bgcolor\":\"#fff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#fff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"textwrap\":true,\"bgcolor\":\"#fff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"color\":\"#000100\",\"bgcolor\":\"#ff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#ff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"textwrap\":true,\"bgcolor\":\"#ff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"color\":\"#000100\",\"bgcolor\":\"#f\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#f\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"textwrap\":true,\"bgcolor\":\"#f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"color\":\"#000100\",\"bgcolor\":\"#\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"textwrap\":true,\"bgcolor\":\"#\"},{\"color\":\"#000100\",\"bgcolor\":\"#ddefe8\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"color\":\"#000100\",\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#fffff\"},{\"bgcolor\":\"#ffff\"},{\"bgcolor\":\"#fff\"},{\"bgcolor\":\"#ff\"},{\"bgcolor\":\"#f\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"aedac8\"},{\"align\":\"center\",\"bgcolor\":\"aedac8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":9}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"##aedac8\"},{\"bgcolor\":\"##aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"left\"},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"bold\":false,\"size\":10}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10},\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10},\"align\":\"left\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":8}}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":20},\"1\":{\"width\":84},\"2\":{\"width\":132},\"3\":{\"width\":75},\"4\":{\"width\":63},\"5\":{\"width\":59},\"6\":{\"width\":70},\"7\":{\"width\":61},\"8\":{\"width\":60},\"9\":{\"width\":75},\"10\":{\"width\":75},\"11\":{\"width\":64},\"12\":{\"width\":70},\"13\":{\"width\":63},\"14\":{\"width\":86},\"15\":{\"width\":64},\"16\":{\"width\":58},\"17\":{\"width\":63},\"18\":{\"width\":60},\"19\":{\"width\":63},\"20\":{\"width\":59},\"21\":{\"width\":73},\"22\":{\"width\":82},\"23\":{\"width\":73},\"24\":{\"width\":86},\"len\":26},\"merges\":[\"B1:X1\",\"D3:D6\",\"E5:E6\",\"F5:F6\",\"E4:F4\",\"G4:G6\",\"H4:H6\",\"I5:I6\",\"J5:K5\",\"I4:K4\",\"E3:K3\",\"L3:L6\",\"D2:L2\",\"M4:M6\",\"N5:N6\",\"O5:O6\",\"P5:P6\",\"Q5:Q6\",\"N4:Q4\",\"M3:Q3\",\"R4:R6\",\"R3:T3\",\"S4:T4\",\"S5:S6\",\"T5:T6\",\"U4:U6\",\"V4:W4\",\"V5:V6\",\"W5:W6\",\"X4:Y4\",\"X5:X6\",\"Y5:Y6\",\"U3:Y3\",\"M2:T2\",\"U2:Y2\",\"B2:B6\",\"C2:C6\",\"B8:C8\"]}', NULL, 'https://static.jero.com/designreport/images/jingfei_1607069843358.png', 'admin', '2020-12-03 16:54:17', 'admin', '2021-01-13 14:13:42', 0, NULL, NULL, 1, 426); +INSERT INTO `jimu_report` VALUES ('1334457419857793024', '20201203192154', '超市各地区销售额', NULL, NULL, 'datainfo', '{\"area\":false,\"printElWidth\":2500,\"excel_config_id\":\"1334457419857793024\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"各地区商品销售额一栏表\",\"merge\":[0,18],\"style\":13}},\"height\":82},\"1\":{\"cells\":{\"1\":{\"text\":\"地区/类别/时间\",\"merge\":[1,1],\"style\":46},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"text\":\"2020年\",\"style\":46,\"merge\":[0,12]},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"style\":39,\"text\":\" \"},\"6\":{\"style\":39,\"text\":\" \"},\"7\":{\"style\":39,\"text\":\" \"},\"8\":{\"style\":39,\"text\":\" \"},\"9\":{\"style\":39,\"text\":\" \"},\"10\":{\"style\":39,\"text\":\" \"},\"11\":{\"style\":39,\"text\":\" \"},\"12\":{\"style\":39,\"text\":\" \"},\"13\":{\"style\":39,\"text\":\" \"},\"14\":{\"style\":39,\"text\":\" \"},\"15\":{\"style\":39,\"text\":\" \"},\"16\":{\"text\":\"2019年\",\"style\":46,\"merge\":[0,9]},\"17\":{\"style\":39,\"text\":\" \"},\"18\":{\"style\":39,\"text\":\" \"},\"19\":{\"style\":39,\"text\":\" \"},\"20\":{\"style\":39,\"text\":\" \"},\"21\":{\"style\":39,\"text\":\" \"},\"22\":{\"style\":39,\"text\":\" \"},\"23\":{\"style\":39,\"text\":\" \"},\"24\":{\"style\":39,\"text\":\" \"},\"25\":{\"style\":39,\"text\":\" \"}}},\"2\":{\"cells\":{\"1\":{\"style\":39,\"text\":\" \"},\"2\":{\"style\":39,\"text\":\" \"},\"3\":{\"text\":\"12月\",\"style\":46},\"4\":{\"text\":\"11月\",\"style\":46},\"5\":{\"text\":\"10月\",\"style\":46},\"6\":{\"text\":\"9月\",\"style\":46},\"7\":{\"text\":\"8月\",\"style\":46},\"8\":{\"text\":\"7月\",\"style\":46},\"9\":{\"text\":\"6月\",\"style\":46},\"10\":{\"text\":\"5月\",\"style\":46},\"11\":{\"text\":\"4月\",\"style\":46},\"12\":{\"text\":\"3月\",\"style\":46},\"13\":{\"text\":\"2月\",\"style\":46},\"14\":{\"text\":\"1月\",\"style\":46},\"15\":{\"text\":\"本年小计\",\"style\":46},\"16\":{\"text\":\"12月\",\"style\":46},\"17\":{\"text\":\"11月\",\"style\":46},\"18\":{\"text\":\"10月\",\"style\":46},\"19\":{\"text\":\"9月\",\"style\":46},\"20\":{\"text\":\"8月\",\"style\":46},\"21\":{\"text\":\"7月\",\"style\":46},\"22\":{\"text\":\"6月\",\"style\":46},\"23\":{\"text\":\"5月\",\"style\":46},\"24\":{\"text\":\"4月\",\"style\":46},\"25\":{\"text\":\"本年小计\",\"style\":46},\"26\":{\"text\":\"2月\",\"style\":8},\"27\":{\"text\":\"1月\",\"style\":8},\"28\":{\"text\":\"本年小计\",\"style\":8}}},\"3\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.group(diqu)}\",\"style\":51,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{xiaoshou.class}\",\"style\":51},\"3\":{\"text\":\"#{xiaoshou.sales_11}\",\"style\":20},\"4\":{\"text\":\"#{xiaoshou.sales_12}\",\"style\":20},\"5\":{\"text\":\"#{xiaoshou.sales_13}\",\"style\":20},\"6\":{\"text\":\"#{xiaoshou.sales_14}\",\"style\":20},\"7\":{\"text\":\"#{xiaoshou.sales_15}\",\"style\":20},\"8\":{\"text\":\"#{xiaoshou.sales_16}\",\"style\":20},\"9\":{\"text\":\"#{xiaoshou.sales_17}\",\"style\":20},\"10\":{\"text\":\"#{xiaoshou.sales_18}\",\"style\":20},\"11\":{\"text\":\"#{xiaoshou.sales_19}\",\"style\":20},\"12\":{\"text\":\"#{xiaoshou.sales_20}\",\"style\":20},\"13\":{\"text\":\"#{xiaoshou.sales_21}\",\"style\":20},\"14\":{\"text\":\"#{xiaoshou.sales_22}\",\"style\":20},\"15\":{\"style\":48,\"text\":\"=SUM(D4:O4)\"},\"16\":{\"text\":\"#{xiaoshou.sales_31}\",\"style\":20},\"17\":{\"text\":\"#{xiaoshou.sales_32}\",\"style\":20},\"18\":{\"text\":\"#{xiaoshou.sales_33}\",\"style\":20},\"19\":{\"text\":\"#{xiaoshou.sales_34}\",\"style\":20},\"20\":{\"text\":\"#{xiaoshou.sales_35}\",\"style\":20},\"21\":{\"text\":\"#{xiaoshou.sales_36}\",\"style\":20},\"22\":{\"text\":\"#{xiaoshou.sales_37}\",\"style\":20},\"23\":{\"text\":\"#{xiaoshou.sales_38}\",\"style\":20},\"24\":{\"text\":\"#{xiaoshou.sales_39}\",\"style\":20},\"25\":{\"style\":48,\"text\":\"=SUM(Q4:Y4)\"},\"26\":{\"style\":10,\"text\":\" \"},\"27\":{\"style\":10},\"28\":{\"style\":10}},\"isDrag\":true},\"4\":{\"cells\":{\"0\":{\"style\":3},\"1\":{\"merge\":[0,1],\"text\":\"合计\",\"style\":52},\"2\":{\"style\":52},\"3\":{\"text\":\"=SUM(D4)\",\"style\":55},\"4\":{\"text\":\"=SUM(E4)\",\"style\":55},\"5\":{\"text\":\"=SUM(F4)\",\"style\":55},\"6\":{\"text\":\"=SUM(G4)\",\"style\":55},\"7\":{\"text\":\"=SUM(H4)\",\"style\":55},\"8\":{\"text\":\"=SUM(I4)\",\"style\":55},\"9\":{\"text\":\"=SUM(J4)\",\"style\":55},\"10\":{\"text\":\"=SUM(K4)\",\"style\":55},\"11\":{\"text\":\"=SUM(L4)\",\"style\":55},\"12\":{\"text\":\"=SUM(M4)\",\"style\":55},\"13\":{\"text\":\"=SUM(N4)\",\"style\":55},\"14\":{\"text\":\"=SUM(O4)\",\"style\":55},\"15\":{\"text\":\"=SUM(P4)\",\"style\":55},\"16\":{\"text\":\"=SUM(Q4)\",\"style\":55},\"17\":{\"text\":\"=SUM(R4)\",\"style\":55},\"18\":{\"text\":\"=SUM(S4)\",\"style\":55},\"19\":{\"text\":\"=SUM(T4)\",\"style\":55},\"20\":{\"text\":\"=SUM(U4)\",\"style\":55},\"21\":{\"text\":\"=SUM(V4)\",\"style\":55},\"22\":{\"text\":\"=SUM(W4)\",\"style\":55},\"23\":{\"text\":\"=SUM(X4)\",\"style\":55},\"24\":{\"text\":\"=SUM(Y4)\",\"style\":55},\"25\":{\"text\":\"=SUM(Z4)\",\"style\":55}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"xiaoshou.diqu\",\"freeze\":\"A1\",\"dataRectWidth\":2764,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#\"},{\"bgcolor\":\"#d7f2f9\"},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\"},{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":16},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"color\":\"#ffffff\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\",\"bgcolor\":\"#deeaf6\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\",\"bgcolor\":\"#bdd7ee\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\"},{\"bgcolor\":\"#bdd7ee\"},{\"bgcolor\":\"#bdd7ee\",\"format\":\"number\"},{\"bgcolor\":\"#bdd7ee\",\"format\":\"number\",\"align\":\"center\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":21},\"1\":{\"width\":63},\"2\":{\"width\":85},\"3\":{\"width\":95},\"4\":{\"width\":83},\"5\":{\"width\":81},\"6\":{\"width\":88},\"7\":{\"width\":89},\"8\":{\"width\":87},\"9\":{\"width\":95},\"10\":{\"width\":92},\"11\":{\"width\":95},\"12\":{\"width\":96},\"13\":{\"width\":98},\"14\":{\"width\":98},\"15\":{\"width\":78},\"16\":{\"width\":110},\"17\":{\"width\":111},\"18\":{\"width\":102},\"19\":{\"width\":102},\"20\":{\"width\":114},\"21\":{\"width\":111},\"22\":{\"width\":113},\"23\":{\"width\":107},\"24\":{\"width\":115},\"25\":{\"width\":135},\"len\":26},\"merges\":[\"D2:P2\",\"B2:C3\",\"Q2:Z2\",\"B1:T1\",\"B5:C5\"]}', NULL, 'https://static.jero.com/designreport/images/chaoshi_1607069609875.png', 'admin', '2020-12-03 19:21:55', 'admin', '2021-01-13 14:13:37', 0, NULL, NULL, 1, 359); +INSERT INTO `jimu_report` VALUES ('1334696790477377536', '20201204111149', '学校收入一览表', NULL, NULL, 'datainfo', '{\"area\":{\"sri\":5,\"sci\":22,\"eri\":5,\"eci\":22,\"width\":81,\"height\":25},\"printElWidth\":1902,\"excel_config_id\":\"1334696790477377536\",\"printElHeight\":1114,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"学校收入一览表\",\"merge\":[0,13],\"style\":25},\"2\":{\"style\":25},\"3\":{\"style\":25},\"4\":{\"style\":25},\"5\":{\"style\":25},\"6\":{\"style\":25},\"7\":{\"style\":25},\"8\":{\"style\":25},\"9\":{\"style\":25},\"10\":{\"style\":25},\"11\":{\"style\":25},\"12\":{\"style\":25},\"13\":{\"style\":25},\"14\":{\"style\":25}},\"height\":71},\"1\":{\"cells\":{\"1\":{\"text\":\"校园信息\",\"merge\":[1,2],\"style\":40},\"2\":{\"style\":41},\"3\":{\"style\":41},\"4\":{\"text\":\"学生信息\",\"merge\":[1,2],\"style\":40},\"5\":{\"style\":41},\"6\":{\"style\":41},\"7\":{\"merge\":[1,5],\"style\":42,\"text\":\"收款信息\"},\"8\":{\"style\":41},\"9\":{\"style\":41},\"10\":{\"style\":41},\"11\":{\"style\":41},\"12\":{\"style\":41},\"13\":{\"merge\":[0,10],\"text\":\"确认收入信息\",\"style\":43},\"14\":{\"style\":43},\"15\":{\"style\":43},\"16\":{\"style\":43},\"17\":{\"style\":43},\"18\":{\"style\":43},\"19\":{\"style\":43},\"20\":{\"style\":43},\"21\":{\"style\":43},\"22\":{\"style\":43},\"23\":{\"style\":43}},\"height\":23},\"2\":{\"cells\":{\"1\":{\"style\":41},\"2\":{\"style\":41},\"3\":{\"style\":41},\"4\":{\"style\":41},\"5\":{\"style\":41},\"6\":{\"style\":41},\"7\":{\"style\":41},\"8\":{\"style\":41},\"9\":{\"style\":41},\"10\":{\"style\":41},\"11\":{\"style\":41},\"12\":{\"style\":41},\"13\":{\"merge\":[0,3],\"text\":\"2020.09\",\"style\":46},\"14\":{\"style\":47,\"text\":\" \"},\"15\":{\"style\":47,\"text\":\" \"},\"16\":{\"style\":47,\"text\":\" \"},\"17\":{\"merge\":[0,3],\"text\":\"2020.10\",\"style\":46},\"18\":{\"style\":47,\"text\":\" \"},\"19\":{\"style\":47,\"text\":\" \"},\"20\":{\"style\":47,\"text\":\" \"},\"21\":{\"text\":\"合计\",\"style\":46,\"merge\":[0,2]},\"22\":{\"text\":\" \",\"style\":41},\"23\":{\"text\":\" \",\"style\":41},\"24\":{\"style\":19}},\"height\":40},\"3\":{\"cells\":{\"0\":{\"style\":49},\"1\":{\"text\":\"所属城际\",\"style\":50},\"2\":{\"text\":\"所属校园\",\"style\":50},\"3\":{\"text\":\"NC帐套\",\"style\":50},\"4\":{\"text\":\"学号\",\"style\":50},\"5\":{\"text\":\"姓名\",\"style\":50},\"6\":{\"text\":\"性质\",\"style\":50},\"7\":{\"text\":\"缴费金额\",\"style\":50},\"8\":{\"text\":\"缴费时间\",\"style\":50},\"9\":{\"text\":\"缴费性质\",\"style\":50},\"10\":{\"text\":\"缴费所属期间\",\"style\":50},\"11\":{\"text\":\"缴费月份数\",\"style\":50},\"12\":{\"text\":\"缴费方式\",\"style\":50},\"13\":{\"text\":\"全部\",\"style\":50},\"14\":{\"text\":\"学费\",\"style\":50},\"15\":{\"text\":\"餐费\",\"style\":50},\"16\":{\"text\":\"校车费\",\"style\":50},\"17\":{\"text\":\"全部\",\"style\":50},\"18\":{\"text\":\"学费\",\"style\":50},\"19\":{\"text\":\"餐费\",\"style\":50},\"20\":{\"text\":\"校车费\",\"style\":50},\"21\":{\"text\":\"全部\",\"style\":50},\"22\":{\"text\":\"学费\",\"style\":50},\"23\":{\"text\":\"餐费\",\"style\":50},\"24\":{\"text\":\"校车费\",\"style\":9}}},\"4\":{\"cells\":{\"0\":{\"style\":32},\"1\":{\"text\":\"#{shouru.group(city)}\",\"style\":45,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{shouru.group(school)}\",\"style\":45,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{shouru.group(ncnum)}\",\"style\":35,\"aggregate\":\"group\"},\"4\":{\"text\":\"#{shouru.num}\",\"style\":35},\"5\":{\"text\":\"#{shouru.name}\",\"style\":35},\"6\":{\"text\":\"#{shouru.class}\",\"style\":35},\"7\":{\"text\":\"#{shouru.pay}\",\"style\":35},\"8\":{\"text\":\"#{shouru.paytime}\",\"style\":35},\"9\":{\"text\":\"#{shouru.payclass}\",\"style\":35},\"10\":{\"text\":\"#{shouru.pay1}\",\"style\":35},\"11\":{\"text\":\"#{shouru.paymoth}\",\"style\":35},\"12\":{\"text\":\"#{shouru.pay2}\",\"style\":35},\"13\":{\"style\":33,\"text\":\"=SUM(O5:Q5)\"},\"14\":{\"text\":\"#{shouru.tuition_09}\",\"style\":35},\"15\":{\"text\":\"#{shouru.meals_09}\",\"style\":35},\"16\":{\"text\":\"#{shouru.busfee_09}\",\"style\":35},\"17\":{\"style\":33,\"text\":\"=SUM(S5:U5)\"},\"18\":{\"text\":\"#{shouru.tuition_10}\",\"style\":35},\"19\":{\"text\":\"#{shouru.meals_10}\",\"style\":35},\"20\":{\"text\":\"#{shouru.busfee_10}\",\"style\":35},\"21\":{\"style\":33,\"text\":\"=SUM(W5,X5)\"},\"22\":{\"style\":35,\"text\":\"=SUM(O5,S5)\"},\"23\":{\"style\":35,\"text\":\"=SUM(P5,T5)\"}},\"isDrag\":true,\"height\":25},\"5\":{\"cells\":{\"1\":{\"style\":66,\"text\":\"合计\"},\"2\":{\"text\":\" \",\"style\":66},\"3\":{\"style\":66,\"text\":\" \"},\"4\":{\"style\":66,\"text\":\" \"},\"5\":{\"style\":66,\"text\":\" \"},\"6\":{\"style\":66,\"text\":\" \"},\"7\":{\"style\":66,\"text\":\" \"},\"8\":{\"style\":66,\"text\":\" \"},\"9\":{\"style\":66,\"text\":\" \"},\"10\":{\"style\":66,\"text\":\" \"},\"11\":{\"style\":66,\"text\":\" \"},\"12\":{\"style\":66,\"text\":\" \"},\"13\":{\"style\":66,\"text\":\" \"},\"14\":{\"style\":66,\"text\":\" \"},\"15\":{\"style\":66,\"text\":\" \"},\"16\":{\"style\":66,\"text\":\" \"},\"17\":{\"style\":66,\"text\":\" \"},\"18\":{\"text\":\" \",\"style\":66},\"19\":{\"style\":66,\"text\":\" \"},\"20\":{\"style\":66,\"text\":\" \"},\"21\":{\"style\":15,\"text\":\"=SUM(V5)\"},\"22\":{\"style\":15,\"text\":\"=SUM(W5)\"},\"23\":{\"style\":15,\"text\":\"=SUM(X5)\"}}},\"9\":{\"cells\":{\"8\":{\"style\":22}}},\"11\":{\"cells\":{\"6\":{\"style\":3}}},\"len\":101},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A3\",\"widthPx\":1123,\"heightPx\":1512},\"dicts\":[],\"groupField\":\"shouru.city\",\"freeze\":\"A1\",\"dataRectWidth\":1981,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\"},{\"bgcolor\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\"},{\"bgcolor\":\"\"},{\"bgcolor\":\"#309fc6\"},{\"align\":\"center\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#dff2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"¥b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":10}},{\"font\":{\"size\":12}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":12}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":12}},{\"font\":{\"size\":10.5}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10.5},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":10.5}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":10.5},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":10.5}},{\"align\":\"left\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"left\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":37},\"1\":{\"width\":79},\"2\":{\"width\":87},\"3\":{\"width\":79},\"4\":{\"width\":92},\"5\":{\"width\":90},\"6\":{\"width\":77},\"7\":{\"width\":83},\"8\":{\"width\":89},\"9\":{\"width\":79},\"10\":{\"width\":89},\"11\":{\"width\":84},\"12\":{\"width\":76},\"13\":{\"width\":67},\"14\":{\"width\":74},\"15\":{\"width\":69},\"16\":{\"width\":74},\"17\":{\"width\":68},\"18\":{\"width\":76},\"19\":{\"width\":79},\"20\":{\"width\":78},\"21\":{\"width\":74},\"22\":{\"width\":81},\"len\":24},\"merges\":[\"B2:D3\",\"E2:G3\",\"H2:M3\",\"N3:Q3\",\"R3:U3\",\"V3:X3\",\"N2:X2\",\"B1:O1\"]}', NULL, 'https://static.jero.com/designreport/images/xuexiao_1607069724407.png', 'admin', '2020-12-04 11:11:50', 'admin', '2021-01-13 14:13:31', 0, NULL, NULL, 1, 419); +INSERT INTO `jimu_report` VALUES ('1334757703079301120', '20201204151358', '车间零件完工一览表', NULL, NULL, 'datainfo', '{\"area\":false,\"printElWidth\":1529,\"excel_config_id\":\"1334757703079301120\",\"printElHeight\":923,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"车间零件完工一览表\",\"merge\":[0,12],\"style\":23}},\"height\":81},\"1\":{\"cells\":{\"0\":{\"style\":11},\"1\":{\"text\":\"车间\",\"style\":22},\"2\":{\"text\":\"成品名称\",\"style\":22},\"3\":{\"text\":\"半成品名称\",\"style\":22},\"4\":{\"text\":\"完工时间\",\"style\":22},\"5\":{\"text\":\"状态\",\"style\":22},\"6\":{\"text\":\"成品属性\",\"style\":22},\"7\":{\"text\":\"工单号\",\"style\":22},\"8\":{\"text\":\"工单数量\",\"style\":22},\"9\":{\"text\":\"计划数量\",\"style\":22},\"10\":{\"text\":\"完成数量\",\"style\":22},\"11\":{\"text\":\"UPH\",\"style\":22},\"12\":{\"text\":\"H/C\",\"style\":22},\"13\":{\"text\":\"计划时间\",\"style\":22},\"14\":{\"text\":\"良率\",\"style\":22},\"15\":{\"text\":\"备注\",\"style\":22},\"16\":{\"style\":11},\"17\":{\"style\":11},\"18\":{\"style\":11},\"19\":{\"style\":11},\"20\":{\"style\":11},\"21\":{\"style\":11},\"22\":{\"style\":11},\"23\":{\"style\":11},\"24\":{\"style\":11},\"25\":{\"style\":11},\"26\":{\"style\":11}},\"height\":55},\"2\":{\"cells\":{\"0\":{\"style\":13},\"1\":{\"text\":\"#{chejian.group(city)}\",\"style\":16,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{chejian.finish}\",\"style\":14},\"3\":{\"text\":\"#{chejian.semifinish}\",\"style\":14},\"4\":{\"text\":\"#{chejian.time}\",\"style\":14},\"5\":{\"text\":\"#{chejian.state}\",\"style\":14},\"6\":{\"text\":\"#{chejian.attribute}\",\"style\":14},\"7\":{\"text\":\"#{chejian.num}\",\"style\":14},\"8\":{\"text\":\"#{chejian.gnum}\",\"style\":14},\"9\":{\"text\":\"#{chejian.jnum}\",\"style\":14},\"10\":{\"text\":\"#{chejian.wnum}\",\"style\":14},\"11\":{\"text\":\"#{chejian.uph}\",\"style\":14},\"12\":{\"text\":\"#{chejian.hc}\",\"style\":14},\"13\":{\"text\":\"#{chejian.jtime}\",\"style\":14},\"14\":{\"text\":\"#{chejian.yield}\",\"style\":14},\"15\":{\"text\":\"#{chejian.beizhu}\",\"style\":14},\"16\":{\"style\":13},\"17\":{\"style\":13},\"18\":{\"style\":13},\"19\":{\"style\":13},\"20\":{\"style\":13},\"21\":{\"style\":13},\"22\":{\"style\":13},\"23\":{\"style\":13},\"24\":{\"style\":13},\"25\":{\"style\":13},\"26\":{\"style\":13}},\"isDrag\":true,\"height\":35},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"chejian.city\",\"freeze\":\"A1\",\"dataRectWidth\":1494,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#309fc6\"},{\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"bold\":true,\"size\":16},\"align\":\"center\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":45},\"1\":{\"width\":106},\"2\":{\"width\":121},\"3\":{\"width\":124},\"4\":{\"width\":87},\"5\":{\"width\":76},\"6\":{\"width\":82},\"7\":{\"width\":81},\"8\":{\"width\":69},\"9\":{\"width\":76},\"10\":{\"width\":81},\"15\":{\"width\":146},\"len\":27},\"merges\":[\"B1:N1\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201216185352_1608116050060.png', 'admin', '2020-12-04 15:13:58', 'admin', '2021-01-13 14:13:28', 0, NULL, NULL, 1, 508); +INSERT INTO `jimu_report` VALUES ('1337271712059887616', '20201211134332', '山东智慧旅游大屏', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":1,\"col\":11,\"width\":\"297\",\"height\":\"323\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"河北\\\",\\\"北京\\\",\\\"上海\\\",\\\"山东\\\",\\\"深圳\\\",\\\"黑龙江\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"data\\\":[{\\\"name\\\":\\\"河北\\\",\\\"value\\\":\\\"1500\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(99,198,213,1)\\\"}},{\\\"name\\\":\\\"北京\\\",\\\"value\\\":\\\"3700\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(249,190,165,1)\\\"}},{\\\"name\\\":\\\"上海\\\",\\\"value\\\":\\\"1000\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(254,231,105,1)\\\"}},{\\\"name\\\":\\\"山东\\\",\\\"value\\\":\\\"450\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(100,122,185,1)\\\"}},{\\\"name\\\":\\\"深圳\\\",\\\"value\\\":\\\"5000\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(116,166,198,1)\\\"}},{\\\"name\\\":\\\"黑龙江\\\",\\\"value\\\":\\\"3600\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(243,137,130,1)\\\"}}],\\\"bottom\\\":60,\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"minAngle\\\":\\\"10\\\",\\\"right\\\":\\\"10%\\\",\\\"label\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"autoSort\\\":false,\\\"isRose\\\":false,\\\"top\\\":60,\\\"left\\\":\\\"10%\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"radius\\\":[\\\"40%\\\",\\\"49%\\\"]}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"游客来源分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FAF6F6\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608012847874.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338678877395881985\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"laiyuan1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"pie.simple\",\"chartId\":\"pie.rose\"},\"layer_id\":\"i5HQTS1CQ2VH6nEQ\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,11],[1,12],[1,13],[1,14]]},{\"row\":1,\"col\":1,\"width\":\"365\",\"height\":\"155\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"杭州\\\",\\\"南京\\\",\\\"苏州\\\",\\\"武汉\\\",\\\"南昌\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":40,\\\"left\\\":44,\\\"bottom\\\":25,\\\"right\\\":10},\\\"series\\\":[{\\\"barWidth\\\":10,\\\"data\\\":[\\\"888\\\",\\\"765\\\",\\\"698\\\",\\\"436\\\",\\\"415\\\"],\\\"name\\\":\\\"数量\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":5,\\\"color\\\":\\\"rgba(19,199,248,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#12C2F2\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"游客来源排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608013138921.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338457100451328002\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"laiyuan\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\",\"isTiming\":false,\"intervalTime\":\"2\"},\"layer_id\":\"ndKvmqU3tX7y3naJ\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5]]},{\"row\":1,\"col\":9,\"width\":\"184\",\"height\":\"177\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"数量\\\",\\\"value\\\":\\\"11120\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(99,198,213,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":\\\"8800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#E0E0E1\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"38%\\\",\\\"45%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"出行方式—飞机\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608290902593.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338675446962720769\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"fangshi1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"pie.doughnut\",\"id\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"1uidom5ErD4PeDUK\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,9],[1,10]]},{\"row\":2,\"col\":5,\"width\":\"531\",\"height\":\"302\",\"config\":\"{\\\"geo\\\":{\\\"map\\\":\\\"shandong\\\",\\\"zoom\\\":0.7,\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"8\\\",\\\"show\\\":true},\\\"itemStyle\\\":{\\\"borderWidth\\\":0.5,\\\"areaColor\\\":\\\"#8BD0F7\\\",\\\"borderColor\\\":\\\"#000\\\"},\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"#378DBD\\\"}},\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"roam\\\":true,\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"data\\\":[{\\\"name\\\":\\\"宜兴市\\\",\\\"value\\\":[119.820538,31.364384,\\\"250\\\"]},{\\\"name\\\":\\\"江阴市\\\",\\\"value\\\":[120.275891,31.910984,\\\"500\\\"]}],\\\"name\\\":\\\"pm2.5\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#EDF663\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"8\\\"}},\\\"type\\\":\\\"scatter\\\",\\\"symbolSize\\\":5}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"主要城市空气质量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#F0E426\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"1338720793164517378\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"ditu\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"map.scatter\",\"chartId\":\"\"},\"layer_id\":\"gqXehyaiANglaPQG\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[2,5],[2,6],[2,7],[2,8]]},{\"row\":7,\"col\":1,\"width\":\"365\",\"height\":\"178\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":30,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"灵山\\\",\\\"梅园\\\",\\\"三国派\\\",\\\"张山洞\\\",\\\"惠山古镇\\\",\\\"东林书院\\\",\\\"档口古镇\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":41,\\\"left\\\":45,\\\"bottom\\\":49,\\\"right\\\":26},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[\\\"888\\\",\\\"4702\\\",\\\"4484\\\",\\\"4356\\\",\\\"3752\\\",\\\"2500\\\",\\\"1800\\\"],\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":5,\\\"color\\\":\\\"#43F2E8\\\"},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":\\\"5px\\\",\\\"text\\\":\\\"游客分布排行\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FBFBFB\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608012838022.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338667866760679426\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"fenbu1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"bar.simple\",\"chartId\":\"bar.simple\"},\"layer_id\":\"aZ4FsMHs0xbfUpYQ\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[7,1],[7,2],[7,3],[7,4],[7,5]]},{\"row\":8,\"col\":9,\"width\":\"184\",\"height\":\"154\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"数量\\\",\\\"value\\\":\\\"11120\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(254,231,105,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":\\\"8800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#E0E0E1\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"48%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"出行方式—火车\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608291176729.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338675446962720769\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"fangshi1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"pie.doughnut\",\"id\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"778X5NaIRavT5Nm1\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[8,9],[8,10]]},{\"row\":14,\"col\":9,\"width\":\"189\",\"height\":\"129\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"11\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"数量\\\",\\\"value\\\":\\\"11120\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(243,137,130,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":\\\"8800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#E0E0E1\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"出行方式—轮船\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608291366947.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338675446962720769\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"fangshi1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"pie.doughnut\",\"id\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"DNX66I155dmhuer0\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,9],[14,10],[14,11]]},{\"row\":14,\"col\":1,\"width\":\"367\",\"height\":\"277\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"宾馆\\\",\\\"景区\\\",\\\"餐饮\\\",\\\"商城\\\",\\\"商业街\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"orient\\\":\\\"vertical\\\",\\\"data\\\":[{\\\"name\\\":\\\"宾馆\\\",\\\"value\\\":\\\"4.5\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(44,222,250,1)\\\"}},{\\\"name\\\":\\\"景区\\\",\\\"value\\\":\\\"4.4\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(127,244,201,1)\\\"}},{\\\"name\\\":\\\"餐饮\\\",\\\"value\\\":\\\"3.2\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(252,209,1,1)\\\"}},{\\\"name\\\":\\\"商城\\\",\\\"value\\\":\\\"2.3\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(239,134,127,1)\\\"}},{\\\"name\\\":\\\"商业街\\\",\\\"value\\\":\\\"2\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(105,127,193,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":\\\"1.8\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(115,164,196,1)\\\"}}],\\\"bottom\\\":27,\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"12\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\",\\\"top\\\":59,\\\"left\\\":\\\"10%\\\",\\\"gap\\\":3,\\\"name\\\":\\\"漏斗图\\\",\\\"width\\\":\\\"72%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"停留时长分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FBF8F8\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608012824514.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338669749617299458\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"yanshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"funnel.simple\",\"chartId\":\"bar.simple\"},\"layer_id\":\"7WtIijKkXSWV8mJp\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,1],[14,2],[14,3],[14,4],[14,5]]},{\"row\":14,\"col\":5,\"width\":\"531\",\"height\":\"277\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFEFE\\\",\\\"fontSize\\\":12}},\\\"data\\\":[\\\"10.1\\\",\\\"10.2\\\",\\\"10.3\\\",\\\"10.4\\\",\\\"10.5\\\",\\\"10.6\\\",\\\"10.7\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":49,\\\"left\\\":43,\\\"bottom\\\":42,\\\"right\\\":27},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[\\\"3200\\\",\\\"3000\\\",\\\"3500\\\",\\\"3800\\\",\\\"2800\\\",\\\"3100\\\",\\\"3700\\\"],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#01E4FE\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"游客趋势分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608012808605.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338724105821622274\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"qushi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"line.simple\",\"chartId\":\"line.simple\"},\"layer_id\":\"ZrPvcA8ReTCrfWyy\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,5],[14,6],[14,7],[14,8]]},{\"row\":14,\"col\":11,\"width\":\"300\",\"height\":\"275\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"1\\\",\\\"2\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"layout\\\":\\\"circular\\\",\\\"lineStyle\\\":{\\\"curveness\\\":0.3,\\\"color\\\":\\\"source\\\"},\\\"data\\\":[{\\\"name\\\":\\\"江苏\\\",\\\"value\\\":\\\"500\\\",\\\"category\\\":0,\\\"type\\\":\\\"1\\\"},{\\\"name\\\":\\\"广东\\\",\\\"value\\\":\\\"300\\\",\\\"category\\\":1,\\\"type\\\":\\\"2\\\"},{\\\"name\\\":\\\"浙江\\\",\\\"value\\\":\\\"100\\\",\\\"category\\\":2,\\\"type\\\":\\\"1\\\"},{\\\"name\\\":\\\"湖北\\\",\\\"value\\\":\\\"1000\\\",\\\"category\\\":2,\\\"type\\\":\\\"1\\\"},{\\\"name\\\":\\\"湖南\\\",\\\"value\\\":\\\"888\\\",\\\"category\\\":2,\\\"type\\\":\\\"1\\\"}],\\\"center\\\":[320,150],\\\"name\\\":\\\"关系图\\\",\\\"links\\\":[{\\\"source\\\":\\\"江苏\\\",\\\"target\\\":\\\"广东\\\"},{\\\"source\\\":\\\"广东\\\",\\\"target\\\":\\\"湖北\\\"},{\\\"source\\\":\\\"湖南\\\",\\\"target\\\":\\\"江苏\\\"},{\\\"source\\\":\\\"广东\\\",\\\"target\\\":\\\"浙江\\\"},{\\\"source\\\":\\\"浙江\\\",\\\"target\\\":\\\"广东\\\"},{\\\"source\\\":\\\"浙江\\\",\\\"target\\\":\\\"湖北\\\"},{\\\"source\\\":\\\"浙江\\\",\\\"target\\\":\\\"湖南\\\"},{\\\"source\\\":\\\"湖南\\\",\\\"target\\\":\\\"浙江\\\"},{\\\"source\\\":\\\"湖南\\\",\\\"target\\\":\\\"湖北\\\"},{\\\"source\\\":\\\"湖南\\\",\\\"target\\\":\\\"广东\\\"},{\\\"source\\\":\\\"湖北\\\",\\\"target\\\":\\\"江苏\\\"}],\\\"categories\\\":[{\\\"name\\\":\\\"1\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}},{\\\"name\\\":\\\"2\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}},{\\\"name\\\":\\\"1\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}}],\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"type\\\":\\\"graph\\\",\\\"roam\\\":true}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"来源关系分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608291719728.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338687259901169665\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"xianlu\",\"dataId1\":\"1338687435562815489\",\"source\":\"from_name\",\"target\":\"to_name\",\"chartType\":\"graph.simple\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"\"},\"layer_id\":\"ejghiJGsHBsY5lsY\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,11],[14,12],[14,13],[14,14]]},{\"row\":19,\"col\":9,\"width\":\"189\",\"height\":\"148\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"数量\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"数量\\\",\\\"value\\\":\\\"11120\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(116,166,198,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":\\\"8800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#E0E0E1\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"出行方式—其他\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":{\\\"src\\\":\\\"https://static.jero.com/designreport/images/bg1_1608291475210.png\\\"}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"dataId\":\"1338675446962720769\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"fangshi1\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"chartType\":\"pie.doughnut\",\"id\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"SyZNSbb9ooxZvyH1\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[19,9],[19,10],[19,11]]}],\"area\":{\"sri\":15,\"sci\":1,\"eri\":96,\"eci\":10,\"width\":1082,\"height\":2050},\"printElWidth\":794,\"excel_config_id\":\"1337271712059887616\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"山东智慧旅游大屏\",\"style\":5,\"merge\":[0,12]},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6},\"5\":{\"style\":6},\"6\":{\"style\":6},\"7\":{\"style\":6},\"8\":{\"style\":6},\"9\":{\"style\":6},\"10\":{\"style\":6},\"11\":{\"style\":6},\"12\":{\"style\":6},\"13\":{\"style\":6}},\"height\":96},\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"ndKvmqU3tX7y3naJ\"},\"2\":{\"text\":\" \",\"virtual\":\"ndKvmqU3tX7y3naJ\"},\"3\":{\"text\":\" \",\"virtual\":\"ndKvmqU3tX7y3naJ\"},\"4\":{\"text\":\" \",\"virtual\":\"ndKvmqU3tX7y3naJ\"},\"5\":{\"text\":\" \",\"virtual\":\"ndKvmqU3tX7y3naJ\"},\"9\":{\"text\":\" \",\"virtual\":\"1uidom5ErD4PeDUK\"},\"10\":{\"text\":\" \",\"virtual\":\"1uidom5ErD4PeDUK\"},\"11\":{\"text\":\" \",\"virtual\":\"i5HQTS1CQ2VH6nEQ\"},\"12\":{\"text\":\" \",\"virtual\":\"i5HQTS1CQ2VH6nEQ\"},\"13\":{\"text\":\" \",\"virtual\":\"i5HQTS1CQ2VH6nEQ\"},\"14\":{\"text\":\" \",\"virtual\":\"i5HQTS1CQ2VH6nEQ\"}}},\"2\":{\"cells\":{\"5\":{\"text\":\" \",\"virtual\":\"gqXehyaiANglaPQG\"},\"6\":{\"text\":\" \",\"virtual\":\"gqXehyaiANglaPQG\"},\"7\":{\"text\":\" \",\"virtual\":\"gqXehyaiANglaPQG\"},\"8\":{\"text\":\" \",\"virtual\":\"gqXehyaiANglaPQG\"}}},\"5\":{\"cells\":{}},\"6\":{\"cells\":{}},\"7\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"aZ4FsMHs0xbfUpYQ\"},\"2\":{\"text\":\" \",\"virtual\":\"aZ4FsMHs0xbfUpYQ\"},\"3\":{\"text\":\" \",\"virtual\":\"aZ4FsMHs0xbfUpYQ\"},\"4\":{\"text\":\" \",\"virtual\":\"aZ4FsMHs0xbfUpYQ\"},\"5\":{\"text\":\" \",\"virtual\":\"aZ4FsMHs0xbfUpYQ\"}}},\"8\":{\"cells\":{\"9\":{\"text\":\" \",\"virtual\":\"778X5NaIRavT5Nm1\"},\"10\":{\"text\":\" \",\"virtual\":\"778X5NaIRavT5Nm1\"}}},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\",\"virtual\":\"e0TvMeaBiYnZTQ0X\",\"merge\":[0,2],\"style\":4},\"12\":{\"style\":4,\"virtual\":\"e0TvMeaBiYnZTQ0X\"},\"13\":{\"style\":4,\"virtual\":\"e0TvMeaBiYnZTQ0X\"}}},\"14\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"7WtIijKkXSWV8mJp\"},\"2\":{\"text\":\" \",\"virtual\":\"7WtIijKkXSWV8mJp\"},\"3\":{\"text\":\" \",\"virtual\":\"7WtIijKkXSWV8mJp\"},\"4\":{\"text\":\" \",\"virtual\":\"7WtIijKkXSWV8mJp\"},\"5\":{\"text\":\" \",\"virtual\":\"ZrPvcA8ReTCrfWyy\"},\"6\":{\"text\":\" \",\"virtual\":\"ZrPvcA8ReTCrfWyy\"},\"7\":{\"text\":\" \",\"virtual\":\"ZrPvcA8ReTCrfWyy\"},\"8\":{\"text\":\" \",\"virtual\":\"ZrPvcA8ReTCrfWyy\"},\"9\":{\"text\":\" \",\"virtual\":\"DNX66I155dmhuer0\"},\"10\":{\"text\":\" \",\"virtual\":\"DNX66I155dmhuer0\"},\"11\":{\"text\":\" \",\"virtual\":\"ejghiJGsHBsY5lsY\"},\"12\":{\"text\":\" \",\"virtual\":\"ejghiJGsHBsY5lsY\"},\"13\":{\"text\":\" \",\"virtual\":\"ejghiJGsHBsY5lsY\"},\"14\":{\"text\":\" \",\"virtual\":\"ejghiJGsHBsY5lsY\"}}},\"15\":{\"cells\":{}},\"16\":{\"cells\":{}},\"19\":{\"cells\":{\"9\":{\"text\":\" \",\"virtual\":\"SyZNSbb9ooxZvyH1\"},\"10\":{\"text\":\" \",\"virtual\":\"SyZNSbb9ooxZvyH1\"},\"11\":{\"text\":\" \",\"virtual\":\"SyZNSbb9ooxZvyH1\"}}},\"20\":{\"cells\":{}},\"21\":{\"cells\":{}},\"27\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":97},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1537,\"background\":{\"path\":\"https://static.jero.com/designreport/images/bg_1607665431796.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"rgb(71,208,241)\"},{\"color\":\"rgb(71,208,241)\",\"font\":{\"size\":16}},{\"color\":\"rgb(71,208,241)\",\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"color\":\"#ffffff\"},{\"color\":\"rgb(71,208,241)\",\"font\":{\"size\":18},\"align\":\"center\"},{\"font\":{\"size\":18}}],\"validations\":[],\"cols\":{\"0\":{\"width\":60},\"4\":{\"width\":62},\"7\":{\"width\":182},\"8\":{\"width\":150},\"10\":{\"width\":88},\"11\":{\"width\":95},\"len\":26},\"merges\":[\"B1:N1\",\"L14:N14\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201218200411_1608293066714.png', 'admin', '2020-12-11 13:43:33', 'admin', '2021-01-13 13:44:29', 1, NULL, NULL, 0, 341); +INSERT INTO `jimu_report` VALUES ('1338370016550195200', '20201214142804', '条形码报表', NULL, NULL, 'datainfo', '{\"area\":{\"sri\":0,\"sci\":1,\"eri\":1,\"eci\":4,\"width\":406,\"height\":143},\"printElWidth\":794,\"excel_config_id\":\"1338370016550195200\",\"barcodeList\":[{\"row\":0,\"col\":5,\"width\":\"221\",\"height\":\"63\",\"layer_id\":\"ZiOFmILaRjdmVs6E\",\"offsetX\":0,\"offsetY\":0,\"jsonString\":\"{\\\"barcodeContent\\\":\\\"968557412333\\\",\\\"format\\\":\\\"CODE128\\\",\\\"width\\\":2,\\\"height\\\":100,\\\"displayValue\\\":false,\\\"text\\\":\\\"jmreport\\\",\\\"fontOptions\\\":\\\"\\\",\\\"font\\\":\\\"monospace\\\",\\\"textAlign\\\":\\\"center\\\",\\\"textPosition\\\":\\\"bottom\\\",\\\"textMargin\\\":2,\\\"fontSize\\\":20,\\\"background\\\":\\\"#fff\\\",\\\"lineColor\\\":\\\"#000\\\",\\\"margin\\\":10,\\\"containerWidth\\\":\\\"315\\\",\\\"containerHeight\\\":\\\"50\\\"}\",\"virtualCellRange\":[[0,5],[0,6],[0,7]]}],\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"merge\":[1,3],\"text\":\"居民身份证申领登记表\",\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"text\":\" \",\"virtual\":\"ZiOFmILaRjdmVs6E\"},\"6\":{\"text\":\" \",\"virtual\":\"ZiOFmILaRjdmVs6E\"},\"7\":{\"text\":\" \",\"virtual\":\"ZiOFmILaRjdmVs6E\"}},\"height\":91},\"1\":{\"cells\":{\"1\":{\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":2,\"virtual\":\"ZiOFmILaRjdmVs6E\"},\"6\":{\"text\":\" \",\"virtual\":\"ZiOFmILaRjdmVs6E\"},\"7\":{\"text\":\" \",\"virtual\":\"ZiOFmILaRjdmVs6E\"}},\"height\":52},\"2\":{\"cells\":{\"1\":{\"text\":\"受理单位(盖章)珠海市公安局\",\"merge\":[0,3],\"style\":36},\"2\":{\"style\":36},\"3\":{\"style\":36},\"4\":{\"style\":36},\"5\":{\"style\":6},\"6\":{\"style\":6},\"7\":{\"style\":6}},\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\"姓名\",\"style\":24},\"2\":{\"text\":\"${tiaoma.name}\",\"style\":7},\"3\":{\"text\":\"性别\",\"style\":16},\"4\":{\"text\":\"${tiaoma.sex}\",\"style\":7,\"isDict\":1,\"dictCode\":\"sex1\"},\"5\":{\"text\":\"民族\",\"style\":16},\"6\":{\"text\":\"${tiaoma.nation}\",\"style\":7},\"7\":{\"text\":\"\",\"style\":7,\"merge\":[2,0]}},\"isDrag\":true,\"height\":47},\"4\":{\"cells\":{\"1\":{\"text\":\"出生日期\",\"style\":24},\"2\":{\"text\":\"${tiaoma.birth}\",\"style\":32,\"merge\":[0,4]},\"3\":{\"style\":33},\"4\":{\"style\":33},\"5\":{\"style\":33},\"6\":{\"style\":33}},\"isDrag\":true,\"height\":51},\"5\":{\"cells\":{\"1\":{\"text\":\"常住户口所在地住址\",\"style\":21},\"2\":{\"text\":\"${tiaoma.address}\",\"style\":7,\"merge\":[0,4]}},\"isDrag\":true,\"height\":62},\"6\":{\"cells\":{\"1\":{\"text\":\"公民身份证\",\"style\":24},\"2\":{\"text\":\"${tiaoma.card}\",\"style\":7,\"merge\":[0,5]}},\"isDrag\":true,\"height\":55},\"7\":{\"cells\":{\"1\":{\"text\":\"有限期限\",\"style\":24},\"2\":{\"text\":\"${tiaoma.date}\",\"style\":34,\"merge\":[0,1]},\"3\":{\"style\":35},\"4\":{\"text\":\"签发机关\",\"style\":24},\"5\":{\"text\":\"${tiaoma.orga}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":52},\"8\":{\"cells\":{\"1\":{\"text\":\"申领原因\",\"style\":24},\"2\":{\"text\":\"${tiaoma.reason}\",\"style\":7,\"merge\":[0,5]}},\"isDrag\":true,\"height\":55},\"9\":{\"cells\":{\"1\":{\"text\":\"受理时间\",\"style\":24},\"2\":{\"text\":\"${tiaoma.time}\",\"style\":32,\"merge\":[0,1]},\"3\":{\"style\":33},\"4\":{\"text\":\"受理号\",\"style\":24},\"5\":{\"text\":\"${tiaoma.num}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":49},\"10\":{\"cells\":{\"1\":{\"text\":\"承办人\",\"style\":24},\"2\":{\"text\":\"${tiaoma.undertaker}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"受理单位领导\",\"style\":24},\"5\":{\"text\":\"${tiaoma.leader}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":42},\"11\":{\"cells\":{\"1\":{\"text\":\"申请(监护)人签名\",\"style\":21},\"2\":{\"text\":\"${tiaoma.autograph}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"申请(监护)人联系电话\",\"style\":21},\"5\":{\"text\":\"${tiaoma.phone}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":59},\"12\":{\"cells\":{\"1\":{\"text\":\"领证人签名\",\"style\":24},\"2\":{\"text\":\"${tiaoma.qianming}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"领证时间\",\"style\":24},\"5\":{\"text\":\"${tiaoma.ltime}\",\"style\":32,\"merge\":[0,2]},\"6\":{\"style\":33},\"7\":{\"style\":33}},\"isDrag\":true,\"height\":57},\"13\":{\"cells\":{\"1\":{\"text\":\"是否通过邮政特快专递方式领取二代\",\"merge\":[0,1],\"style\":24},\"2\":{\"text\":\" \",\"style\":25},\"3\":{\"text\":\"${tiaoma.os}\",\"style\":7,\"merge\":[0,4]}},\"isDrag\":true,\"height\":50},\"14\":{\"cells\":{\"1\":{\"text\":\"投递地址\",\"style\":24},\"2\":{\"text\":\"${tiaoma.taddress}\",\"style\":7,\"merge\":[0,2]},\"5\":{\"text\":\"收件人\",\"style\":24},\"6\":{\"style\":7,\"text\":\" \",\"merge\":[0,1]}},\"isDrag\":true,\"height\":53},\"15\":{\"cells\":{\"1\":{\"text\":\"邮政编码\",\"style\":24},\"2\":{\"text\":\"${tiaoma.code}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"备注\",\"style\":24},\"5\":{\"text\":\"${tiaoma.remarks}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":47},\"16\":{\"cells\":{\"1\":{\"merge\":[0,6],\"text\":\"公安部治安管理局治\",\"style\":31},\"2\":{\"style\":31},\"3\":{\"style\":31},\"4\":{\"style\":31},\"5\":{\"style\":31},\"6\":{\"style\":31},\"7\":{\"style\":31}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[\"sex1\",\"sex1\",\"sex1\"],\"freeze\":\"A1\",\"dataRectWidth\":739,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":9}},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#3f3f3f\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#0c0c0c\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#595959\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"right\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false},\"align\":\"center\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"align\":\"center\"},{\"font\":{\"size\":8},\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date\"},{\"format\":\"date\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#595959\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"valign\":\"bottom\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":51},\"1\":{\"width\":103},\"2\":{\"width\":156},\"3\":{\"width\":51},\"4\":{\"width\":96},\"5\":{\"width\":61},\"6\":{\"width\":106},\"7\":{\"width\":115},\"8\":{\"width\":135},\"len\":26},\"merges\":[\"B3:E3\",\"B14:C14\",\"C6:G6\",\"C5:G5\",\"C7:H7\",\"C8:D8\",\"F8:H8\",\"C9:H9\",\"D14:H14\",\"C10:D10\",\"F10:H10\",\"C11:D11\",\"F11:H11\",\"C13:D13\",\"C12:D12\",\"F12:H12\",\"F13:H13\",\"C15:E15\",\"G15:H15\",\"F16:H16\",\"C16:D16\",\"B17:H17\",\"H4:H6\",\"B1:E2\"]}', NULL, 'https://static.jero.com/designreport/images/未标题-1_1608118350039.png', 'admin', '2020-12-14 14:28:04', 'admin', '2021-01-13 14:13:25', 0, NULL, NULL, 1, 743); +INSERT INTO `jimu_report` VALUES ('1338744112815411200', '20201215151426', '简单条件查询报表', NULL, NULL, 'datainfo', '{\"area\":false,\"printElWidth\":1259,\"excel_config_id\":\"1338744112815411200\",\"printElHeight\":700,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":39},\"1\":{\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":39},\"6\":{\"style\":39},\"7\":{\"style\":39},\"8\":{\"style\":39},\"9\":{\"style\":39},\"10\":{\"style\":39},\"11\":{\"style\":39},\"12\":{\"style\":39},\"13\":{\"style\":39},\"14\":{\"style\":39},\"15\":{\"style\":39},\"16\":{\"style\":39},\"17\":{\"style\":39},\"18\":{\"style\":39},\"19\":{\"style\":39},\"20\":{\"style\":39},\"21\":{\"style\":39},\"22\":{\"style\":39},\"23\":{\"style\":39},\"24\":{\"style\":39},\"25\":{\"style\":39}}},\"1\":{\"cells\":{\"0\":{\"style\":40},\"1\":{\"text\":\"发货地区\",\"style\":41},\"2\":{\"text\":\"发货城市\",\"style\":41},\"3\":{\"text\":\"发货公司\",\"style\":41},\"4\":{\"text\":\"运费\",\"style\":41},\"5\":{\"text\":\"发货日期\",\"style\":41},\"6\":{\"text\":\"客户ID\",\"style\":41},\"7\":{\"text\":\"客户地址\",\"style\":41},\"8\":{\"text\":\"订购日期\",\"style\":41},\"9\":{\"text\":\"到货日期\",\"style\":41},\"10\":{\"text\":\"邮政编码\",\"style\":41},\"11\":{\"style\":40},\"12\":{\"style\":40},\"13\":{\"style\":40},\"14\":{\"style\":40},\"15\":{\"style\":40},\"16\":{\"style\":40},\"17\":{\"style\":40},\"18\":{\"style\":40},\"19\":{\"style\":40},\"20\":{\"style\":40},\"21\":{\"style\":40},\"22\":{\"style\":40},\"23\":{\"style\":40},\"24\":{\"style\":40},\"25\":{\"style\":40}},\"height\":46},\"2\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":42},\"1\":{\"text\":\"#{jdcx.group(region)}\",\"style\":43,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{jdcx.group(city)}\",\"style\":44,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{jdcx.company}\",\"style\":45},\"4\":{\"text\":\"#{jdcx.freight}\",\"style\":46},\"5\":{\"text\":\"#{jdcx.ftime}\",\"style\":48},\"6\":{\"text\":\"#{jdcx.customer}\",\"style\":46},\"7\":{\"text\":\"#{jdcx.address}\",\"style\":46},\"8\":{\"text\":\"#{jdcx.ftime}\",\"style\":47},\"9\":{\"text\":\"#{jdcx.ttime}\",\"style\":47},\"10\":{\"text\":\"#{jdcx.code1}\",\"style\":46},\"11\":{\"style\":42},\"12\":{\"style\":42},\"13\":{\"style\":42},\"14\":{\"style\":42},\"15\":{\"style\":42},\"16\":{\"style\":42},\"17\":{\"style\":42},\"18\":{\"style\":42},\"19\":{\"style\":42},\"20\":{\"style\":42},\"21\":{\"style\":42},\"22\":{\"style\":42},\"23\":{\"style\":42},\"24\":{\"style\":42},\"25\":{\"style\":42}},\"isDrag\":true,\"height\":35},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"jdcx.region\",\"freeze\":\"A1\",\"dataRectWidth\":1228,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"align\":\"center\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"date\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"normal\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":40},\"1\":{\"width\":107},\"3\":{\"width\":143},\"5\":{\"width\":163},\"6\":{\"width\":84},\"7\":{\"width\":191},\"len\":26},\"merges\":[]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201216112919_1608089379396.png', 'admin', '2020-12-15 15:14:27', 'admin', '2021-01-13 14:13:18', 0, NULL, NULL, 1, 1039); +INSERT INTO `jimu_report` VALUES ('1338769064067076098', '202012151514266124', '多选条件查询报表', NULL, NULL, 'datainfo', '{\"area\":false,\"printElWidth\":1533,\"excel_config_id\":\"1338769064067076098\",\"printElHeight\":764,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":49},\"1\":{\"style\":49},\"2\":{\"style\":49},\"3\":{\"style\":49},\"4\":{\"style\":49},\"5\":{\"style\":49},\"6\":{\"style\":49},\"7\":{\"style\":49},\"8\":{\"style\":49},\"9\":{\"style\":49},\"10\":{\"style\":49},\"11\":{\"style\":49},\"12\":{\"style\":49},\"13\":{\"style\":49},\"14\":{\"style\":49},\"15\":{\"style\":49},\"16\":{\"style\":49},\"17\":{\"style\":49},\"18\":{\"style\":49},\"19\":{\"style\":49},\"20\":{\"style\":49},\"21\":{\"style\":49},\"22\":{\"style\":49},\"23\":{\"style\":49},\"24\":{\"style\":49},\"25\":{\"style\":49}}},\"1\":{\"cells\":{\"0\":{\"style\":50},\"1\":{\"text\":\"职务\",\"style\":51},\"2\":{\"text\":\"雇员ID\",\"style\":51},\"3\":{\"text\":\"姓名\",\"style\":51},\"4\":{\"style\":51,\"text\":\"性别\"},\"5\":{\"text\":\"雇佣日期\",\"style\":51},\"6\":{\"text\":\"家庭电话\",\"style\":51},\"7\":{\"text\":\"出生日期\",\"style\":51},\"8\":{\"text\":\"户口所在地\",\"style\":51},\"9\":{\"text\":\"联系地址\",\"style\":51},\"10\":{\"text\":\"紧急联系人\",\"style\":51},\"11\":{\"style\":50},\"12\":{\"style\":50},\"13\":{\"style\":50},\"14\":{\"style\":50},\"15\":{\"style\":50},\"16\":{\"style\":50},\"17\":{\"style\":50},\"18\":{\"style\":50},\"19\":{\"style\":50},\"20\":{\"style\":50},\"21\":{\"style\":50},\"22\":{\"style\":50},\"23\":{\"style\":50},\"24\":{\"style\":50},\"25\":{\"style\":50}},\"height\":46},\"2\":{\"cells\":{\"0\":{\"style\":52},\"1\":{\"text\":\"#{pop.group(update_by)}\",\"style\":53,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{pop.group(id)}\",\"style\":54,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{pop.group(name)}\",\"style\":54,\"aggregate\":\"group\"},\"4\":{\"text\":\"#{pop.sex}\",\"style\":55},\"5\":{\"text\":\"#{pop.gtime}\",\"style\":56},\"6\":{\"text\":\"#{pop.jphone}\",\"style\":57},\"7\":{\"text\":\"#{pop.birth}\",\"style\":56},\"8\":{\"text\":\"#{pop.hukou}\",\"style\":58},\"9\":{\"text\":\"#{pop.laddress}\",\"style\":57},\"10\":{\"text\":\"#{pop.jperson}\",\"style\":57},\"11\":{\"style\":52},\"12\":{\"style\":52},\"13\":{\"style\":52},\"14\":{\"style\":52},\"15\":{\"style\":52},\"16\":{\"style\":52},\"17\":{\"style\":52},\"18\":{\"style\":52},\"19\":{\"style\":52},\"20\":{\"style\":52},\"21\":{\"style\":52},\"22\":{\"style\":52},\"23\":{\"style\":52},\"24\":{\"style\":52},\"25\":{\"style\":52}},\"isDrag\":true,\"height\":35},\"5\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"pop.update_by\",\"freeze\":\"A1\",\"dataRectWidth\":1494,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"align\":\"center\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"date\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"normal\"},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date2\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":48},\"1\":{\"width\":107},\"3\":{\"width\":91},\"4\":{\"width\":142},\"5\":{\"width\":130},\"6\":{\"width\":131},\"7\":{\"width\":235},\"8\":{\"width\":230},\"9\":{\"width\":148},\"10\":{\"width\":132},\"len\":26},\"merges\":[]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201216185224_1608116008543.png', 'admin', '2020-12-15 16:53:13', 'admin', '2021-01-13 14:13:13', 0, NULL, NULL, 1, 882); +INSERT INTO `jimu_report` VALUES ('1339478701846433792', '20201217155313', '企业实时报表', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":6,\"col\":1,\"width\":\"302\",\"height\":\"337\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"江苏\\\",\\\"山东\\\",\\\"安徽\\\",\\\"江西\\\",\\\"河北\\\",\\\"吉林\\\",\\\"黑龙江\\\",\\\"重庆\\\",\\\"广东\\\",\\\"上海\\\",\\\"哈尔滨\\\",\\\"福建\\\",\\\"四川\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":20,\\\"left\\\":45,\\\"bottom\\\":16,\\\"right\\\":46},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[100,800,1200,1700,2500,4000,5800,6500,7000,7500,8000,8800,9500],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":5,\\\"color\\\":\\\"rgba(67,184,251,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售额省份排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339491107951640577\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xiaoshoue\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"IFj1lg5S5aNG1wPx\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[6,1],[6,2],[6,3],[6,4]]},{\"row\":6,\"col\":10,\"width\":\"247\",\"height\":\"124\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售进度\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"Yb2TIGEAxnvN9ITx\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[6,10],[6,11]]},{\"row\":6,\"col\":12,\"width\":\"244\",\"height\":\"128\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":16,\\\"right\\\":45},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售额城市排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"qQHpevWlqElpRQUl\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[6,12],[6,13],[6,14]]},{\"row\":6,\"col\":15,\"width\":\"230\",\"height\":\"127\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":20,\\\"right\\\":48},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"phTmhkjHLebYlOEQ\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[6,15],[6,16],[6,17],[6,18]]},{\"row\":7,\"col\":5,\"width\":\"430\",\"height\":\"293\",\"config\":\"{\\\"geo\\\":{\\\"map\\\":\\\"china\\\",\\\"zoom\\\":0.5,\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"8\\\",\\\"show\\\":true},\\\"itemStyle\\\":{\\\"borderWidth\\\":0.5,\\\"areaColor\\\":\\\"#8284FB\\\",\\\"borderColor\\\":\\\"#000\\\"},\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"#4195EF\\\"}},\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"roam\\\":true,\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"encode\\\":{\\\"value\\\":[2]},\\\"data\\\":[{\\\"name\\\":\\\"河北\\\",\\\"value\\\":[114.502461,38.045474,279]},{\\\"name\\\":\\\"海南\\\",\\\"value\\\":[110.33119,20.031971,273]},{\\\"name\\\":\\\"山东\\\",\\\"value\\\":[117.000923,36.675807,229]},{\\\"name\\\":\\\"甘肃\\\",\\\"value\\\":[103.823557,36.058039,194]},{\\\"name\\\":\\\"宁夏\\\",\\\"value\\\":[106.278179,38.46637,193]},{\\\"name\\\":\\\"浙江\\\",\\\"value\\\":[120.153576,30.287459,177]},{\\\"name\\\":\\\"湖南\\\",\\\"value\\\":[112.982279,28.19409,119]},{\\\"name\\\":\\\"湖北\\\",\\\"value\\\":[114.298572,30.584355,79]},{\\\"name\\\":\\\"河南\\\",\\\"value\\\":[113.665412,34.757975,67]},{\\\"name\\\":\\\"北京\\\",\\\"value\\\":[116.405285,39.904989,58]},{\\\"name\\\":\\\"天津\\\",\\\"value\\\":[117.190182,39.125596,59]},{\\\"name\\\":\\\"上海\\\",\\\"value\\\":[121.472644,31.231706,63]}],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#FF1205\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\"},\\\"type\\\":\\\"scatter\\\",\\\"symbolSize\\\":5}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"主要城市空气质量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"chartType\":\"map.scatter\"},\"layer_id\":\"YTri6J59av4gj1CY\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[7,5],[7,6],[7,7],[7,8]]},{\"row\":14,\"col\":12,\"width\":\"244\",\"height\":\"138\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"50%\\\",\\\"60%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"ARuuHLfjqV9l1tQD\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,12],[14,13],[14,14]]},{\"row\":14,\"col\":15,\"width\":\"230\",\"height\":\"139\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"\"},\"layer_id\":\"bcrMtWqTd2AJIjLd\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,15],[14,16],[14,17],[14,18]]},{\"row\":14,\"col\":10,\"width\":\"244\",\"height\":\"138\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":15,\\\"right\\\":45},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#698AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"Y1kgYOWBHIVQdSN5\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[14,10],[14,11]]},{\"row\":20,\"col\":1,\"width\":\"743\",\"height\":\"150\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FEFEFE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"2020-01-09\\\",\\\"2020-01-12\\\",\\\"2020-01-14\\\",\\\"2020-01-16\\\",\\\"2020-01-18\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":53,\\\"left\\\":22,\\\"bottom\\\":37,\\\"right\\\":20},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#43B8FB\\\",\\\"opacity\\\":0.7},\\\"data\\\":[2,6,7,5,6],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#43B8FB\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":14,\\\"text\\\":\\\"销售额增速\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339538388453195777\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhexian\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"chartId\":\"\"},\"layer_id\":\"uChrZaHYoV04MQpT\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[20,1],[20,2],[20,3],[20,4],[20,5],[20,6],[20,7],[20,8],[20,9]]}],\"area\":{\"sri\":4,\"sci\":5,\"eri\":4,\"eci\":5,\"width\":105,\"height\":38},\"printElWidth\":1800,\"excel_config_id\":\"1339478701846433792\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{}},\"2\":{\"cells\":{\"1\":{\"merge\":[0,17],\"text\":\"企业实时销售数据\",\"style\":3}}},\"3\":{\"cells\":{},\"height\":35},\"4\":{\"cells\":{\"1\":{\"text\":\" 销售额省份排名\",\"style\":32,\"merge\":[0,1],\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"2\":{\"style\":32,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"5\":{\"text\":\" 销售总额\",\"style\":69},\"10\":{\"text\":\" 销售进度\",\"style\":43},\"11\":{\"text\":\"\",\"style\":43},\"13\":{\"text\":\" 销售额城市排名\",\"style\":32,\"merge\":[0,1]},\"14\":{\"style\":32},\"15\":{\"text\":\" 个人业绩排名\",\"style\":32,\"merge\":[0,1]},\"16\":{\"style\":32},\"17\":{\"text\":\"\",\"style\":32,\"merge\":[0,1]},\"18\":{\"style\":32}},\"height\":38},\"5\":{\"cells\":{\"1\":{\"text\":\" Sales ranking points\",\"virtual\":\"IFj1lg5S5aNG1wPx\",\"style\":62,\"merge\":[0,1]},\"2\":{\"style\":31},\"5\":{\"text\":\"12436025\",\"style\":52,\"merge\":[1,0]},\"6\":{\"merge\":[1,0],\"text\":\"元\",\"style\":22},\"10\":{\"text\":\" Sales progress\",\"style\":33},\"11\":{\"text\":\"\",\"virtual\":\"Yb2TIGEAxnvN9ITx\",\"style\":33},\"13\":{\"text\":\" Sales ranking\",\"virtual\":\"qQHpevWlqElpRQUl\",\"style\":31},\"14\":{\"style\":32},\"15\":{\"text\":\" Personal ranking\",\"style\":62,\"merge\":[0,1]},\"16\":{\"style\":62},\"17\":{\"text\":\"\",\"style\":62,\"merge\":[0,1]},\"18\":{\"style\":62}},\"height\":24},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"merge\":[0,1],\"style\":31,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"2\":{\"style\":31,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"3\":{\"text\":\" \",\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"4\":{\"text\":\" \",\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"5\":{\"style\":53},\"6\":{\"style\":22},\"10\":{\"text\":\" \",\"virtual\":\"Yb2TIGEAxnvN9ITx\"},\"11\":{\"text\":\"\",\"style\":33,\"virtual\":\"Yb2TIGEAxnvN9ITx\"},\"12\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\"},\"13\":{\"text\":\"\",\"virtual\":\"qQHpevWlqElpRQUl\",\"style\":31},\"14\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\"},\"15\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"},\"16\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"},\"17\":{\"text\":\" \",\"style\":31,\"virtual\":\"phTmhkjHLebYlOEQ\"},\"18\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"}}},\"7\":{\"cells\":{\"5\":{\"style\":53,\"virtual\":\"YTri6J59av4gj1CY\"},\"6\":{\"style\":22,\"virtual\":\"YTri6J59av4gj1CY\"},\"7\":{\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"},\"8\":{\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"}}},\"8\":{\"cells\":{\"5\":{\"style\":18,\"text\":\"\",\"virtual\":\"YTri6J59av4gj1CY\"}}},\"9\":{\"cells\":{\"5\":{\"style\":21,\"text\":\"\"}}},\"10\":{\"cells\":{\"5\":{\"text\":\"\",\"style\":17}}},\"12\":{\"cells\":{\"10\":{\"text\":\" 品类销售排名\",\"style\":43},\"11\":{\"text\":\"\",\"style\":43},\"13\":{\"text\":\" 品类销售额占比\",\"style\":43,\"merge\":[0,1]},\"14\":{\"style\":54},\"15\":{\"text\":\" 一季度销售季度\",\"style\":43,\"merge\":[0,1]},\"16\":{\"style\":54},\"17\":{\"text\":\"\",\"style\":43,\"merge\":[0,1]},\"18\":{\"style\":54}}},\"13\":{\"cells\":{\"10\":{\"text\":\" Category Sales ranking\",\"style\":31},\"11\":{\"text\":\"\",\"style\":31},\"13\":{\"text\":\" Type of Sales \",\"style\":31},\"15\":{\"text\":\" Quarterly sales progree\",\"style\":58,\"merge\":[0,1]},\"16\":{\"style\":58},\"17\":{\"text\":\"\",\"style\":58,\"merge\":[0,1]},\"18\":{\"style\":58}}},\"14\":{\"cells\":{\"10\":{\"text\":\" \",\"virtual\":\"Y1kgYOWBHIVQdSN5\"},\"11\":{\"text\":\" \",\"virtual\":\"Y1kgYOWBHIVQdSN5\"},\"12\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"13\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"14\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"15\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"16\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"17\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"18\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"}}},\"15\":{\"cells\":{},\"height\":15},\"16\":{\"cells\":{\"11\":{\"text\":\"\",\"style\":43},\"13\":{\"text\":\"\",\"style\":43,\"merge\":[0,1]},\"14\":{\"style\":54},\"17\":{\"text\":\"\",\"style\":43,\"merge\":[0,1]},\"18\":{\"style\":54}}},\"17\":{\"cells\":{\"11\":{\"text\":\"\",\"style\":31},\"13\":{\"text\":\"\",\"style\":31},\"17\":{\"text\":\"\",\"merge\":[0,1],\"style\":58},\"18\":{\"style\":58}}},\"18\":{\"cells\":{}},\"20\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"2\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"3\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"4\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"5\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"6\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"7\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"8\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"9\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"}},\"height\":39},\"22\":{\"cells\":{\"10\":{\"text\":\"企业经营指标\",\"style\":74},\"11\":{\"text\":\"1201043元\",\"style\":73},\"13\":{\"text\":\"企业经营指标\",\"style\":74},\"14\":{\"text\":\"1201043元\",\"style\":73},\"16\":{\"text\":\"企业经营指标\",\"style\":74},\"17\":{\"text\":\"1201043元\",\"style\":73}}},\"23\":{\"cells\":{\"10\":{\"text\":\"企业经营指标1\",\"style\":74},\"11\":{\"text\":\"1201043元\",\"style\":73},\"13\":{\"text\":\"企业经营指标1\",\"style\":74},\"14\":{\"text\":\"1201043元\",\"style\":73},\"16\":{\"text\":\"企业经营指标1\",\"style\":74},\"17\":{\"text\":\"1201043元\",\"style\":73}}},\"26\":{\"cells\":{},\"height\":33},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1584,\"background\":{\"path\":\"https://static.jero.com/designreport/images/bg55_1608205385382.png\",\"repeat\":\"no-repeat\",\"width\":\"1525\",\"height\":\"700\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":16},\"align\":\"center\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"align\":\"center\"},{\"font\":{\"size\":18}},{\"color\":\"#67b1ee\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":14}},{\"color\":\"#67b1ee\",\"font\":{\"size\":12}},{\"font\":{\"size\":14}},{\"font\":{\"size\":18},\"bgcolor\":\"#ffffff\"},{\"font\":{\"size\":18},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\"},{\"font\":{\"size\":16},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":16},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\",\"align\":\"right\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"color\":\"#fe0000\"},{\"font\":{\"size\":16},\"color\":\"#fe0000\",\"align\":\"center\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\"},{\"align\":\"left\"},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":12},\"color\":\"#ffffff\"},{\"font\":{\"size\":12,\"bold\":true},\"color\":\"#ffffff\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#ffffff\"},{\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"color\":\"#67b1ee\"},{\"font\":{\"size\":9},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":8},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8},\"color\":\"#67b1ee\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":11}},{\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"color\":\"#ffffff\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":16}},{\"color\":\"#ffff01\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"left\",\"valign\":\"middle\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"align\":\"left\",\"valign\":\"middle\"},{\"color\":\"#ffff01\",\"font\":{\"size\":14},\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":14},\"color\":\"#ffff01\"},{\"color\":\"#ffff01\",\"font\":{\"size\":14},\"align\":\"right\",\"valign\":\"middle\"},{\"font\":{\"size\":14},\"color\":\"#ffff01\",\"align\":\"right\"},{\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8},\"bgcolor\":\"#67b1ee\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\",\"color\":\"#67b1ee\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\",\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"font\":{\"size\":8},\"valign\":\"top\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"center\",\"valign\":\"middle\"},{\"align\":\"center\"},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"right\",\"valign\":\"middle\"},{\"align\":\"right\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"align\":\"right\",\"valign\":\"middle\"},{\"align\":\"right\",\"font\":{\"size\":14}},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"left\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":11}},{\"color\":\"#67b1ee\",\"font\":{\"size\":11},\"align\":\"center\"},{\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"color\":\"#ffff01\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":11},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":10},\"3\":{\"width\":102},\"4\":{\"width\":9},\"5\":{\"width\":105},\"6\":{\"width\":102},\"8\":{\"width\":124},\"9\":{\"width\":14},\"10\":{\"width\":136},\"11\":{\"width\":114},\"12\":{\"width\":15},\"13\":{\"width\":113},\"14\":{\"width\":129},\"15\":{\"width\":11},\"len\":27},\"merges\":[\"B7:C7\",\"N17:O17\",\"R17:S17\",\"R18:S18\",\"B3:S3\",\"R6:S6\",\"B5:C5\",\"B6:C6\",\"F6:F7\",\"G6:G7\",\"N5:O5\",\"R5:S5\",\"N13:O13\",\"R13:S13\",\"R14:S14\",\"P5:Q5\",\"P6:Q6\",\"P14:Q14\",\"P13:Q13\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201218200943_1608293404719.png', 'admin', '2020-12-17 15:53:14', 'admin', '2021-01-13 14:15:32', 0, NULL, NULL, 1, 653); +INSERT INTO `jimu_report` VALUES ('1339859143477039104', '20201218170625', '全国连锁超市会员分析', NULL, NULL, 'chartinfo', '{\"chartList\":[{\"row\":1,\"col\":5,\"width\":\"495\",\"height\":\"343\",\"config\":\"{\\\"geo\\\":{\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"red\\\"},\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#000\\\",\\\"areaColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":0.5},\\\"zoom\\\":0.5,\\\"label\\\":{\\\"color\\\":\\\"#000\\\",\\\"show\\\":true,\\\"fontSize\\\":12},\\\"roam\\\":true,\\\"map\\\":\\\"china\\\",\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"encode\\\":{\\\"value\\\":[2]},\\\"data\\\":[{\\\"name\\\":\\\"河北\\\",\\\"value\\\":[114.502461,38.045474,279]},{\\\"name\\\":\\\"海南\\\",\\\"value\\\":[110.33119,20.031971,273]},{\\\"name\\\":\\\"山东\\\",\\\"value\\\":[117.000923,36.675807,229]},{\\\"name\\\":\\\"甘肃\\\",\\\"value\\\":[103.823557,36.058039,194]},{\\\"name\\\":\\\"宁夏\\\",\\\"value\\\":[106.278179,38.46637,193]},{\\\"name\\\":\\\"浙江\\\",\\\"value\\\":[120.153576,30.287459,177]},{\\\"name\\\":\\\"湖南\\\",\\\"value\\\":[112.982279,28.19409,119]},{\\\"name\\\":\\\"湖北\\\",\\\"value\\\":[114.298572,30.584355,79]},{\\\"name\\\":\\\"河南\\\",\\\"value\\\":[113.665412,34.757975,67]},{\\\"name\\\":\\\"北京\\\",\\\"value\\\":[116.405285,39.904989,58]},{\\\"name\\\":\\\"天津\\\",\\\"value\\\":[117.190182,39.125596,59]},{\\\"name\\\":\\\"上海\\\",\\\"value\\\":[121.472644,31.231706,63]}],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"purple\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\"},\\\"type\\\":\\\"scatter\\\"}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"全国省份分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#0B0B0B\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"chartId\":\"map.scatter\",\"chartType\":\"map.scatter\"},\"layer_id\":\"7iI8sg3C12WgjU7y\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,5],[1,6],[1,7],[1,8],[1,9]]},{\"row\":1,\"col\":10,\"width\":\"300\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"data\\\":[\\\"顾客\\\",\\\"二星\\\",\\\"一星\\\",\\\"明星\\\",\\\"总监\\\",\\\"三星\\\",\\\"大使\\\",\\\"高级\\\",\\\"金鹰\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":59,\\\"left\\\":43,\\\"bottom\\\":48,\\\"right\\\":32},\\\"series\\\":[{\\\"barWidth\\\":10,\\\"data\\\":[\\\"3948\\\",\\\"515\\\",\\\"334\\\",\\\"150\\\",\\\"54\\\",\\\"50\\\",\\\"17\\\",\\\"7\\\",\\\"2\\\"],\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"#208ae9\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同荣衔等级会员数量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"0\",\"apiUrl\":\"\",\"dataId\":\"1339870475496497153\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"pp\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.simple\",\"id\":\"\"},\"layer_id\":\"31it5pmqMVZ5JAui\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,10],[1,11],[1,12],[1,13]]},{\"row\":1,\"col\":1,\"width\":\"302\",\"height\":\"172\",\"config\":\"{\\\"series\\\":[{\\\"pointer\\\":{\\\"show\\\":true},\\\"startAngle\\\":190,\\\"data\\\":[{\\\"name\\\":\\\"成绩\\\",\\\"value\\\":60}],\\\"center\\\":[\\\"140\\\",\\\"110\\\"],\\\"endAngle\\\":-10,\\\"itemStyle\\\":{\\\"color\\\":\\\"#63869E\\\"},\\\"type\\\":\\\"gauge\\\",\\\"title\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#000\\\",\\\"shadowBlur\\\":10,\\\"fontSize\\\":\\\"10\\\",\\\"shadowColor\\\":\\\"#000\\\"}},\\\"axisLabel\\\":{\\\"color\\\":\\\"auto\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"fontSize\\\":10}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":10,\\\"color\\\":[[0.2,\\\"#65d459\\\"],[0.8,\\\"#208ae9\\\"],[1,\\\"#fee033\\\"]]}},\\\"name\\\":\\\"业务指标\\\",\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"length\\\":4},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"width\\\":3},\\\"length\\\":6},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}%\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"auto\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine_lineStyle_color\\\":[[0.2,\\\"#91c7ae\\\"],[0.8,\\\"#63869E\\\"],[1,\\\"#C23531\\\"]],\\\"radius\\\":\\\"75%\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"会员总数量占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"0\",\"apiUrl\":\"\",\"dataId\":\"\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":\"\",\"intervalTime\":\"\",\"chartType\":\"gauge.simple180\",\"id\":\"klT4JJb8kjnWwa0w\"},\"layer_id\":\"klT4JJb8kjnWwa0w\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4]]},{\"row\":8,\"col\":1,\"width\":\"302\",\"height\":\"176\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":20,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"data\\\":[\\\"08:00~10:00\\\",\\\"10:00~12:00\\\",\\\"12:00~14:00\\\",\\\"14:00~16:00\\\",\\\"16:00~18:00\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":39,\\\"bottom\\\":46,\\\"right\\\":26},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[\\\"1500\\\",\\\"1800\\\",\\\"2500\\\",\\\"3000\\\",\\\"1500\\\"],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#208AE9\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":\\\"8\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":11,\\\"text\\\":\\\"会员活跃度分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"0\",\"apiUrl\":\"\",\"dataId\":\"1339884367194923010\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"hh\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.simple\",\"id\":\"\"},\"layer_id\":\"8ywLFiJLhmN8js1h\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[8,1],[8,2],[8,3],[8,4]]},{\"row\":15,\"col\":8,\"width\":\"299\",\"height\":\"303\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"全职\\\",\\\"兼职\\\",\\\"自由职业者\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":true,\\\"data\\\":[{\\\"name\\\":\\\"全职\\\",\\\"value\\\":\\\"1200\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#49c3fc\\\"}},{\\\"name\\\":\\\"兼职\\\",\\\"value\\\":\\\"500\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#fee033\\\"}},{\\\"name\\\":\\\"自由职业者\\\",\\\"value\\\":\\\"5800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#1560a3\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"radius\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"140\\\",180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"33%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同工作性质分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"1339878700639887362\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"ww\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.rose\",\"id\":\"\"},\"layer_id\":\"lYwyxPbUxNBxMiXu\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[15,8],[15,9],[15,10]]},{\"row\":15,\"col\":11,\"width\":\"520\",\"height\":\"301\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"data\\\":[\\\"广州分公司\\\",\\\"北京分公司\\\",\\\"河北分公司\\\",\\\"天津分公司\\\",\\\"山东分公司\\\",\\\"福建分公司\\\",\\\"上海分公司\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"8\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"会员数量\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":69,\\\"bottom\\\":35,\\\"right\\\":35},\\\"series\\\":[{\\\"barWidth\\\":12,\\\"data\\\":[\\\"5800\\\",\\\"6500\\\",\\\"3500\\\",\\\"3000\\\",\\\"2500\\\",\\\"6500\\\",\\\"7500\\\"],\\\"name\\\":\\\"会员数量\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"#49c3fc\\\"},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":11,\\\"text\\\":\\\"分公司会员数量分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"1339888452912586753\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"gg\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"id\":\"\"},\"layer_id\":\"FeUKrrCWspvnr0FE\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[15,11],[15,12],[15,13],[15,14],[15,15],[15,16]]},{\"row\":15,\"col\":4,\"width\":\"300\",\"height\":\"301\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"25岁以下\\\",\\\"26~30岁\\\",\\\"31~35岁\\\",\\\"36~40岁\\\",\\\"41~45岁\\\",\\\"45~50岁\\\",\\\"50岁以上\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"25岁以下\\\",\\\"value\\\":\\\"1500\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#fee033\\\"}},{\\\"name\\\":\\\"26~30岁\\\",\\\"value\\\":\\\"800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#4fc3e0\\\"}},{\\\"name\\\":\\\"31~35岁\\\",\\\"value\\\":\\\"1200\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#f49730\\\"}},{\\\"name\\\":\\\"36~40岁\\\",\\\"value\\\":\\\"1200\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#b968aa\\\"}},{\\\"name\\\":\\\"41~45岁\\\",\\\"value\\\":\\\"1800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#63d58d\\\"}},{\\\"name\\\":\\\"45~50岁\\\",\\\"value\\\":\\\"1800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#ed495f\\\"}},{\\\"name\\\":\\\"50岁以上\\\",\\\"value\\\":\\\"2000\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"140\\\",\\\"170\\\"],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"33%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"会员年龄段分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"1339876173672390658\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"aa\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"WfW7emJbCHHYI3ii\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[15,4],[15,5],[15,6],[15,7]]},{\"row\":15,\"col\":1,\"width\":\"300\",\"height\":\"300\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"男\\\",\\\"女\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"男\\\",\\\"value\\\":\\\"8800\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#208ae9\\\"}},{\\\"name\\\":\\\"女\\\",\\\"value\\\":\\\"5000\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#65d459\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"140\\\",180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"25%\\\",\\\"33%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"会员性别分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#000000\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":\\\"13\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"1339873097620168705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"\",\"yText\":\"value\",\"xText\":\"name\",\"dbCode\":\"se\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"id\":\"\"},\"layer_id\":\"hdKihNMC1L5tpQxT\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[15,1],[15,2],[15,3],[15,4]]}],\"area\":{\"sri\":7,\"sci\":13,\"eri\":7,\"eci\":13,\"width\":100,\"height\":23},\"printElWidth\":1800,\"excel_config_id\":\"1339859143477039104\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"merge\":[0,14],\"text\":\"全国连锁超市会员分析\",\"style\":5}},\"height\":67},\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"klT4JJb8kjnWwa0w\"},\"2\":{\"text\":\" \",\"virtual\":\"klT4JJb8kjnWwa0w\"},\"3\":{\"text\":\" \",\"virtual\":\"klT4JJb8kjnWwa0w\"},\"4\":{\"text\":\" \",\"virtual\":\"klT4JJb8kjnWwa0w\"},\"5\":{\"text\":\" \",\"virtual\":\"7iI8sg3C12WgjU7y\"},\"6\":{\"text\":\" \",\"virtual\":\"7iI8sg3C12WgjU7y\"},\"7\":{\"text\":\" \",\"virtual\":\"7iI8sg3C12WgjU7y\"},\"8\":{\"text\":\" \",\"virtual\":\"7iI8sg3C12WgjU7y\"},\"9\":{\"text\":\" \",\"virtual\":\"7iI8sg3C12WgjU7y\"},\"10\":{\"text\":\" \",\"virtual\":\"31it5pmqMVZ5JAui\"},\"11\":{\"text\":\" \",\"virtual\":\"31it5pmqMVZ5JAui\"},\"12\":{\"text\":\" \",\"virtual\":\"31it5pmqMVZ5JAui\"},\"13\":{\"text\":\" \",\"virtual\":\"31it5pmqMVZ5JAui\"}}},\"2\":{\"cells\":{}},\"3\":{\"cells\":{}},\"4\":{\"cells\":{}},\"5\":{\"cells\":{}},\"6\":{\"cells\":{}},\"7\":{\"cells\":{\"1\":{\"style\":0},\"2\":{\"style\":0},\"3\":{\"style\":0}},\"height\":23},\"8\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"8ywLFiJLhmN8js1h\"},\"2\":{\"text\":\" \",\"virtual\":\"8ywLFiJLhmN8js1h\"},\"3\":{\"text\":\" \",\"virtual\":\"8ywLFiJLhmN8js1h\"},\"4\":{\"text\":\" \",\"virtual\":\"8ywLFiJLhmN8js1h\"}}},\"15\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"hdKihNMC1L5tpQxT\"},\"2\":{\"text\":\" \",\"virtual\":\"hdKihNMC1L5tpQxT\"},\"3\":{\"text\":\" \",\"virtual\":\"hdKihNMC1L5tpQxT\"},\"4\":{\"text\":\" \",\"virtual\":\"hdKihNMC1L5tpQxT\"},\"5\":{\"text\":\" \",\"virtual\":\"WfW7emJbCHHYI3ii\"},\"6\":{\"text\":\" \",\"virtual\":\"WfW7emJbCHHYI3ii\"},\"7\":{\"text\":\" \",\"virtual\":\"WfW7emJbCHHYI3ii\"},\"8\":{\"text\":\" \",\"virtual\":\"lYwyxPbUxNBxMiXu\"},\"9\":{\"text\":\" \",\"virtual\":\"lYwyxPbUxNBxMiXu\"},\"10\":{\"text\":\" \",\"virtual\":\"lYwyxPbUxNBxMiXu\"},\"11\":{\"text\":\" \",\"virtual\":\"FeUKrrCWspvnr0FE\"},\"12\":{\"text\":\" \",\"virtual\":\"FeUKrrCWspvnr0FE\"},\"13\":{\"text\":\" \",\"virtual\":\"FeUKrrCWspvnr0FE\"},\"14\":{\"text\":\" \",\"virtual\":\"FeUKrrCWspvnr0FE\"},\"15\":{\"text\":\" \",\"virtual\":\"FeUKrrCWspvnr0FE\"},\"16\":{\"text\":\" \",\"virtual\":\"FeUKrrCWspvnr0FE\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1555,\"background\":{\"path\":\"https://static.jero.com/designreport/images/72488_1610364352719.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"#00b04e\"},{\"bgcolor\":\"#f2f2f2\"},{\"font\":{\"size\":18}},{\"font\":{\"size\":14}},{\"font\":{\"size\":14},\"align\":\"center\"},{\"bgcolor\":\"#f2f2f2\",\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"bgcolor\":\"#fc\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fc\"},{\"bgcolor\":\"#fc\'f\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fc\'f\"},{\"bgcolor\":\"#fc\'fa\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fc\'fa\"},{\"bgcolor\":\"#fc\'fa\'f\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fc\'fa\'f\"},{\"bgcolor\":\"#fc\'fa\'fa\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fc\'fa\'fa\"},{\"bgcolor\":\"#fcfafa\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fcfafa\"},{\"bgcolor\":\"#ff\",\"font\":{\"size\":12}},{\"bgcolor\":\"#ff\"},{\"bgcolor\":\"#fff\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fff\"},{\"bgcolor\":\"#ffff\",\"font\":{\"size\":12}},{\"bgcolor\":\"#ffff\"},{\"bgcolor\":\"#ffffd\",\"font\":{\"size\":12}},{\"bgcolor\":\"#ffffd\"},{\"bgcolor\":\"#ffffdf\",\"font\":{\"size\":12}},{\"bgcolor\":\"#ffffdf\"},{\"bgcolor\":\"#ffffdfd\",\"font\":{\"size\":12}},{\"bgcolor\":\"#ffffdfd\"},{\"bgcolor\":\"#ffffff\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fffff\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fffff\"},{\"bgcolor\":\"#fffd\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fffd\"},{\"bgcolor\":\"#fffdf\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fffdf\"},{\"bgcolor\":\"#fffdfd\",\"font\":{\"size\":12}},{\"bgcolor\":\"#fffdfd\"},{\"bgcolor\":\"#fffdfd\",\"font\":{\"size\":11}},{\"bgcolor\":\"#fffdfd\",\"font\":{\"size\":10}},{\"bgcolor\":\"#fffdfd\",\"font\":{\"size\":10,\"bold\":true}},{\"bgcolor\":\"#ffffff\",\"font\":{\"size\":10,\"bold\":true}}],\"validations\":[],\"cols\":{\"0\":{\"width\":51},\"4\":{\"width\":4},\"len\":26},\"merges\":[\"B1:P1\"]}', NULL, 'https://static.jero.com/designreport/images/QQ截图20201218200441_1608293330801.png', 'admin', '2020-12-18 17:06:26', 'admin', '2021-01-13 13:44:15', 1, NULL, NULL, 0, 466); +INSERT INTO `jimu_report` VALUES ('1347373863746539520', '20210108104603', '实习证明', NULL, NULL, 'printinfo', '{\"area\":false,\"printElWidth\":570,\"excel_config_id\":\"1347373863746539520\",\"printElHeight\":1047,\"rows\":{\"6\":{\"cells\":{\"2\":{\"merge\":[0,1],\"text\":\"实习证明\",\"style\":2},\"3\":{\"style\":2}},\"height\":50},\"8\":{\"cells\":{\"1\":{\"text\":\"#{tt.name}\",\"style\":3},\"2\":{\"merge\":[0,2],\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"merge\":[4,3],\"text\":\"#{tt.pingjia}\",\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"13\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"14\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"15\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"16\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"17\":{\"cells\":{\"1\":{\"text\":\"特此证明!\"}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"证明人:\",\"style\":3},\"4\":{\"text\":\"#{tt.lingdao}\"}}},\"23\":{\"cells\":{\"4\":{\"text\":\"#{tt.shijian}\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":487,\"background\":{\"path\":\"https://static.jero.com/designreport/images/report_1595906079684_1610075686629.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true}],\"validations\":[],\"cols\":{\"0\":{\"width\":82},\"1\":{\"width\":86},\"4\":{\"width\":119},\"len\":26},\"merges\":[\"C7:D7\",\"C9:E9\",\"B13:E17\"]}', NULL, 'https://static.jero.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-08 10:46:04', 'admin', '2021-01-13 14:12:33', 0, NULL, NULL, 1, 84); +INSERT INTO `jimu_report` VALUES ('1347454742040809472', '20210108161240', '实例:年度各月份佣金收入', NULL, NULL, 'datainfo', '{\"area\":{\"sri\":12,\"sci\":3,\"eri\":12,\"eci\":3,\"width\":100,\"height\":25},\"printElWidth\":749,\"excel_config_id\":\"1347454742040809472\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"style\":8,\"text\":\"\",\"virtual\":\"D2luBqo7FDosHXdi\"},\"2\":{\"text\":\"年度各月份佣金收入\",\"merge\":[0,3],\"style\":16,\"virtual\":\"D2luBqo7FDosHXdi\"},\"3\":{\"style\":16},\"4\":{\"style\":16},\"5\":{\"style\":16},\"6\":{\"text\":\" \"}},\"height\":37},\"2\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\"查询年度:2019\"},\"4\":{\"text\":\"查询机构:总公司\"},\"6\":{\"text\":\"单位:元\"}}},\"6\":{\"cells\":{\"1\":{\"text\":\"月份\",\"style\":12},\"2\":{\"text\":\"佣金/主营业收入\",\"style\":12},\"3\":{\"text\":\"累计\",\"style\":12},\"4\":{\"text\":\"历史最低水平\",\"style\":12},\"5\":{\"text\":\"历史平均水平\",\"style\":12},\"6\":{\"text\":\"历史最高水平\",\"style\":12}}},\"7\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_1.monty}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_1.main_income}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_1.total}\",\"style\":18},\"4\":{\"text\":\"#{tmp_report_data_1.his_lowest}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_1.his_average}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_1.his_highest}\",\"style\":0}},\"isDrag\":true},\"9\":{\"cells\":{\"1\":{\"merge\":[1,1]}}},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"left\"},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":24}},{\"font\":{\"bold\":true,\"size\":22}},{\"font\":{\"bold\":true,\"size\":22},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"usd\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"rmb\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":54},\"1\":{\"width\":111},\"2\":{\"width\":116},\"4\":{\"width\":122},\"len\":26},\"merges\":[\"C2:F2\",\"B10:C11\"],\"imgList\":[{\"row\":1,\"col\":1,\"width\":\"123\",\"height\":\"50\",\"src\":\"excel_online/QQ图片20210113125540_1610513793782.png\",\"layer_id\":\"D2luBqo7FDosHXdi\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-01-08 16:12:40', 'admin', '2021-01-13 14:13:10', 0, NULL, NULL, 1, 22); +INSERT INTO `jimu_report` VALUES ('1347459370216198144', '20210108164121', '实例:来源收入统计', NULL, NULL, 'datainfo', '{\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"624\",\"height\":\"281\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":15,\"sci\":0,\"eri\":15,\"eci\":25,\"width\":2477,\"height\":25},\"printElWidth\":899,\"excel_config_id\":\"1347459370216198144\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":777,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":91},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":26},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-08 16:41:21', 'admin', '2021-01-13 14:14:43', 0, NULL, NULL, 1, 37); +INSERT INTO `jimu_report` VALUES ('519c1c6f4d1f584ae8fa5b43b45acdc7', '56623333333', '销售单', '', NULL, 'printinfo', '{\"area\":{\"sri\":6,\"sci\":7,\"eri\":6,\"eci\":7,\"width\":88,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"519c1c6f4d1f584ae8fa5b43b45acdc7\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"销售单\",\"style\":40,\"merge\":[0,6]},\"2\":{\"style\":41},\"3\":{\"style\":41},\"4\":{\"style\":41},\"5\":{\"style\":41},\"6\":{\"style\":41},\"7\":{\"style\":41}},\"height\":99},\"1\":{\"cells\":{\"1\":{\"text\":\"商品编码\",\"style\":62},\"2\":{\"text\":\"商品名称\",\"style\":62},\"3\":{\"text\":\"销售时间\",\"style\":62},\"4\":{\"text\":\"销售数量\",\"style\":62},\"5\":{\"text\":\"定价\",\"style\":62},\"6\":{\"text\":\"优惠价\",\"style\":62},\"7\":{\"text\":\"付款金额\",\"style\":62}},\"height\":39},\"2\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.bianma}\",\"style\":61},\"2\":{\"text\":\"#{xiaoshou.cname}\",\"style\":61},\"3\":{\"text\":\"#{xiaoshou.ctime}\",\"style\":61},\"4\":{\"text\":\"#{xiaoshou.cnum}\",\"style\":61},\"5\":{\"text\":\"#{xiaoshou.cprice}\",\"style\":61},\"6\":{\"text\":\"#{xiaoshou.yprice}\",\"style\":61},\"7\":{\"text\":\"#{xiaoshou.ctotal}\",\"style\":61}},\"isDrag\":true,\"height\":35},\"3\":{\"cells\":{\"1\":{\"style\":44,\"text\":\"\"},\"2\":{\"style\":44},\"3\":{\"style\":44},\"4\":{\"style\":44},\"5\":{\"style\":44,\"text\":\"\"},\"6\":{\"text\":\"\",\"style\":45},\"7\":{\"style\":46,\"text\":\"=SUM(H3)\"}},\"isDrag\":true,\"height\":73},\"5\":{\"cells\":{},\"isDrag\":true},\"6\":{\"cells\":{},\"isDrag\":true},\"7\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":754,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fdc101\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fdc101\"},{\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffe59a\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffc001\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ed7d31\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":18}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"right\",\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffff01\"],\"top\":[\"thin\",\"#ffff01\"],\"left\":[\"thin\",\"#ffff01\"],\"right\":[\"thin\",\"#ffff01\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":31},\"1\":{\"width\":102},\"2\":{\"width\":170},\"3\":{\"width\":147},\"4\":{\"width\":66},\"5\":{\"width\":66},\"6\":{\"width\":84},\"7\":{\"width\":88},\"8\":{\"width\":121},\"len\":26},\"merges\":[\"B1:H1\"]}', '', 'https://static.jero.com/designreport/images/xiaoshou_1607310086160.png', 'jero', '2020-07-28 16:54:44', 'admin', '2021-01-13 14:12:44', 0, NULL, NULL, 1, 2072); +INSERT INTO `jimu_report` VALUES ('53c82a76f837d5661dceec7d93afafec', '5678', '阜阳检票数查询', '', NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":6,\"eri\":8,\"eci\":6,\"width\":75,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"53c82a76f837d5661dceec7d93afafec\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"\",\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":67,\"merge\":[0,3],\"text\":\"阜阳火车站检票数\"},\"4\":{\"style\":67},\"5\":{\"style\":67},\"6\":{\"style\":67},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":63},\"1\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":66},\"4\":{\"style\":66},\"5\":{\"style\":66},\"6\":{\"style\":66},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":20},\"2\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"日期:\",\"style\":68},\"2\":{\"text\":\"${gongsi.tdata}\",\"style\":69},\"3\":{\"style\":66},\"4\":{\"style\":66,\"text\":\"制表人:\"},\"5\":{\"text\":\"${gongsi.gname}\",\"style\":66},\"6\":{\"style\":66},\"7\":{\"text\":\"\",\"merge\":[0,1],\"style\":70},\"8\":{\"style\":70},\"9\":{\"style\":58}},\"isDrag\":true},\"3\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"班次\",\"merge\":[1,0],\"style\":71},\"2\":{\"text\":\"发车时间\",\"merge\":[1,0],\"style\":71},\"3\":{\"text\":\"是否放空\",\"merge\":[1,0],\"style\":71},\"4\":{\"text\":\"路线\",\"merge\":[0,1],\"style\":71},\"5\":{\"style\":72},\"6\":{\"text\":\"核载座位数\",\"merge\":[1,0],\"style\":71},\"7\":{\"merge\":[1,0],\"style\":71,\"text\":\"检票数\"},\"8\":{\"merge\":[1,0],\"style\":71,\"text\":\"实载率(%)\"},\"9\":{\"style\":58}}},\"4\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":72},\"2\":{\"style\":71},\"3\":{\"style\":72},\"4\":{\"text\":\"从\",\"style\":71},\"5\":{\"text\":\"到\",\"style\":71},\"6\":{\"style\":72},\"7\":{\"style\":71},\"8\":{\"style\":72},\"9\":{\"style\":58}},\"height\":25},\"5\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":73,\"text\":\"#{jianpiao.bnum}\"},\"2\":{\"style\":73,\"text\":\"#{jianpiao.ftime}\"},\"3\":{\"style\":73,\"text\":\"#{jianpiao.sfkong}\"},\"4\":{\"style\":73,\"text\":\"#{jianpiao.kaishi}\"},\"5\":{\"style\":73,\"text\":\"#{jianpiao.jieshu}\"},\"6\":{\"style\":73,\"text\":\"#{jianpiao.hezairen}\"},\"7\":{\"style\":73,\"text\":\"#{jianpiao.jpnum}\"},\"8\":{\"style\":73,\"text\":\"#{jianpiao.shihelv}\"},\"9\":{\"style\":58}},\"height\":33},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11,\"text\":\"\"},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"8\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"9\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"10\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"11\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"12\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"13\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"14\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"len\":96,\"-1\":{\"cells\":{\"-1\":{\"text\":\"${gongsi.id}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":737,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"],\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":22,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"宋体\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"right\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":53},\"1\":{\"width\":118},\"2\":{\"width\":75},\"3\":{\"width\":54},\"4\":{\"width\":95},\"5\":{\"width\":109},\"6\":{\"width\":75},\"7\":{\"width\":75},\"8\":{\"width\":83},\"9\":{\"width\":30},\"len\":27},\"merges\":[\"E4:F4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"G4:G5\",\"H4:H5\",\"I4:I5\",\"D1:G1\",\"H3:I3\"]}', '', 'https://static.jero.com/designreport/images/25_1597233573577.png', 'jero', '2020-06-16 15:01:42', 'admin', '2021-01-13 14:13:18', 0, NULL, NULL, 1, 681); +INSERT INTO `jimu_report` VALUES ('6059e405dd9c66a6d38e00841d2e40cc', '566777', '处方笺', '', NULL, 'printinfo', '{\"area\":{\"sri\":6,\"sci\":7,\"eri\":6,\"eci\":8,\"width\":171,\"height\":79},\"printElWidth\":794,\"excel_config_id\":\"6059e405dd9c66a6d38e00841d2e40cc\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"3\":{\"style\":80,\"text\":\" \"}},\"height\":96},\"1\":{\"cells\":{\"1\":{\"style\":24,\"text\":\" \"},\"2\":{\"style\":25,\"text\":\" \"},\"3\":{\"style\":25,\"text\":\" \"},\"4\":{\"style\":25,\"text\":\" \"},\"5\":{\"style\":25,\"text\":\" \"},\"6\":{\"style\":25,\"text\":\" \"},\"7\":{\"style\":25,\"text\":\" \"},\"8\":{\"style\":25,\"text\":\" \"},\"9\":{\"style\":25,\"text\":\" \"},\"10\":{\"style\":25,\"text\":\" \"},\"11\":{\"style\":25,\"text\":\" \"},\"12\":{\"style\":26,\"text\":\" \"}},\"height\":18},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":27},\"2\":{\"merge\":[0,9],\"text\":\"智能医学院处方笺\",\"style\":38},\"3\":{\"style\":12,\"text\":\" \"},\"4\":{\"style\":12,\"text\":\" \"},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"style\":12,\"text\":\" \"},\"8\":{\"style\":12,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":12,\"text\":\" \"},\"11\":{\"style\":12,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":124},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":46},\"2\":{\"merge\":[0,1],\"text\":\"姓名:\",\"style\":4},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yphone}\"},\"5\":{\"text\":\"性别:\",\"style\":42},\"6\":{\"text\":\"${yonghu.ysex}\",\"style\":42},\"7\":{\"text\":\"年龄:\",\"style\":47},\"8\":{\"text\":\"${yonghu.yage}\"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \",\"style\":42},\"11\":{\"style\":69,\"text\":\" \",\"merge\":[0,1]},\"12\":{\"style\":43,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":74},\"2\":{\"style\":4,\"merge\":[0,1],\"text\":\"单位:\"},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.danwei}\"},\"5\":{\"text\":\"电话:\"},\"6\":{\"text\":\"${yonghu.yphone}\",\"merge\":[0,5]},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":29},\"5\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"merge\":[0,1],\"text\":\"初步诊断:\",\"style\":4},\"3\":{\"text\":\" \",\"style\":4},\"4\":{\"text\":\"${yonghu.yjieguo}\",\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true,\"height\":34},\"6\":{\"cells\":{\"1\":{\"text\":\" RP:\",\"merge\":[0,2],\"style\":79},\"2\":{\"style\":11,\"text\":\" \"},\"3\":{\"style\":11,\"text\":\" \"},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"},\"6\":{\"style\":0,\"text\":\" \"},\"7\":{\"style\":0,\"text\":\" \"},\"8\":{\"style\":0,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":0,\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{},\"16\":{}},\"height\":79},\"7\":{\"cells\":{\"1\":{\"text\":\".\",\"style\":48},\"2\":{\"text\":\"\",\"style\":1},\"3\":{\"text\":\"#{yaopin.name}\"},\"4\":{},\"5\":{},\"6\":{},\"7\":{\"text\":\"#{yaopin.percent}\"},\"8\":{},\"9\":{},\"10\":{},\"11\":{\"text\":\"\"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{}},\"isDrag\":true,\"height\":37},\"8\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":27},\"9\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医嘱:\",\"style\":76},\"3\":{\"text\":\"${yonghu.yizhu}\",\"style\":6,\"merge\":[0,8]},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"10\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"药品费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yprice}\",\"style\":6},\"5\":{\"merge\":[0,1],\"text\":\"中成药费\",\"style\":6},\"6\":{\"text\":\" \"},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"text\":\"治疗费\",\"merge\":[0,2],\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"11\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"检查费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"text\":\" \"},\"5\":{\"merge\":[0,1],\"text\":\"换药费\",\"style\":6},\"6\":{\"text\":\" \"},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"诊疗费\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\"${yonghu.yzhenliao}\",\"style\":6},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"注射费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"merge\":[0,3],\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"其他\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"合计\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.ytotal}\",\"style\":6,\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"14\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":9},\"15\":{\"cells\":{\"0\":{\"text\":\" \"},\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医师:\",\"style\":4,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yishe}\",\"style\":80},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"text\":\"日期:\",\"style\":4},\"9\":{\"text\":\"${yonghu.kdata}\",\"style\":80,\"merge\":[0,2]},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":71,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true,\"height\":43},\"16\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"style\":80,\"text\":\" \"},\"3\":{\"style\":80,\"text\":\" \"},\"4\":{\"style\":80,\"text\":\" \"},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"style\":80,\"text\":\" \"},\"9\":{\"style\":80,\"text\":\" \"},\"10\":{\"style\":80,\"text\":\" \"},\"11\":{\"style\":80,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":17},\"17\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":32},\"2\":{\"text\":\" \",\"style\":33},\"3\":{\"style\":33,\"text\":\" \"},\"4\":{\"text\":\" \",\"style\":33},\"5\":{\"text\":\" \",\"style\":33},\"6\":{\"text\":\" \",\"style\":33},\"7\":{\"text\":\" \",\"style\":33},\"8\":{\"text\":\" \",\"style\":33},\"9\":{\"text\":\" \",\"style\":33},\"10\":{\"text\":\" \",\"style\":33},\"11\":{\"text\":\" \",\"style\":33},\"12\":{\"text\":\" \",\"style\":34}}},\"18\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"len\":94,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{yaopin.key2}\"},\"-1\":{\"text\":\"#{yaopin.key1}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":854,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":12}},{\"font\":{\"size\":10}},{\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15}},{\"align\":\"left\"},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":true}},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\"},{\"font\":{\"size\":10},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"right\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":true},{\"font\":{\"size\":10},\"textwrap\":true},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false},{\"font\":{\"size\":10},\"textwrap\":false},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":15},\"align\":\"right\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{},{\"font\":{\"size\":15,\"bold\":true},\"align\":\"center\"},{\"align\":\"right\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":41},\"1\":{\"width\":14},\"2\":{\"width\":56},\"3\":{\"width\":54},\"4\":{\"width\":156},\"5\":{\"width\":41},\"6\":{\"width\":18},\"7\":{\"width\":113},\"8\":{\"width\":58},\"9\":{\"width\":20},\"10\":{\"width\":23},\"11\":{\"width\":148},\"12\":{\"width\":12},\"len\":29},\"merges\":[\"C3:E3\",\"C7:E7\",\"H3:I3\",\"H7:I7\",\"C7:E7\",\"H7:I7\",\"F11:G11\",\"I11:K11\",\"F12:G12\",\"I12:K12\",\"I13:K13\",\"E13:H13\",\"C11:D11\",\"C12:D12\",\"C13:D13\",\"C14:D14\",\"C16:D16\",\"L4:M4\",\"C3:L3\",\"B7:D7\",\"C4:D4\",\"C5:D5\",\"E14:L14\",\"J16:L16\",\"D10:L10\",\"G5:L5\",\"C6:D6\",\"E6:L6\"]}', '', 'https://static.jero.com/designreport/images/处方_1607071731580.png', 'jero', '2020-07-10 17:12:16', 'admin', '2021-01-13 14:13:00', 0, NULL, NULL, 1, 819); +INSERT INTO `jimu_report` VALUES ('6d6bdcb5e820c301ea32789e3ae43c44', '1223', '供电公司抢修单', '', NULL, 'printinfo', '{\"area\":false,\"printElWidth\":794,\"excel_config_id\":\"6d6bdcb5e820c301ea32789e3ae43c44\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{},\"height\":11},\"1\":{\"cells\":{\"1\":{\"text\":\"供电公司抢修竣工单\",\"merge\":[0,5],\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":39},\"6\":{\"style\":39}},\"height\":84},\"2\":{\"cells\":{\"1\":{\"text\":\"填报单位:\",\"style\":26},\"2\":{\"text\":\"#{qiangxiu.danwei}\",\"style\":27},\"3\":{\"style\":27},\"4\":{\"text\":\"\",\"style\":27},\"5\":{\"text\":\"填报日期:\",\"style\":26},\"6\":{\"text\":\"#{qiangxiu.time}\",\"style\":27}}},\"3\":{\"cells\":{\"1\":{\"text\":\"填报名称:\",\"style\":26},\"2\":{\"text\":\"#{qiangxiu.ktime}\",\"style\":27},\"3\":{\"style\":27},\"4\":{\"style\":27},\"5\":{\"text\":\"项目编号:\",\"style\":26},\"6\":{\"text\":\"#{qiangxiu.wtime}\",\"style\":27}}},\"4\":{\"cells\":{\"1\":{\"style\":28},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":10},\"5\":{\"cells\":{\"1\":{\"text\":\"项目批准核算\",\"style\":29},\"2\":{\"text\":\"#{qiangxiu.yusuan}\",\"style\":30,\"merge\":[0,4]},\"3\":{\"style\":31},\"4\":{\"style\":31},\"5\":{\"style\":31},\"6\":{\"style\":31}},\"height\":89},\"6\":{\"cells\":{\"1\":{\"text\":\"开工日期\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.ktime}\",\"merge\":[0,1]},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"完工日期\"},\"5\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.wtime}\"},\"6\":{\"style\":28}},\"height\":31},\"7\":{\"cells\":{\"1\":{\"text\":\"完工主要内容\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4],\"text\":\"#{qiangxiu.neirong}\"},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":71},\"8\":{\"cells\":{\"1\":{\"text\":\"形成能力\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4],\"text\":\"#{qiangxiu.nengli}\"},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":49},\"9\":{\"cells\":{\"1\":{\"text\":\"目标效益验收意见\",\"style\":32},\"2\":{\"style\":35,\"merge\":[0,4],\"text\":\"#{qiangxiu.yijian}\"},\"3\":{\"style\":36},\"4\":{\"style\":36},\"5\":{\"style\":36},\"6\":{\"style\":36}},\"height\":100},\"10\":{\"cells\":{\"1\":{\"style\":37,\"text\":\" \",\"merge\":[0,3]},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":37,\"text\":\"#{qiangxiu.time1}\",\"merge\":[0,1]},\"6\":{\"style\":28}}},\"11\":{\"cells\":{\"1\":{\"text\":\"实施质量验收评价\",\"style\":32},\"2\":{\"style\":35,\"merge\":[0,4],\"text\":\"#{qiangxiu.pingjia}\"},\"3\":{\"style\":36},\"4\":{\"style\":36},\"5\":{\"style\":36},\"6\":{\"style\":36}},\"height\":99},\"12\":{\"cells\":{\"1\":{\"style\":33,\"merge\":[0,3]},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.time1}\"},\"6\":{\"style\":28}}},\"13\":{\"cells\":{\"1\":{\"text\":\"验收总结\",\"style\":32},\"2\":{\"style\":35,\"merge\":[0,4],\"text\":\"#{qiangxiu.zongjie}\"},\"3\":{\"style\":36},\"4\":{\"style\":36},\"5\":{\"style\":36},\"6\":{\"style\":36}},\"height\":80},\"14\":{\"cells\":{\"1\":{\"text\":\"责任单位意见\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4]},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":67},\"15\":{\"cells\":{\"1\":{\"text\":\"责任单位审核人\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.dshenhe}\"},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"日期\"},\"5\":{\"style\":33,\"text\":\"#{qiangxiu.time3}\",\"merge\":[0,1]},\"6\":{\"style\":28}},\"height\":42},\"16\":{\"cells\":{\"1\":{\"text\":\"生技部审批意见\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4]},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":107},\"17\":{\"cells\":{\"1\":{\"text\":\"生技部主任\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.zhuren}\"},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"日期\"},\"5\":{\"style\":33,\"text\":\"#{qiangxiu.time4}\",\"merge\":[0,1]},\"6\":{\"style\":28}},\"height\":41},\"18\":{\"cells\":{\"1\":{\"style\":28},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":768,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#9cc2e6\"},{\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"#ffffff\"},{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\"},{\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false},{\"textwrap\":false},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"right\",\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#ffffff\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"宋体\"}},{\"textwrap\":true,\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":false,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":131},\"3\":{\"width\":123},\"4\":{\"width\":127},\"5\":{\"width\":76},\"6\":{\"width\":188},\"len\":26},\"merges\":[\"C6:G6\",\"C7:D7\",\"F7:G7\",\"B2:G2\",\"C8:G8\",\"C9:G9\",\"C10:G10\",\"B11:E11\",\"F11:G11\",\"C12:G12\",\"B13:E13\",\"F13:G13\",\"C14:G14\",\"C15:G15\",\"C16:D16\",\"C17:G17\",\"C18:D18\",\"F16:G16\",\"F18:G18\"]}', '', 'https://static.jero.com/designreport/images/222_1607311944321.png', 'jero', '2020-07-20 19:37:54', 'admin', '2021-01-13 14:12:48', 0, NULL, NULL, 1, 151); +INSERT INTO `jimu_report` VALUES ('7905022412733a0c68dc7b4ef8947489', '8996445', '介绍信', '', NULL, 'printinfo', '{\"area\":{\"sri\":12,\"sci\":8,\"eri\":12,\"eci\":10,\"width\":137,\"height\":30},\"printElWidth\":794,\"excel_config_id\":\"7905022412733a0c68dc7b4ef8947489\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{},\"12\":{}},\"height\":11},\"1\":{\"cells\":{},\"height\":24},\"2\":{\"cells\":{},\"isDrag\":true,\"height\":43},\"3\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":46},\"1\":{\"merge\":[0,10],\"text\":\"介绍信\",\"style\":337},\"2\":{\"style\":337},\"3\":{\"style\":337},\"4\":{\"style\":337},\"5\":{\"style\":337},\"6\":{\"style\":337},\"7\":{\"style\":337},\"8\":{\"style\":337},\"9\":{\"style\":337},\"10\":{\"style\":337},\"11\":{\"style\":337}},\"height\":216},\"4\":{\"cells\":{\"1\":{\"text\":\"${jieshaoxin.name}\",\"style\":338,\"merge\":[0,3]},\"2\":{\"style\":338},\"3\":{\"style\":338},\"4\":{\"style\":338},\"5\":{\"text\":\":\",\"style\":339},\"6\":{\"style\":339},\"7\":{\"style\":339},\"8\":{\"style\":339},\"9\":{\"style\":339},\"10\":{\"style\":339},\"11\":{\"style\":339},\"12\":{\"style\":316}},\"isDrag\":true,\"height\":80},\"5\":{\"cells\":{\"1\":{\"text\":\"兹介绍我局\",\"style\":340,\"merge\":[0,5]},\"2\":{\"style\":339},\"3\":{\"style\":339},\"4\":{\"style\":339},\"5\":{\"style\":339},\"6\":{\"style\":339},\"7\":{\"text\":\"${jieshaoxin.value}\",\"style\":341},\"8\":{\"text\":\"同志\",\"style\":339},\"9\":{\"text\":\"#{jieshaoxin.percent}\",\"style\":339},\"10\":{\"text\":\"人,前往你处\",\"style\":339,\"merge\":[0,1]},\"11\":{\"style\":339},\"12\":{\"style\":316}},\"isDrag\":true,\"height\":42},\"6\":{\"cells\":{\"1\":{\"text\":\"${jieshaoxin.shiqing}\",\"style\":342,\"merge\":[0,5]},\"2\":{\"style\":339},\"3\":{\"style\":339},\"4\":{\"style\":339},\"5\":{\"style\":339},\"6\":{\"style\":339},\"7\":{\"style\":339},\"8\":{\"style\":339},\"9\":{\"style\":339},\"10\":{\"style\":339},\"11\":{\"style\":339},\"12\":{\"style\":316},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":48},\"7\":{\"cells\":{\"1\":{\"style\":343,\"text\":\"\"},\"2\":{\"style\":344,\"merge\":[0,5],\"text\":\"请予接洽并给予帮助。\"},\"3\":{\"style\":339},\"4\":{\"style\":339},\"5\":{\"style\":339},\"6\":{\"style\":339},\"7\":{\"style\":339},\"8\":{\"style\":316},\"9\":{\"style\":316},\"10\":{\"style\":316},\"11\":{\"style\":316},\"12\":{\"style\":316}},\"height\":56},\"8\":{\"cells\":{\"1\":{\"style\":345},\"2\":{\"style\":316},\"3\":{\"style\":316},\"4\":{\"style\":316},\"5\":{\"style\":316},\"6\":{\"style\":316},\"7\":{\"style\":316},\"8\":{\"style\":316},\"9\":{\"style\":316},\"10\":{\"style\":316},\"11\":{\"style\":316},\"12\":{\"style\":316}},\"height\":15},\"9\":{\"cells\":{\"1\":{\"style\":316},\"2\":{\"style\":316},\"3\":{\"style\":316},\"4\":{\"style\":316},\"5\":{\"style\":316},\"6\":{\"style\":316},\"7\":{\"style\":316},\"8\":{\"style\":316},\"9\":{\"style\":316},\"10\":{\"style\":316},\"11\":{\"style\":316},\"12\":{\"style\":316}},\"height\":11},\"10\":{\"cells\":{\"1\":{\"style\":316},\"2\":{\"style\":316},\"3\":{\"style\":316},\"4\":{\"style\":316},\"5\":{\"style\":316},\"6\":{\"style\":316},\"7\":{\"style\":346},\"8\":{\"text\":\"\",\"style\":316,\"merge\":[0,3]},\"9\":{\"style\":316},\"10\":{\"style\":316},\"11\":{\"style\":316},\"12\":{\"style\":316},\"13\":{\"style\":31}},\"height\":39},\"11\":{\"cells\":{\"1\":{\"style\":316},\"2\":{\"style\":316},\"3\":{\"style\":316},\"4\":{\"style\":316},\"5\":{\"style\":316},\"6\":{\"style\":316},\"7\":{\"style\":346},\"8\":{\"merge\":[0,2],\"text\":\"单位盖章\",\"style\":347},\"9\":{\"style\":347},\"10\":{\"style\":347},\"11\":{\"merge\":[0,1],\"style\":316},\"12\":{\"style\":316}},\"height\":84},\"12\":{\"cells\":{\"1\":{\"merge\":[0,2],\"text\":\"\",\"style\":317},\"2\":{\"style\":317},\"3\":{\"style\":317},\"4\":{\"merge\":[0,2],\"text\":\"\",\"style\":346},\"5\":{\"style\":346},\"6\":{\"style\":346},\"7\":{\"text\":\"(有效时间:至\",\"style\":317},\"8\":{\"text\":\"${jieshaoxin.gdata}\",\"style\":316,\"merge\":[0,2]},\"9\":{\"style\":316},\"10\":{\"style\":316},\"11\":{\"style\":348,\"text\":\"止)\"},\"12\":{\"style\":316}},\"isDrag\":true,\"height\":30},\"13\":{\"cells\":{\"1\":{\"merge\":[12,11]}}},\"17\":{\"cells\":{},\"isDrag\":true},\"len\":89},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":749,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"color\":\"#000100\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"valign\":\"top\"},{\"valign\":\"top\",\"align\":\"center\"},{\"valign\":\"top\",\"align\":\"center\",\"font\":{\"size\":12}},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"left\"},{\"align\":\"left\",\"font\":{\"bold\":true,\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":18},\"valign\":\"top\"},{\"align\":\"right\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"align\":\"center\"},{\"align\":\"left\",\"font\":{\"size\":10}},{\"align\":\"right\",\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":22},\"valign\":\"top\"},{\"align\":\"right\",\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14},\"align\":\"center\"},{\"valign\":\"top\",\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":46},\"2\":{\"width\":24},\"3\":{\"width\":15},\"4\":{\"width\":37},\"5\":{\"width\":13},\"6\":{\"width\":83},\"7\":{\"width\":256},\"8\":{\"width\":42},\"9\":{\"width\":18},\"10\":{\"width\":77},\"11\":{\"width\":65},\"12\":{\"width\":108},\"13\":{\"width\":62},\"16\":{\"width\":55},\"len\":29},\"merges\":[\"C0:D0\",\"G11:H11\",\"G12:H12\",\"B5:E5\",\"B6:G6\",\"C8:H8\",\"I12:K12\",\"B4:L4\",\"K6:L6\",\"B13:D13\",\"E13:G13\",\"I11:L11\",\"L12:M12\",\"B14:M26\",\"I13:K13\",\"B7:G7\"]}', '', 'https://static.jero.com/designreport/images/介绍xin_1607072641405.png', 'jero', '2020-07-10 13:38:40', 'admin', '2021-01-13 14:11:55', 0, NULL, NULL, 1, 819); +INSERT INTO `jimu_report` VALUES ('7c02c224a2db56d0350069650033f702', '895666', '核查评估表', '', NULL, 'printinfo', '{\"area\":false,\"printElWidth\":1399,\"excel_config_id\":\"7c02c224a2db56d0350069650033f702\",\"printElHeight\":790,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"XX县(市、区)YY低保第三方核查评估汇总表\",\"merge\":[0,21],\"style\":386},\"2\":{\"style\":386},\"3\":{\"style\":386},\"4\":{\"style\":386},\"5\":{\"style\":386},\"6\":{\"style\":386},\"7\":{\"style\":386},\"8\":{\"style\":386},\"9\":{\"style\":386},\"10\":{\"style\":386},\"11\":{\"style\":386},\"12\":{\"style\":386},\"13\":{\"style\":386},\"14\":{\"style\":386},\"15\":{\"style\":386},\"16\":{\"style\":386},\"17\":{\"style\":386},\"18\":{\"style\":386},\"19\":{\"style\":386},\"20\":{\"style\":386},\"21\":{\"style\":386},\"22\":{\"style\":386}},\"height\":70},\"1\":{\"cells\":{\"1\":{\"merge\":[0,2],\"style\":403,\"text\":\" 北京市林翠社区\"},\"2\":{\"style\":398,\"text\":\" \"},\"3\":{\"style\":398,\"text\":\" \"},\"4\":{\"merge\":[0,2],\"text\":\"镇(乡、街道办事处)\",\"style\":399},\"5\":{\"style\":399},\"6\":{\"style\":399},\"7\":{\"style\":399,\"merge\":[0,7]},\"8\":{\"style\":400},\"9\":{\"style\":400},\"10\":{\"style\":400},\"11\":{\"style\":400},\"12\":{\"style\":400},\"13\":{\"style\":400},\"14\":{\"style\":400},\"15\":{\"merge\":[0,7],\"text\":\"单位:人、元、套、平方米\",\"style\":398},\"16\":{\"style\":401},\"17\":{\"style\":401},\"18\":{\"style\":401},\"19\":{\"style\":401},\"20\":{\"style\":401},\"21\":{\"style\":401},\"22\":{\"style\":401}}},\"2\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":14},\"3\":{\"cells\":{\"1\":{\"style\":406,\"text\":\"村(社区)名称\",\"merge\":[1,0]},\"2\":{\"style\":407,\"text\":\"户主名称\",\"merge\":[1,0]},\"3\":{\"style\":407,\"text\":\"保障编号\",\"merge\":[1,0]},\"4\":{\"style\":408,\"text\":\"家庭人口\",\"merge\":[1,0]},\"5\":{\"style\":409,\"text\":\"家庭住址\",\"merge\":[1,0]},\"6\":{\"style\":409,\"text\":\"联系电话\",\"merge\":[1,0]},\"7\":{\"style\":408,\"text\":\"身份证号码\",\"merge\":[1,0]},\"8\":{\"style\":409,\"text\":\"原保障\",\"merge\":[0,2]},\"9\":{\"style\":377,\"text\":\" \"},\"10\":{\"style\":377,\"text\":\" \"},\"11\":{\"text\":\"核减后月人均收入\",\"style\":408,\"merge\":[1,0]},\"12\":{\"merge\":[0,5],\"text\":\"保障建议\",\"style\":410},\"13\":{\"style\":379,\"text\":\" \"},\"14\":{\"style\":379,\"text\":\" \"},\"15\":{\"style\":379,\"text\":\" \"},\"16\":{\"style\":379,\"text\":\" \"},\"17\":{\"style\":379,\"text\":\" \"},\"18\":{\"text\":\"是否新增对象\",\"style\":411,\"merge\":[1,0]},\"19\":{\"text\":\"建议取消原因\",\"style\":409,\"merge\":[0,3]},\"20\":{\"style\":377,\"text\":\" \"},\"21\":{\"style\":377,\"text\":\" \"},\"22\":{\"style\":377,\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"style\":381,\"text\":\" \"},\"2\":{\"style\":407,\"text\":\" \"},\"3\":{\"style\":382,\"text\":\" \"},\"4\":{\"style\":408,\"text\":\" \"},\"5\":{\"style\":377,\"text\":\" \"},\"6\":{\"style\":409,\"text\":\" \"},\"7\":{\"style\":383,\"text\":\" \"},\"8\":{\"text\":\"户数\",\"style\":412},\"9\":{\"style\":411,\"text\":\"人口\"},\"10\":{\"style\":413,\"text\":\"金额\"},\"11\":{\"style\":383,\"text\":\" \"},\"12\":{\"text\":\"保障类型\",\"style\":408},\"13\":{\"style\":413,\"text\":\"人口\"},\"14\":{\"style\":408,\"text\":\"差额补助\"},\"15\":{\"style\":408,\"text\":\"全额补助\"},\"16\":{\"style\":408,\"text\":\"增发补助\"},\"17\":{\"style\":408,\"text\":\"合计补助\"},\"18\":{\"style\":411,\"text\":\" \"},\"19\":{\"style\":408,\"text\":\"收入超标\"},\"20\":{\"style\":406,\"text\":\"机动车超标\"},\"21\":{\"style\":410,\"text\":\"死亡\"},\"22\":{\"style\":410,\"text\":\"其他\"}},\"height\":50},\"5\":{\"cells\":{\"1\":{\"text\":\"#{huizong1.cname}\",\"style\":414},\"2\":{\"text\":\"#{huizong1.hname}\",\"style\":414},\"3\":{\"text\":\"#{huizong1.num}\",\"style\":414},\"4\":{\"text\":\"#{huizong1.jtotal}\",\"style\":414},\"5\":{\"text\":\"#{huizong1.jaddress}\",\"style\":414},\"6\":{\"text\":\"#{huizong1.snum}\",\"style\":414},\"7\":{\"text\":\"#{huizong1.snum}\",\"style\":414},\"8\":{\"text\":\"#{huizong1.hushu}\",\"style\":414},\"9\":{\"text\":\"#{huizong1.renkou}\",\"style\":414},\"10\":{\"text\":\"#{huizong1.money}\",\"style\":414},\"11\":{\"text\":\"#{huizong1.shouru}\",\"style\":414},\"12\":{\"text\":\"#{huizong1.bkey}\",\"style\":414},\"13\":{\"text\":\"#{huizong1.brenkou}\",\"style\":414},\"14\":{\"text\":\"#{huizong1.cbuzhu}\",\"style\":414},\"15\":{\"text\":\"#{huizong1.qbuzhu}\",\"style\":414},\"16\":{\"text\":\"#{huizong1.zbuzhu}\",\"style\":414},\"17\":{\"text\":\"#{huizong1.qbuzhu}\",\"style\":414},\"18\":{\"text\":\"#{huizong1.sxinzeng}\",\"style\":414},\"19\":{\"text\":\"#{huizong1.schaobiao}\",\"style\":414},\"20\":{\"text\":\"#{huizong1.jchaobiao}\",\"style\":414},\"21\":{\"text\":\"#{huizong1.die}\",\"style\":414},\"22\":{\"text\":\"#{huizong1.qita}\",\"style\":414}},\"isDrag\":true,\"height\":46},\"6\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":46},\"7\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":46},\"8\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"isDrag\":true},\"len\":102},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1378,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false},{\"textwrap\":false},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"middle\"},{\"textwrap\":true,\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false,\"valign\":\"middle\"},{\"textwrap\":false,\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\"},{\"textwrap\":true,\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"top\"},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Verdana\"}},{\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Verdana\"}},{\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"}},{\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":false,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"valign\":\"middle\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"align\":\"right\"},{\"font\":{\"name\":\"Lato\"},\"align\":\"right\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]},\"align\":\"center\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"size\":15,\"bold\":true,\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9}},{\"font\":{\"name\":\"Lato\",\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#a5a5a5\"},{\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#a5a5a5\"},{\"font\":{\"size\":9},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"size\":9},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":9},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":9},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"align\":\"center\",\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"0\":{\"width\":30},\"1\":{\"width\":68},\"2\":{\"width\":86},\"3\":{\"width\":93},\"4\":{\"width\":91},\"5\":{\"width\":156},\"6\":{\"width\":95},\"7\":{\"width\":85},\"8\":{\"width\":37},\"9\":{\"width\":30},\"10\":{\"width\":43},\"11\":{\"width\":66},\"12\":{\"width\":38},\"13\":{\"width\":41},\"14\":{\"width\":54},\"15\":{\"width\":49},\"16\":{\"width\":45},\"17\":{\"width\":49},\"18\":{\"width\":53},\"19\":{\"width\":40},\"20\":{\"width\":50},\"21\":{\"width\":40},\"22\":{\"width\":39},\"len\":29},\"merges\":[\"M4:R4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"E4:E5\",\"F4:F5\",\"G4:G5\",\"H4:H5\",\"I4:K4\",\"L4:L5\",\"S4:S5\",\"T4:W4\",\"E2:G2\",\"B2:D2\",\"B1:W1\",\"P2:W2\",\"H2:O2\"]}', '', 'https://static.jero.com/designreport/images/QQ截图20201207113312_1607312171402.png', 'jero', '2020-07-14 16:41:42', 'admin', '2021-01-13 14:12:55', 0, NULL, NULL, 1, 245); +INSERT INTO `jimu_report` VALUES ('94b04a1ed7c17f8e96baa6d89fb90758', '3698522', '员工请假单', '', NULL, 'printinfo', '{\"area\":false,\"printElWidth\":794,\"excel_config_id\":\"94b04a1ed7c17f8e96baa6d89fb90758\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\"员工请假单\",\"style\":100,\"merge\":[0,7]},\"1\":{\"style\":100},\"2\":{\"style\":100},\"3\":{\"style\":100},\"4\":{\"style\":100},\"5\":{\"style\":100},\"6\":{\"style\":100},\"7\":{\"style\":100}},\"height\":65},\"2\":{\"cells\":{\"0\":{\"text\":\"单位:北极星\",\"style\":101,\"merge\":[0,2]},\"1\":{\"style\":101},\"2\":{\"style\":101},\"3\":{\"style\":102},\"4\":{\"style\":102},\"5\":{\"style\":102},\"6\":{\"style\":102},\"7\":{\"style\":102}},\"height\":38},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":119},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"text\":\"工作岗位\",\"style\":120},\"3\":{\"style\":119,\"text\":\" \"},\"4\":{\"text\":\"工作时间\",\"style\":119},\"5\":{\"style\":119,\"text\":\" \"},\"6\":{\"text\":\"出生日期\",\"style\":119},\"7\":{\"style\":119,\"text\":\" \"}}},\"4\":{\"cells\":{\"0\":{\"text\":\"请选择假类型\",\"style\":121,\"merge\":[4,0]},\"1\":{\"text\":\"年休假\",\"style\":120},\"2\":{\"style\":120,\"text\":\"病、事假\"},\"3\":{\"style\":120,\"text\":\"探亲假\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"婚、丧假\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"生育假\"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":29},\"5\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"text\":\"1、公岭满1~9年(5天)\",\"style\":122},\"2\":{\"style\":119,\"text\":\"1、病假\"},\"3\":{\"style\":119,\"text\":\"1、未婚探父母(20天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"1、婚假(3天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"1、流产\"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":25},\"6\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":123,\"text\":\"2、公岭满10~19年(10天)\"},\"2\":{\"style\":119,\"text\":\"2、事假\"},\"3\":{\"style\":119,\"text\":\"2、已婚探父母(20天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"2、晚婚假(13天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"2、产假\"},\"7\":{\"style\":107,\"text\":\" \"}}},\"7\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":123,\"text\":\"3、公岭满20年(15天)\"},\"2\":{\"style\":119,\"text\":\" \"},\"3\":{\"style\":119,\"text\":\"3、探配偶(30天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"3、丧假(3天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"3、哺乳假\"},\"7\":{\"style\":107,\"text\":\" \"}}},\"8\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"style\":119,\"text\":\" \"},\"3\":{\"style\":119,\"text\":\"探亲地点:\",\"merge\":[0,2]},\"4\":{\"style\":107,\"text\":\" \"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"4、陪护假\"},\"7\":{\"style\":107,\"text\":\" \"},\"8\":{\"style\":15},\"9\":{\"style\":15},\"10\":{\"style\":15},\"11\":{\"style\":15},\"12\":{\"style\":15},\"13\":{\"style\":15},\"14\":{\"style\":15},\"15\":{\"style\":15},\"16\":{\"style\":15},\"17\":{\"style\":15},\"18\":{\"style\":15},\"19\":{\"style\":15},\"20\":{\"style\":15},\"21\":{\"style\":15},\"22\":{\"style\":15},\"23\":{\"style\":5},\"24\":{\"style\":5},\"25\":{\"style\":5}}},\"9\":{\"cells\":{\"0\":{\"style\":124,\"text\":\"请假时间\"},\"1\":{\"style\":125,\"merge\":[0,6],\"text\":\"2020年02-30 至2020年02-03-30\"},\"2\":{\"style\":115,\"text\":\" \"},\"3\":{\"style\":115,\"text\":\" \"},\"4\":{\"style\":115,\"text\":\" \"},\"5\":{\"style\":115,\"text\":\" \"},\"6\":{\"style\":115,\"text\":\" \"},\"7\":{\"style\":115,\"text\":\" \"}},\"height\":46},\"10\":{\"cells\":{\"0\":{\"style\":126,\"text\":\"审批人员及意见\"},\"1\":{\"merge\":[0,6],\"style\":127,\"text\":\"同意\"},\"2\":{\"style\":118,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"style\":118,\"text\":\" \"},\"5\":{\"style\":118,\"text\":\" \"},\"6\":{\"style\":118,\"text\":\" \"},\"7\":{\"style\":118,\"text\":\" \"}},\"height\":89},\"11\":{\"cells\":{\"0\":{\"text\":\"备注\",\"style\":119},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"text\":\"请假人签名\",\"style\":119},\"3\":{\"merge\":[0,4],\"style\":119,\"text\":\" \"},\"4\":{\"style\":107,\"text\":\" \"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":107,\"text\":\" \"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":90},\"12\":{\"cells\":{\"0\":{\"merge\":[0,7],\"style\":120,\"text\":\"请假审批表一式两份,考勤员与人力资源部门各存一份\"},\"1\":{\"style\":106,\"text\":\" \"},\"2\":{\"style\":106,\"text\":\" \"},\"3\":{\"style\":106,\"text\":\" \"},\"4\":{\"style\":106,\"text\":\" \"},\"5\":{\"style\":106,\"text\":\" \"},\"6\":{\"style\":106,\"text\":\" \"},\"7\":{\"style\":106,\"text\":\" \"}},\"height\":25},\"len\":101},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":789,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"textwrap\":true},{\"textwrap\":false},{\"textwrap\":true,\"valign\":\"middle\"},{\"textwrap\":false,\"valign\":\"middle\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\"},{},{\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\"},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\",\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\",\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#7f7f7f\"},{\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"middle\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"bottom\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":true},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":true},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":false},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":false},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":14,\"bold\":true}},{\"font\":{\"name\":\"宋体\"},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"宋体\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false}],\"validations\":[],\"cols\":{\"0\":{\"width\":35},\"1\":{\"width\":195},\"2\":{\"width\":77},\"3\":{\"width\":168},\"4\":{\"width\":62},\"6\":{\"width\":70},\"7\":{\"width\":82},\"len\":26},\"merges\":[\"D9:F9\",\"E5:F5\",\"E6:F6\",\"E7:F7\",\"E8:F8\",\"G5:H5\",\"G6:H6\",\"G7:H7\",\"G8:H8\",\"G9:H9\",\"B10:H10\",\"B11:H11\",\"D12:H12\",\"A13:H13\",\"A3:C3\",\"A2:H2\",\"A5:A9\"]}', '', 'https://static.jero.com/designreport/images/QQ截图20201207135257_1607320433681.png', 'jero', '2020-07-10 18:29:39', 'admin', '2021-01-13 14:12:58', 0, NULL, NULL, 1, 134); +INSERT INTO `jimu_report` VALUES ('9dbadaee8720767efe3164a7d018c870', '45566', '发票打印', '', NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":4,\"eri\":8,\"eci\":4,\"width\":100,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"9dbadaee8720767efe3164a7d018c870\",\"printElHeight\":500,\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"1\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"2\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"3\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"4\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"5\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"6\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"7\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"8\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"}}},\"2\":{\"cells\":{},\"height\":11},\"3\":{\"cells\":{\"2\":{\"text\":\"\"},\"5\":{\"text\":\"\"}},\"height\":18},\"4\":{\"cells\":{\"2\":{\"text\":\"182123434\",\"style\":0},\"5\":{\"text\":\"12345678\"}},\"height\":15},\"5\":{\"cells\":{\"2\":{\"text\":\"\"}}},\"7\":{\"cells\":{}},\"8\":{\"cells\":{\"1\":{\"text\":\"餐饮\"},\"2\":{\"text\":\" A11\"},\"3\":{\"text\":\" 333 3\"},\"4\":{\"text\":\" 3 4\"},\"5\":{\"text\":\" 1\"},\"6\":{\"text\":\"3333\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"测试\"},\"2\":{\"text\":\" mmm\"},\"3\":{\"text\":\" 33 5\"}}},\"10\":{\"cells\":{},\"height\":22},\"11\":{\"cells\":{\"2\":{\"text\":\" \"},\"3\":{\"text\":\"343434\"},\"6\":{\"text\":\"3434\"}},\"height\":45},\"12\":{\"cells\":{\"4\":{\"text\":\" 刮开中奖\"}},\"height\":12},\"13\":{\"cells\":{\"2\":{\"text\":\"\"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\"备注\"}},\"height\":31},\"14\":{\"cells\":{\"1\":{\"text\":\" 张三\"},\"3\":{\"text\":\"完成\"},\"4\":{\"text\":\" 李思\"}},\"height\":41},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":847,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"0\":{\"width\":93},\"1\":{\"width\":74},\"2\":{\"width\":80},\"len\":26},\"merges\":[],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"832\",\"height\":\"480\",\"src\":\"https://static.jero.com/designreport/images/套打_1609313052910.png\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"RTA6TUIKs1pmgVOM\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8]]}]}', '', 'https://static.jero.com/designreport/images/QQ截图20201207113651_1607312223499.png', 'jero', '2020-07-20 18:55:59', 'admin', '2021-01-13 14:12:52', 0, NULL, NULL, 1, 1120); +INSERT INTO `jimu_report` VALUES ('a250846887abe01217aab173d3006489', '56663', '不动产打印', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":947,\"excel_config_id\":\"a250846887abe01217aab173d3006489\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"1\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"2\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"3\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"4\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"5\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"6\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"7\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"8\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"},\"9\":{\"text\":\" \",\"virtual\":\"TyDjQJrN7mqW5MdT\"}},\"isDrag\":true,\"height\":45},\"1\":{\"cells\":{\"0\":{\"style\":24},\"1\":{\"style\":23},\"2\":{\"style\":40},\"3\":{\"style\":42}},\"height\":23},\"2\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":0},\"1\":{\"text\":\" ${budong.yname}\",\"style\":21,\"merge\":[0,2]},\"2\":{\"style\":12},\"3\":{\"style\":12}},\"isDrag\":true,\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\" ${budong.chanquan}\",\"style\":0,\"merge\":[0,2]},\"5\":{\"text\":\"${budong.beizhu}\",\"merge\":[5,3]}},\"isDrag\":true,\"height\":39},\"4\":{\"cells\":{\"1\":{\"text\":\" ${budong.zhuzhi}\",\"style\":39,\"merge\":[0,2]},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":19}},\"isDrag\":true,\"height\":33},\"5\":{\"cells\":{\"1\":{\"text\":\" ${budong.danyuan}\",\"style\":0,\"merge\":[0,2]},\"4\":{\"style\":19}},\"isDrag\":true,\"height\":53},\"6\":{\"cells\":{\"1\":{\"text\":\" ${budong.type}\",\"style\":0,\"merge\":[0,2]},\"4\":{\"style\":19}},\"isDrag\":true,\"height\":47},\"7\":{\"cells\":{\"1\":{\"text\":\" ${budong.xtype}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":38},\"8\":{\"cells\":{\"1\":{\"text\":\" ${budong.suoyou}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":31},\"9\":{\"cells\":{\"1\":{\"text\":\" ${budong.mianji}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":45},\"10\":{\"cells\":{\"1\":{\"text\":\" ${budong.riqi}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":26},\"11\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0,\"merge\":[0,2]}},\"height\":35},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0},\"2\":{\"text\":\"${budong.chanquan}\",\"style\":0,\"merge\":[4,1]}},\"isDrag\":true},\"13\":{\"cells\":{\"1\":{\"style\":0}}},\"14\":{\"cells\":{\"1\":{\"style\":0}}},\"15\":{\"cells\":{\"1\":{\"style\":0}}},\"16\":{\"cells\":{\"1\":{\"style\":0}},\"height\":5},\"17\":{\"cells\":{\"1\":{\"style\":0},\"2\":{\"text\":\"\",\"style\":0}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"1\":{\"style\":0},\"2\":{\"style\":0,\"text\":\"\"}}},\"len\":100,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{budong.zhuzhi}\"},\"-1\":{\"text\":\"#{budong.suoyou}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1024,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"italic\":true}},{\"font\":{\"italic\":true,\"bold\":true}},{\"font\":{\"italic\":true,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":true}},{\"align\":\"left\"},{\"align\":\"center\"},{\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true},{\"font\":{\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"top\"},{\"valign\":\"top\"},{\"textwrap\":true,\"font\":{\"bold\":true}},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\"},{\"font\":{\"italic\":true,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\",\"font\":{\"italic\":true}},{\"valign\":\"middle\",\"font\":{\"italic\":false}},{\"font\":{\"italic\":false,\"bold\":false},\"valign\":\"middle\"},{\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"right\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"center\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"left\"},{\"align\":\"right\",\"valign\":\"bottom\"},{\"align\":\"right\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"center\",\"valign\":\"middle\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":107},\"1\":{\"width\":54},\"2\":{\"width\":135},\"3\":{\"width\":180},\"6\":{\"width\":123},\"8\":{\"width\":25},\"len\":26},\"merges\":[\"A1:A2\",\"B1:B2\",\"B12:D12\",\"B9:D9\",\"B7:D7\",\"B6:D6\",\"B5:D5\",\"B3:D3\",\"B11:D11\",\"B8:D8\",\"B10:D10\",\"C13:D17\",\"C1:C2\",\"B4:D4\",\"F4:I9\",\"D1:D2\"],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"950\",\"height\":\"683\",\"src\":\"https://static.jero.com/designreport/images/38_1610456500965.jpg\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"TyDjQJrN7mqW5MdT\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9]]}]}', '', 'https://static.jero.com/designreport/images/24_1597233568822.png', 'jero', '2020-07-09 10:48:22', 'admin', '2021-01-13 14:12:46', 0, NULL, NULL, 1, 1395); +INSERT INTO `jimu_report` VALUES ('a9f068972508920cd4aab831814f0c04', '23445', '逮捕证', '', NULL, 'printinfo', '{\"area\":{\"sri\":13,\"sci\":9,\"eri\":13,\"eci\":9,\"width\":163,\"height\":89},\"printElWidth\":794,\"excel_config_id\":\"a9f068972508920cd4aab831814f0c04\",\"printElHeight\":1108,\"rows\":{\"0\":{\"cells\":{\"2\":{\"text\":\"\",\"merge\":[0,9],\"style\":324},\"12\":{}},\"isDrag\":true,\"height\":55},\"1\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":410,\"merge\":[0,13],\"text\":\"兰州市经济侦查大队\"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":128},\"2\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":411,\"merge\":[0,13],\"text\":\"逮捕令\"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":41},\"3\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":412,\"merge\":[0,12],\"text\":\"第123459663号\"},\"2\":{\"style\":397,\"text\":\" \"},\"3\":{\"style\":397,\"text\":\" \"},\"4\":{\"style\":397,\"text\":\" \"},\"5\":{\"style\":397,\"text\":\" \"},\"6\":{\"style\":397,\"text\":\" \"},\"7\":{\"style\":397,\"text\":\" \"},\"8\":{\"style\":397,\"text\":\" \"},\"9\":{\"style\":397,\"text\":\" \"},\"10\":{\"style\":397,\"text\":\" \"},\"11\":{\"style\":397,\"text\":\" \"},\"12\":{\"style\":397,\"text\":\" \"},\"13\":{\"style\":397,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":60},\"4\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\" 根据《中华人民共和国刑事诉讼法》第七十八条之规定,\",\"style\":341,\"merge\":[0,11]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":43},\"5\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"经\",\"merge\":[0,1]},\"3\":{\"style\":343,\"text\":\" \"},\"4\":{\"text\":\"${pdaibu.pname}\",\"style\":342,\"merge\":[0,9]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":47},\"6\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":344,\"text\":\" \",\"merge\":[0,2]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"merge\":[0,3],\"text\":\"批准,兹由我局对涉嫌\",\"style\":338},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\"${pdaibu.shiqing}\",\"style\":347,\"merge\":[0,4]},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":49},\"7\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"的\"},\"3\":{\"text\":\"${pdaibu.fname}\",\"style\":345,\"merge\":[0,1]},\"4\":{\"style\":346,\"text\":\" \"},\"5\":{\"text\":\"(性别\",\"style\":343},\"6\":{\"text\":\"${pdaibu.fsex}\",\"style\":347,\"merge\":[0,1]},\"7\":{\"style\":338,\"text\":\" \"},\"8\":{\"style\":346,\"text\":\"出生日期\"},\"9\":{\"text\":\"${pdaibu.cdata}\",\"style\":345,\"merge\":[0,4]},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"8\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\"${pdaibu.zhuzhi}\",\"style\":345,\"merge\":[0,7]},\"3\":{\"style\":370,\"text\":\" \"},\"4\":{\"style\":370,\"text\":\" \"},\"5\":{\"style\":370,\"text\":\" \"},\"6\":{\"style\":370,\"text\":\" \"},\"7\":{\"style\":370,\"text\":\" \"},\"8\":{\"style\":370,\"text\":\" \"},\"9\":{\"style\":370,\"text\":\" \"},\"10\":{\"style\":341,\"text\":\"执行逮捕,送兰州\",\"merge\":[0,3]},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"9\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"merge\":[0,6],\"text\":\"市经济侦查大队羁押。\"},\"3\":{\"style\":350,\"text\":\" \"},\"4\":{\"style\":350,\"text\":\" \"},\"5\":{\"style\":350,\"text\":\" \"},\"6\":{\"style\":349,\"text\":\" \"},\"7\":{\"style\":349,\"text\":\" \"},\"8\":{\"style\":350,\"text\":\" \"},\"9\":{\"style\":341,\"text\":\" \"},\"10\":{\"style\":341,\"merge\":[5,1],\"text\":\" \"},\"11\":{\"style\":338,\"text\":\" \"},\"12\":{\"style\":324},\"13\":{\"style\":324},\"14\":{\"style\":413}},\"height\":57},\"10\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414},\"2\":{\"style\":343},\"3\":{\"style\":338},\"4\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\"},\"5\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\"},\"6\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\"},\"7\":{\"style\":338},\"8\":{\"style\":338},\"9\":{\"style\":338},\"10\":{\"style\":338,\"text\":\" \"},\"11\":{\"style\":338,\"text\":\" \"},\"12\":{\"style\":324},\"13\":{\"style\":324},\"14\":{\"style\":413}},\"height\":61},\"11\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414},\"2\":{\"style\":337},\"3\":{\"style\":338},\"4\":{\"style\":338},\"5\":{\"style\":338},\"6\":{\"style\":376,\"merge\":[0,2]},\"7\":{\"style\":302},\"8\":{\"style\":302},\"9\":{\"style\":338},\"10\":{\"style\":338,\"text\":\" \"},\"11\":{\"style\":338,\"text\":\" \"},\"12\":{\"style\":324},\"13\":{\"style\":324},\"14\":{\"style\":413}},\"height\":83},\"12\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414},\"2\":{\"merge\":[0,6],\"style\":338},\"3\":{\"style\":338},\"4\":{\"style\":338},\"5\":{\"style\":338},\"6\":{\"style\":338},\"7\":{\"style\":338},\"8\":{\"style\":338},\"10\":{\"style\":338,\"text\":\" \"},\"11\":{\"style\":338,\"text\":\" \"},\"12\":{\"style\":324},\"13\":{\"style\":324},\"14\":{\"style\":413}},\"height\":14},\"13\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414},\"2\":{\"style\":351,\"merge\":[0,5],\"text\":\" \"},\"3\":{\"style\":338},\"4\":{\"style\":338},\"5\":{\"style\":338},\"6\":{\"style\":338},\"7\":{\"style\":338},\"8\":{\"style\":380,\"text\":\"公安局印\"},\"9\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"10\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"11\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"12\":{\"style\":324},\"13\":{\"style\":324},\"14\":{\"style\":413}},\"height\":89},\"14\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":414},\"2\":{\"style\":338},\"3\":{\"style\":338},\"4\":{\"style\":338},\"5\":{\"style\":338},\"6\":{\"style\":338},\"7\":{\"style\":338},\"8\":{\"style\":338},\"9\":{\"style\":338},\"10\":{\"style\":338,\"text\":\" \"},\"11\":{\"style\":338,\"text\":\" \"},\"12\":{\"style\":324},\"13\":{\"style\":324},\"14\":{\"style\":413}},\"height\":21},\"15\":{\"cells\":{\"0\":{\"style\":324},\"1\":{\"style\":415,\"text\":\" \"},\"2\":{\"style\":416,\"text\":\" \"},\"3\":{\"style\":417,\"text\":\" \"},\"4\":{\"style\":417,\"text\":\" \"},\"5\":{\"style\":417,\"text\":\" \"},\"6\":{\"text\":\"${pdaibu.gdata}\",\"style\":421,\"merge\":[0,6]},\"7\":{\"style\":422,\"text\":\" \"},\"8\":{\"style\":422,\"text\":\" \"},\"9\":{\"style\":422,\"text\":\" \"},\"10\":{\"style\":422,\"text\":\" \"},\"11\":{\"style\":422,\"text\":\" \"},\"12\":{\"style\":422,\"text\":\" \"},\"13\":{\"style\":417,\"text\":\" \"},\"14\":{\"style\":419,\"text\":\" \"}},\"isDrag\":true,\"height\":201},\"len\":88,\"-1\":{\"cells\":{\"1\":{\"text\":\"#{daibu.fdata}\"},\"-1\":{\"text\":\"#{pdaibu.shiqing}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":854,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"valign\":\"top\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14}},{\"font\":{\"size\":14},\"align\":\"center\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12},\"align\":\"center\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":24}},{\"font\":{\"size\":24}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":22}},{\"font\":{\"size\":22}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18}},{\"font\":{\"size\":18}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true}},{\"font\":{\"size\":18,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"align\":\"right\"},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":46},\"1\":{\"width\":38},\"2\":{\"width\":27},\"3\":{\"width\":6},\"4\":{\"width\":87},\"5\":{\"width\":51},\"6\":{\"width\":68},\"7\":{\"width\":1},\"8\":{\"width\":78},\"9\":{\"width\":163},\"10\":{\"width\":1},\"11\":{\"width\":60},\"12\":{\"width\":45},\"13\":{\"width\":49},\"14\":{\"width\":34},\"len\":31},\"merges\":[\"D8:E8\",\"C6:D6\",\"C10:I10\",\"G8:H8\",\"C9:J9\",\"C1:L1\",\"K10:L15\",\"C13:I13\",\"C14:H14\",\"F7:I7\",\"G12:I12\",\"G16:M16\",\"B4:N4\",\"C5:N5\",\"E6:N6\",\"J7:N7\",\"C7:E7\",\"K9:N9\",\"B2:O2\",\"B3:O3\",\"J8:N8\"],\"imgList\":[{\"row\":13,\"col\":9,\"width\":\"168\",\"height\":\"158\",\"src\":\"https://static.jero.com/designreport/images/QQ截图20210105214919_1610075317075.png\",\"layer_id\":\"XefZfpEcdS3wI6Ae\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[13,9],[13,10],[13,11]]}]}', '', 'https://static.jero.com/designreport/images/逮捕令_1607070625878.png', 'jero', '2020-07-10 13:38:40', 'admin', '2021-01-13 14:12:28', 0, NULL, NULL, 1, 2488); +INSERT INTO `jimu_report` VALUES ('f6ee801e8bdc28ba9d63f95dc65ccd79', '4556633', '采购单', '', NULL, 'printinfo', '{\"area\":false,\"printElWidth\":696,\"excel_config_id\":\"f6ee801e8bdc28ba9d63f95dc65ccd79\",\"printElHeight\":1147,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":13},\"1\":{\"text\":\"采购单\",\"style\":21,\"merge\":[0,6]},\"2\":{\"style\":22},\"3\":{\"style\":22},\"4\":{\"style\":22},\"5\":{\"style\":22},\"6\":{\"style\":22},\"7\":{\"style\":22},\"8\":{\"style\":13}},\"height\":89},\"1\":{\"cells\":{\"0\":{\"style\":13},\"1\":{\"text\":\"产品名称\",\"style\":23},\"2\":{\"text\":\"产品数量\",\"style\":23},\"3\":{\"text\":\"单价\",\"style\":23},\"4\":{\"text\":\"库存量\",\"style\":23},\"5\":{\"text\":\"库存总值\",\"style\":23},\"6\":{\"text\":\"订购量\",\"style\":23},\"7\":{\"text\":\"二次订购量\",\"style\":23},\"8\":{\"style\":13}},\"height\":45},\"2\":{\"cells\":{\"0\":{\"style\":13},\"1\":{\"style\":24,\"text\":\"#{caigou.cname}\"},\"2\":{\"style\":24,\"text\":\"#{caigou.cnum}\"},\"3\":{\"style\":24,\"text\":\"#{caigou.cprice}\"},\"4\":{\"style\":24,\"text\":\"#{caigou.ctotal}\"},\"5\":{\"style\":24,\"text\":\"#{caigou.tp}\"},\"6\":{\"style\":24,\"text\":\"#{caigou.dtotal}\"},\"7\":{\"style\":24,\"text\":\"#{caigou.ztotal}\"},\"8\":{\"style\":13}},\"height\":26},\"5\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"6\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":670,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":31},\"1\":{\"width\":114},\"2\":{\"width\":109},\"3\":{\"width\":78},\"4\":{\"width\":77},\"5\":{\"width\":84},\"6\":{\"width\":82},\"7\":{\"width\":95},\"len\":26},\"merges\":[\"B1:H1\"]}', '', 'https://static.jero.com/designreport/images/caigou_1607310279439.png', 'jero', '2020-07-28 16:54:44', 'admin', '2021-01-13 14:12:46', 0, NULL, NULL, 1, 1237); +INSERT INTO `jimu_report` VALUES ('ff9bd143582a6dfed897ba8b6f93b175', '56696', '销售公司出库单', '', NULL, 'printinfo', '{\"area\":{\"sri\":4,\"sci\":0,\"eri\":4,\"eci\":0,\"width\":32,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"ff9bd143582a6dfed897ba8b6f93b175\",\"printElHeight\":800,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":11,\"text\":\"医疗器械销售公司出货单\",\"merge\":[0,9]}},\"height\":83},\"1\":{\"cells\":{\"0\":{\"text\":\"供货单位:\",\"style\":20,\"merge\":[0,1]},\"1\":{\"style\":30},\"2\":{\"text\":\"${gongsi.gname}\",\"style\":19},\"3\":{\"style\":19},\"4\":{\"text\":\"供货日期:\",\"style\":19},\"5\":{\"text\":\"${gongsi.gdata}\",\"style\":19,\"merge\":[0,1]},\"6\":{\"style\":19},\"7\":{\"text\":\"编号:\",\"style\":20},\"8\":{\"text\":\"${gongsi.num}\",\"style\":19,\"merge\":[0,1]},\"9\":{\"style\":19}},\"isDrag\":true},\"2\":{\"cells\":{\"0\":{\"text\":\"行号\",\"style\":39},\"1\":{\"text\":\"产品代码\",\"style\":39},\"2\":{\"text\":\"产品名称\",\"style\":39},\"3\":{\"text\":\"规格型号\",\"style\":39},\"4\":{\"text\":\"单位\",\"style\":39},\"5\":{\"text\":\"实发数量\",\"style\":39},\"6\":{\"text\":\"销售单价(元)\",\"style\":39},\"7\":{\"text\":\"折扣率(%)\",\"style\":39},\"8\":{\"text\":\"销售金额(元)\",\"style\":39},\"9\":{\"text\":\"备注\",\"style\":39}}},\"3\":{\"cells\":{\"0\":{\"style\":35,\"text\":\"#{xiaoshou.id}\"},\"1\":{\"style\":35,\"text\":\"#{xiaoshou.hnum}\"},\"2\":{\"style\":35,\"text\":\"#{xiaoshou.hname}\"},\"3\":{\"style\":35,\"text\":\"#{xiaoshou.xinghao}\"},\"4\":{\"style\":35,\"text\":\"#{xiaoshou.danwei}\"},\"5\":{\"style\":35,\"text\":\"#{xiaoshou.num}\"},\"6\":{\"style\":35,\"text\":\"#{xiaoshou.danjia}\"},\"7\":{\"style\":35,\"text\":\"#{xiaoshou.zhekoulv}\"},\"8\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"},\"9\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"}}},\"4\":{\"cells\":{\"0\":{\"style\":4},\"1\":{}},\"isDrag\":true},\"len\":84,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{gongsi.gdata}\"},\"-1\":{\"text\":\"#{gongsi.didian}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":794,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":8}},{\"font\":{\"size\":8}},{\"align\":\"right\",\"font\":{\"size\":8}},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]}},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#a7d08c\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":32},\"1\":{\"width\":65},\"2\":{\"width\":115},\"3\":{\"width\":70},\"4\":{\"width\":52},\"5\":{\"width\":70},\"6\":{\"width\":93},\"7\":{\"width\":86},\"8\":{\"width\":75},\"9\":{\"width\":136},\"10\":{\"width\":81},\"len\":24},\"merges\":[\"F2:G2\",\"F2:G2\",\"I2:J2\",\"A2:B2\",\"C2:D2\",\"A2:B2\",\"A1:J1\"]}', '', 'https://static.jero.com/designreport/images/医疗器械_1607070355110.png', 'jero', '2020-06-16 11:54:02', 'admin', '2021-01-13 14:14:03', 0, NULL, NULL, 1, 762); + +-- ---------------------------- +-- Table structure for jimu_report_data_source +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_data_source`; +CREATE TABLE `jimu_report_data_source` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源名称', + `report_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报表_id', + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `db_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型', + `db_driver` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驱动类', + `db_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源地址', + `db_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `db_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmdatasource_report_id`(`report_id`) USING BTREE, + INDEX `idx_jmdatasource_code`(`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_data_source +-- ---------------------------- +INSERT INTO `jimu_report_data_source` VALUES ('1324261983692902402', 'jeewx', '1324261770294071296', '', NULL, 'MYSQL', 'com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeewx-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'jero', '2020-11-05 16:07:15', NULL, '2020-11-05 16:07:15'); +INSERT INTO `jimu_report_data_source` VALUES ('8f90daf47d15d35ca6cf420748b8b9ba', 'localhost', '1316944968992034816', '', NULL, 'MYSQL5.7', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jero-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'admin', '2021-01-13 14:34:00', NULL, '2021-01-13 14:34:00'); + +-- ---------------------------- +-- Table structure for jimu_report_db +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db`; +CREATE TABLE `jimu_report_db` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id', + `jimu_report_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主键字段', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `db_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据集编码', + `db_ch_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据集名字', + `db_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源类型', + `db_table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据库表名', + `db_dyn_sql` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '动态查询SQL', + `db_key` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源KEY', + `tb_db_key` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '填报数据源', + `tb_db_table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '填报数据表', + `java_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'java类数据集 类型(spring:springkey,class:java类名)', + `java_value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'java类数据源 数值(bean key/java类名)', + `api_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求地址', + `api_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `is_list` int(3) NULL DEFAULT 0 COMMENT '是否是列表0否1是 默认0', + `is_page` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否作为分页,0:不分页,1:分页', + `db_source` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源', + `db_source_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据库类型 MYSQL ORACLE SQLSERVER', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmreportdb_db_key`(`db_key`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_db +-- ---------------------------- +INSERT INTO `jimu_report_db` VALUES ('1272834687525482497', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '1', NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1272858455908073473', 'ff9bd143582a6dfed897ba8b6f93b175', 'admin', NULL, '2020-12-14 16:21:09', '2020-12-14 16:21:09', 'xiaoshou', 'xiaoshou', '0', NULL, 'select * from rep_demo_xiaoshou where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '1', NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1273495682564534273', 'ff9bd143582a6dfed897ba8b6f93b175', 'admin', NULL, '2020-09-28 10:18:07', '2020-12-14 16:21:09', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1282993618201612289', '7c02c224a2db56d0350069650033f702', 'admin', NULL, '2021-01-08 16:30:03', '2021-01-08 16:30:03', 'huizong1', 'huizong1', '0', NULL, 'select * from rep_demo_huizong', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '0', NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1283730831482937345', '6059e405dd9c66a6d38e00841d2e40cc', 'admin', NULL, '2020-12-04 16:53:38', '2020-12-04 16:53:38', 'yaopin', 'yaopin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/chufangjian', '0', 0, '0', NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1283957016150249473', '6059e405dd9c66a6d38e00841d2e40cc', NULL, NULL, '2020-07-17 10:49:42', NULL, 'yonghu', 'yonghu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/yonghu', '0', 0, NULL, NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1284070508744257537', 'a250846887abe01217aab173d3006489', NULL, NULL, '2020-07-17 15:33:53', '2020-07-20 17:50:49', 'budong', 'budong', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/budongchan', '0', 0, NULL, NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1285157606524002305', 'a9f068972508920cd4aab831814f0c04', NULL, NULL, '2020-07-20 18:20:25', '2020-07-20 18:28:22', 'pdaibu', 'pdaibu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/daibu', '0', 0, NULL, NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1285164420728692737', '7905022412733a0c68dc7b4ef8947489', NULL, NULL, '2020-07-20 18:47:30', NULL, 'jieshaoxin', 'jieshaoxin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/jieshaoxin', '0', 0, NULL, NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1285178919099637762', '6d6bdcb5e820c301ea32789e3ae43c44', NULL, NULL, '2020-07-20 19:45:06', NULL, 'qiangxiu', 'qiangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/qiangxiu', '0', 0, NULL, NULL, 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1288038655293661186', 'f6ee801e8bdc28ba9d63f95dc65ccd79', 'admin', NULL, '2021-01-05 15:10:29', '2021-01-05 15:10:29', 'caigou', 'caigou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/caigou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1289140698221678593', '519c1c6f4d1f584ae8fa5b43b45acdc7', 'admin', NULL, '2021-01-11 14:25:45', '2021-01-11 14:25:45', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/xiaoshou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1290104038414721025', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1316987047604514817', '1314846205892759552', 'admin', NULL, '2021-01-08 10:36:58', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/yuangongjiben', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1316997232402231298', '1316944968992034816', 'admin', NULL, '2021-01-13 14:34:06', '2021-01-13 14:34:06', 'employee', 'employee', '0', NULL, 'select * from rep_demo_employee where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '0', '', ''); +INSERT INTO `jimu_report_db` VALUES ('1317006713165049858', '1314846205892759552', 'admin', NULL, '2021-01-11 14:38:14', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/xueli', '0', 1, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1317007979484147714', '1314846205892759552', 'admin', NULL, '2021-01-08 10:40:31', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/gongzuojingli', '0', 1, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1317009166140829698', '1314846205892759552', 'admin', NULL, '2020-10-16 15:47:09', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhengshu', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1317013474634756097', '1314846205892759552', 'admin', NULL, '2020-10-16 16:04:16', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/jtcy', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1317015169494282241', '1314846205892759552', 'admin', NULL, '2020-10-16 16:11:00', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/jiangli', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331447376279285762', '1331429368098066432', 'admin', NULL, '2020-11-25 11:59:26', '2020-11-25 11:59:26', 'jihua', 'jihua', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/jihua', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331474698436915202', '1331429368098066432', 'admin', NULL, '2020-11-25 14:07:27', '2020-11-25 14:07:27', 'rishengchan', 'rishengchan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/rishengchan1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331483873661464578', '1331429368098066432', 'admin', NULL, '2020-11-25 14:24:28', '2020-11-25 14:24:28', 'wanchenglv', 'wanchenglv', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/wanchenglv', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331486475245629441', '1331429368098066432', 'admin', NULL, '2020-11-25 14:34:48', '2020-11-25 14:34:48', 'kaigong', 'kaigong', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/kaigong', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331491194517106690', '1331429368098066432', 'admin', NULL, '2020-11-25 14:56:36', '2020-11-25 14:56:36', 'bing1', 'bing1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bing1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331493951013695490', '1331429368098066432', 'admin', NULL, '2020-11-25 15:04:31', '2020-11-25 15:04:31', 'bing2', 'bing2', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bing2', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331511745851731969', '1331503965770223616', 'admin', NULL, '2020-11-25 16:15:13', '2020-11-25 16:15:13', 'chengjiao', 'chengjiao', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/chengjiao', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331514838211407873', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:30', '2020-11-25 16:27:30', 'cjpaihang', 'cjpaihang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/cjpaihang', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331514935028527106', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:54', '2020-11-25 16:27:54', 'cjjine', 'cjjine', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/cjjine', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331872643531526146', '1331503965770223616', 'admin', NULL, '2020-11-26 16:09:18', '2020-11-26 16:09:18', 'chengjiao1', 'chengjiao1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/chengjiao1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331878107552010242', '1331503965770223616', 'admin', NULL, '2020-11-26 16:31:01', '2020-11-26 16:31:01', 'zhuangxiu', 'zhuangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhuangxiu', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331916030221602818', '1331503965770223616', 'admin', NULL, '2020-11-26 19:01:42', '2020-11-26 19:01:42', 'btchanquan', 'btchanquan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/btchanquan', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331919172472524801', '1331503965770223616', 'admin', NULL, '2020-11-26 19:14:11', '2020-11-26 19:14:11', 'huxingxiaoshou', 'huxingxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/huxingxiaoshou', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331922734933987329', '1331503965770223616', 'admin', NULL, '2020-11-26 19:28:21', '2020-11-26 19:28:21', 'fangyuan', 'fangyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/fangyuan', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1331926127597441025', '1331503965770223616', 'admin', NULL, '2020-11-26 19:41:49', '2020-11-26 19:41:49', 'qingkuang', 'qingkuang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/qingkuang', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1333968597264900097', '1333962561053396992', 'admin', NULL, '2020-12-02 11:07:04', '2020-12-02 13:56:00', 'mianji', 'mianji', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/mianji', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1333974073679552514', '1333962561053396992', 'admin', NULL, '2020-12-02 11:19:38', '2020-12-02 13:56:00', 'danjia', 'danjia', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/danjia', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1333977108195581953', '1333962561053396992', 'admin', NULL, '2020-12-02 11:31:41', '2020-12-02 13:56:00', 'junjia', 'junjia', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/junjia', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1333980382663548929', '1333962561053396992', 'admin', NULL, '2020-12-02 11:47:12', '2020-12-02 13:56:00', 'churang', 'churang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/churang', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1333983587241828354', '1333962561053396992', 'admin', NULL, '2020-12-02 11:57:26', '2020-12-02 13:56:00', 'xinzhuzhai', 'xinzhuzhai', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/xinzhuzhai', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334008609356390402', '1333962561053396992', 'admin', NULL, '2020-12-02 13:36:52', '2020-12-02 13:56:00', 'churang1', 'churang1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/churang1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334013423209422849', '1333962561053396992', 'admin', NULL, '2020-12-02 13:56:00', '2020-12-02 13:56:00', 'zhuzhaichengjiao', 'zhuzhaichengjiao', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhuzhaichengjiao', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334037720053325825', '1334028738995818496', 'admin', NULL, '2020-12-02 15:32:32', '2020-12-02 17:37:33', 'bingtu1', 'bingtu1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bingtu1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334039611344691202', '1334028738995818496', 'admin', NULL, '2020-12-02 15:40:03', '2020-12-02 17:37:33', 'bingtu2', 'bingtu2', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bingtu2', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334043138246844418', '1334028738995818496', 'admin', NULL, '2020-12-02 15:54:04', '2020-12-02 17:37:33', 'zhexian1', 'zhexian1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhexian1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334049545562103810', '1334028738995818496', 'admin', NULL, '2020-12-02 16:19:32', '2020-12-02 17:37:33', 'zhexian2', 'zhexian2', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhexian2', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334052375119273986', '1334028738995818496', 'admin', NULL, '2020-12-02 16:30:46', '2020-12-02 17:37:33', 'zhuxingtu1', 'zhuxingtu1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhuxingtu1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334058269181747202', '1334028738995818496', 'admin', NULL, '2020-12-02 16:54:12', '2020-12-02 17:37:33', 'bingtu3', 'bingtu3', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bingtu3', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334060474135748610', '1334028738995818496', 'admin', NULL, '2020-12-02 17:02:57', '2020-12-02 17:37:33', 'bingtu4', 'bingtu4', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bingtu4', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334063192933933058', '1334028738995818496', 'admin', NULL, '2020-12-02 17:13:46', '2020-12-02 17:37:33', 'bingtu5', 'bingtu5', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bingtu5', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334063880162254850', '1334028738995818496', 'admin', NULL, '2020-12-02 17:16:29', '2020-12-02 17:37:33', 'bingtu6', 'bingtu6', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/bingtu6', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334068361943851009', '1334028738995818496', 'admin', NULL, '2020-12-02 17:37:33', '2020-12-02 17:37:33', 'biaoge', 'biaoge', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/biaoge', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334083843610648578', '1334074491629867008', 'admin', NULL, '2020-12-02 18:35:49', '2020-12-02 18:35:49', 'wunian', 'wunian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/wunian', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334107015605133314', '1334074491629867008', 'admin', NULL, '2020-12-02 20:07:54', '2020-12-02 20:07:54', 'table2', 'table2', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/table2', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334390762455965697', '1334378897302753280', 'admin', NULL, '2021-01-06 11:43:35', '2021-01-06 11:43:35', 'quyuxiaoshou', 'quyuxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/quyuxiaoshou', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334440263732436994', '1334420681185566722', 'admin', NULL, '2021-01-04 21:28:19', '2021-01-04 21:28:19', 'laiyuan', 'laiyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/laiyuan', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334465135435063298', '1334457419857793024', 'admin', NULL, '2021-01-04 21:29:28', '2021-01-04 21:29:28', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/xiaoshou', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334708015269490689', '1334696790477377536', 'admin', NULL, '2021-01-04 21:30:29', '2021-01-04 21:30:29', 'shouru', 'shouru', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/shouru', '0', 1, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1334763434197200897', '1334757703079301120', 'admin', NULL, '2020-12-04 15:40:31', '2020-12-04 15:40:31', 'chejian', 'chejian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/chejian', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1335886666363158530', '1334028738995818496', 'admin', NULL, '2020-12-07 17:59:35', '2020-12-07 17:59:35', 'sandian', 'sandian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/sandian', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1335889985047478274', '1334028738995818496', 'admin', NULL, '2020-12-07 18:12:47', '2020-12-07 18:12:47', 'loudou', 'loudou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/loudou', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1335901385547431937', '1333962561053396992', 'admin', NULL, '2020-12-14 17:16:28', '2020-12-14 17:16:28', 'ditu', 'ditu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/ditu', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1335909918854725633', '1334074491629867008', 'admin', NULL, '2020-12-07 19:31:59', '2020-12-07 19:31:59', 'ditu1', 'ditu1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/ditu1', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1337360015912087554', '1337271712059887616', 'admin', NULL, '2020-12-11 19:37:56', '2020-12-15 13:54:34', 'pp', 'pp', '0', NULL, 'select * from yanshi_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338457100451328002', '1337271712059887616', 'admin', NULL, '2020-12-15 10:13:25', '2020-12-15 13:54:34', 'laiyuan', '游客来源', '0', NULL, 'select * from laiyuan_wxtl order by value desc', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338667866760679426', '1337271712059887616', 'admin', NULL, '2020-12-15 10:12:11', '2020-12-15 13:54:34', 'fenbu1', '游客分布', '0', NULL, 'select * from fenbu_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338669749617299458', '1337271712059887616', 'admin', NULL, '2020-12-15 10:21:25', '2020-12-15 13:54:34', 'yanshi', '停留时长', '0', NULL, 'select * from yanshi_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338675446962720769', '1337271712059887616', 'admin', NULL, '2020-12-15 10:41:13', '2020-12-15 13:54:34', 'fangshi1', '出行方式1', '0', NULL, 'select * from fangshi1_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338678877395881985', '1337271712059887616', 'admin', NULL, '2020-12-15 10:54:50', '2020-12-15 13:54:34', 'laiyuan1', '游客来源1', '0', NULL, 'select * from laiyuan1_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338687259901169665', '1337271712059887616', 'admin', NULL, '2020-12-15 11:37:58', '2020-12-15 13:54:34', 'xianlu', 'xianlu', '0', NULL, 'select * from xianlu_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338687435562815489', '1337271712059887616', 'admin', NULL, '2020-12-15 11:28:51', '2020-12-15 13:54:34', 'xianlu1', 'xianlu1', '0', NULL, 'select * from xianlu1_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338720793164517378', '1337271712059887616', 'admin', NULL, '2020-12-15 13:41:24', '2020-12-15 13:54:34', 'ditu', 'ditu', '0', NULL, 'select * from ditu_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338724105821622274', '1337271712059887616', 'admin', NULL, '2020-12-15 13:54:34', '2020-12-15 13:54:34', 'qushi', 'qushi', '0', NULL, 'select * from qushi_wxtl', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '1', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338741640998686721', '1338370016550195200', 'admin', NULL, '2020-12-16 19:11:38', '2020-12-16 19:11:38', 'tiaoma', 'tiaoma', '0', NULL, 'select * from yanshi_tima', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1338756341933543425', '1338744112815411200', 'admin', NULL, '2021-01-11 14:55:01', '2021-01-11 14:55:01', 'jdcx', 'jdcx', '0', NULL, 'select * from yanshi_jdcx', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339491107951640577', '1339478701846433792', 'admin', NULL, '2020-12-17 16:42:21', '2020-12-17 19:50:14', 'xiaoshoue', '销售额', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/xiaoshoue', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1339495346077728770', '1339478701846433792', 'admin', NULL, '2020-12-17 16:59:12', '2020-12-17 19:50:14', 'chengshi', '城市', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/chengshi', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1339498906765000705', '1339478701846433792', 'admin', NULL, '2020-12-17 17:13:21', '2020-12-17 19:50:14', 'xsjd', '销售进度', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/xsjd', '0', 0, '0', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1339538388453195777', '1339478701846433792', 'admin', NULL, '2020-12-17 19:50:14', '2020-12-17 19:50:14', 'zhexian', 'zhexian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/zhexian', '0', 1, '1', '', NULL); +INSERT INTO `jimu_report_db` VALUES ('1339870475496497153', '1339859143477039104', 'admin', NULL, '2020-12-18 17:49:50', '2020-12-18 17:49:50', 'pp', '会员数量', '0', NULL, 'select * from huiyuan_wxtlshuliang', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '1', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339873097620168705', '1339859143477039104', 'admin', NULL, '2020-12-18 18:00:15', '2020-12-18 18:00:15', 'se', '会员性别', '0', NULL, 'select * from huiyuan_sex', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339876173672390658', '1339859143477039104', 'admin', NULL, '2020-12-18 18:12:28', '2020-12-18 18:12:28', 'aa', '会员年龄', '0', NULL, 'select * from huiyuan_age', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339878700639887362', '1339859143477039104', 'admin', NULL, '2020-12-18 18:22:31', '2020-12-18 18:22:31', 'ww', '工作性质', '0', NULL, 'select * from huiyuan_work', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339884367194923010', '1339859143477039104', 'admin', NULL, '2020-12-18 18:45:02', '2020-12-18 18:45:02', 'hh', '活跃度', '0', NULL, 'select * from huiyuan_huoyuedu', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339886300563546113', '1339859143477039104', 'admin', NULL, '2020-12-18 18:52:43', '2020-12-18 18:52:43', 'xx', '会员学历', '0', NULL, 'select * from huiyuan_xueli', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('1339888452912586753', '1339859143477039104', 'admin', NULL, '2020-12-18 19:05:18', '2020-12-18 19:05:18', 'gg', '分公司', '0', NULL, 'select * from huiyuan_fengongsi', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('4af57d343f1d6521b71b85097b580786', '1347459370216198144', 'admin', NULL, '2021-01-08 17:26:57', '2021-01-08 17:26:57', 'tmp_report_data_income', '来源收入统计', '0', NULL, 'select * from tmp_report_data_income', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '1', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('7b20679054449c554cde856ef24126ab', '1347454742040809472', 'admin', NULL, '2021-01-08 16:24:16', '2021-01-08 16:24:16', 'tmp_report_data_1', '年度佣金收入', '0', NULL, 'select monty,main_income,total,his_lowest,his_average,his_highest from tmp_report_data_1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('9b7d28336b01f9a6b1a613957c3d7cda', '1338769064067076098', 'admin', NULL, '2021-01-13 14:03:36', '2021-01-13 14:03:36', 'pop', 'pop', '0', NULL, 'select * from yanshi_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '0', '', 'MYSQL'); +INSERT INTO `jimu_report_db` VALUES ('f7649b77cfc9e0a9dacdac370cd4036b', '1347373863746539520', 'admin', NULL, '2021-01-08 10:47:52', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jero.com/mock/26/baobiao/shixi', '0', 0, '0', '', NULL); + +-- ---------------------------- +-- Table structure for jimu_report_db_field +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db_field`; +CREATE TABLE `jimu_report_db_field` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `jimu_report_db_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源ID', + `field_name` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段名', + `field_text` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段文本', + `widget_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控件类型', + `widget_width` int(10) NULL DEFAULT NULL COMMENT '控件宽度', + `order_num` int(3) NULL DEFAULT NULL COMMENT '排序', + `search_flag` int(3) NULL DEFAULT 0 COMMENT '查询标识0否1是 默认0', + `search_mode` int(3) NULL DEFAULT NULL COMMENT '查询模式1简单2范围', + `dict_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典编码支持从表中取数据', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jrdf_jimu_report_db_id`(`jimu_report_db_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_db_field +-- ---------------------------- +INSERT INTO `jimu_report_db_field` VALUES ('014179e260e0adf1706c616a3ad6e552', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'main_income', 'main_income', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('01cb1f61f836aae43bca333dbaf293be', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0470c07d386940053253fe8a8c200225', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'chengbao_gz_money', 'chengbao_gz_money', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0680555456f0e579a0065c4ca5dd8d06', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0c82931edb766ad89ead9e98a998d43f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0fb03c8e2330e051564f3dd1de54512f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('10e61155dcf655d7843ebc01cc90c8b1', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'total', 'total', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('115c1ac01462ca1fbecb3c0a55218395', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_highest', 'his_highest', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('11aa0711d51babb3985fe23660a120ec', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'address', 'address', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907562864641', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907567058946', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'bnum', 'bnum', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253250', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'ftime', 'ftime', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253251', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'sfkong', 'sfkong', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253252', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'kaishi', 'kaishi', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253253', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jieshu', 'jieshu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253254', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'hezairen', 'hezairen', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253255', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jpnum', 'jpnum', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907575447554', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'shihelv', 'shihelv', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618340024321', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618352607233', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'cname', 'cname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618356801538', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'hname', 'hname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618356801539', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618356801540', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'jtotal', 'jtotal', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618360995842', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'jaddress', 'jaddress', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618365190145', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'snum', 'snum', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618369384449', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'hushu', 'hushu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618369384450', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'renkou', 'renkou', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618369384451', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'money', 'money', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618369384452', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'shouru', 'shouru', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618373578754', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'bkey', 'bkey', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618373578755', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'brenkou', 'brenkou', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618373578756', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'cbuzhu', 'cbuzhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618373578757', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'qbuzhu', 'qbuzhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618377773058', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'zbuzhu', 'zbuzhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618381967361', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'hbuzhu', 'hbuzhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618381967362', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'sxinzeng', 'sxinzeng', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618381967363', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'schaobiao', 'schaobiao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618386161665', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'jchaobiao', 'jchaobiao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618386161666', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'die', 'die', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1282993618386161667', NULL, '2020-07-14 19:01:30', NULL, NULL, '1282993618201612289', 'qita', 'qita', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016175415297', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yphone', 'yphone', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016183803906', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yzhenliao', 'yzhenliao', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016187998209', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ysex', 'ysex', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016192192513', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'danwei', 'danwei', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016196386818', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'kdata', 'kdata', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016204775425', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yname', 'yname', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016208969729', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yprice', 'yprice', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016213164033', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ytotal', 'ytotal', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016217358337', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yishe', 'yishe', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016221552641', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yizhu', 'yizhu', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016225746946', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yage', 'yage', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016229941249', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yjieguo', 'yjieguo', NULL, NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155649130497', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'xtype', 'xtype', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155686879234', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'danyuan', 'danyuan', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155691073538', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'chanquan', 'chanquan', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155695267841', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'zhuzhi', 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155699462145', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'fujian', 'fujian', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155707850754', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155707850755', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'type', 'type', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155712045058', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'suoyou', 'suoyou', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155716239361', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155716239362', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'bianhao', 'bianhao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155720433666', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'yname', 'yname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155720433667', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'riqi', 'riqi', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155724627969', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155728822274', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'time', 'time', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155728822275', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'mianji', 'mianji', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608326889474', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'fsex', 'fsex', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608335278082', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'fname', 'fname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472385', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'shiqing', 'shiqing', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472386', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'pname', 'pname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472387', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'zhuzhi', 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472388', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608343666690', NULL, '2020-07-20 18:28:22', NULL, NULL, '1285157606524002305', 'cdata', 'cdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420749664258', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'shiqing', 'shiqing', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420753858561', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052866', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052867', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'value', 'value', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052868', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'percent', 'percent', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420762247169', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919124803585', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'ktime', 'ktime', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192193', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192194', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'wtime', 'wtime', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192195', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yusuan', 'yusuan', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192196', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'dshenhe', 'dshenhe', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192197', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zhuren', 'zhuren', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386498', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'neirong', 'neirong', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386499', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yijian', 'yijian', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386500', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time1', 'time1', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386501', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time2', 'time2', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386502', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time3', 'time3', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580801', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time4', 'time4', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580802', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'pingjia', 'pingjia', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580803', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580804', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'bianhao', 'bianhao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580805', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zongjie', 'zongjie', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919145775105', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'nengli', 'nengli', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919145775106', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time', 'time', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875810967553', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550466', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550467', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550468', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744769', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744770', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744771', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655394324482', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'ctotal', '库存量', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655402713090', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'cname', '产品名称', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655406907393', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'cprice', '单价', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655411101697', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'dtotal', '订购量', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655411101698', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'tp', '库存总值', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655415296002', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'ztotal', '二次订购量', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655415296003', NULL, '2020-07-28 17:08:41', NULL, NULL, '1288038655293661186', 'cnum', '产品数量', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290843074561', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290847268865', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'hnum', 'hnum', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463170', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'hname', 'hname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463171', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'xinghao', 'xinghao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463172', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'fahuocangku', 'fahuocangku', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463173', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463174', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463175', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'danjia', 'danjia', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463176', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'zhekoulv', 'zhekoulv', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290855657473', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'xiaoshoujine', 'xiaoshoujine', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290859851778', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290859851779', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 's_id', 's_id', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038439886849', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275458', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275459', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275460', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469761', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469762', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469763', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479361', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479362', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479363', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479364', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479365', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218305', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218306', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218307', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218308', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218309', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144706', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144707', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144708', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144709', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144710', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144711', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670849', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670850', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670851', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331447376279285763', NULL, '2020-11-25 11:59:26', NULL, NULL, '1331447376279285762', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331447376287674369', NULL, '2020-11-25 11:59:26', NULL, NULL, '1331447376279285762', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331447376287674370', NULL, '2020-11-25 11:59:26', NULL, NULL, '1331447376279285762', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331479590526300162', NULL, '2020-11-25 14:07:27', NULL, NULL, '1331474698436915202', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331479590526300163', NULL, '2020-11-25 14:07:27', NULL, NULL, '1331474698436915202', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331479590526300164', NULL, '2020-11-25 14:07:27', NULL, NULL, '1331474698436915202', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331483873669853186', NULL, '2020-11-25 14:24:28', NULL, NULL, '1331483873661464578', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331483873669853187', NULL, '2020-11-25 14:24:28', NULL, NULL, '1331483873661464578', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331486475249823745', NULL, '2020-11-25 14:34:48', NULL, NULL, '1331486475245629441', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331486475249823746', NULL, '2020-11-25 14:34:48', NULL, NULL, '1331486475245629441', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331491961407844353', NULL, '2020-11-25 14:56:36', NULL, NULL, '1331491194517106690', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331491961412038658', NULL, '2020-11-25 14:56:36', NULL, NULL, '1331491194517106690', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331493951017889794', NULL, '2020-11-25 15:04:31', NULL, NULL, '1331493951013695490', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331493951017889795', NULL, '2020-11-25 15:04:31', NULL, NULL, '1331493951013695490', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926274', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926275', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926276', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602178', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602179', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602180', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721409', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721410', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721411', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914754', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914755', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914756', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331878107560398849', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331878107560398850', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991425', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991426', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991427', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331919172480913409', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331919172480913410', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331922734942375938', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331922734942375939', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829634', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjl', 'cjl', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829635', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjje', 'cjje', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829636', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'xsmj', 'xsmj', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829637', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjjj', 'cjjj', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829638', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'sfyj', 'sfyj', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829639', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'ydkh', 'ydkh', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333970913154048002', NULL, '2020-12-02 11:07:04', NULL, NULL, '1333968597264900097', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333970913158242305', NULL, '2020-12-02 11:07:04', NULL, NULL, '1333968597264900097', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333970913158242306', NULL, '2020-12-02 11:07:04', NULL, NULL, '1333968597264900097', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333974073687941121', NULL, '2020-12-02 11:19:38', NULL, NULL, '1333974073679552514', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333974073687941122', NULL, '2020-12-02 11:19:38', NULL, NULL, '1333974073679552514', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333977108203970561', NULL, '2020-12-02 11:31:41', NULL, NULL, '1333977108195581953', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333977108203970562', NULL, '2020-12-02 11:31:41', NULL, NULL, '1333977108195581953', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333981011083534337', NULL, '2020-12-02 11:47:12', NULL, NULL, '1333980382663548929', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333981011087728641', NULL, '2020-12-02 11:47:12', NULL, NULL, '1333980382663548929', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333981011087728642', NULL, '2020-12-02 11:47:12', NULL, NULL, '1333980382663548929', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333983587250216961', NULL, '2020-12-02 11:57:26', NULL, NULL, '1333983587241828354', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333983587254411265', NULL, '2020-12-02 11:57:26', NULL, NULL, '1333983587241828354', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1333983587254411266', NULL, '2020-12-02 11:57:26', NULL, NULL, '1333983587241828354', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334008609364779010', NULL, '2020-12-02 13:36:52', NULL, NULL, '1334008609356390402', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334008609364779011', NULL, '2020-12-02 13:36:52', NULL, NULL, '1334008609356390402', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334008609364779012', NULL, '2020-12-02 13:36:52', NULL, NULL, '1334008609356390402', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334013423217811457', NULL, '2020-12-02 13:56:00', NULL, NULL, '1334013423209422849', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334013423217811458', NULL, '2020-12-02 13:56:00', NULL, NULL, '1334013423209422849', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334037720057520130', NULL, '2020-12-02 15:32:32', NULL, NULL, '1334037720053325825', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334037720061714433', NULL, '2020-12-02 15:32:32', NULL, NULL, '1334037720053325825', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334039611348885506', NULL, '2020-12-02 15:40:03', NULL, NULL, '1334039611344691202', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334039611353079810', NULL, '2020-12-02 15:40:03', NULL, NULL, '1334039611344691202', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334043138255233026', NULL, '2020-12-02 15:54:04', NULL, NULL, '1334043138246844418', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334043138255233027', NULL, '2020-12-02 15:54:04', NULL, NULL, '1334043138246844418', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334043138255233028', NULL, '2020-12-02 15:54:04', NULL, NULL, '1334043138246844418', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334049545566298114', NULL, '2020-12-02 16:19:32', NULL, NULL, '1334049545562103810', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334049545570492418', NULL, '2020-12-02 16:19:32', NULL, NULL, '1334049545562103810', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334052375127662594', NULL, '2020-12-02 16:30:46', NULL, NULL, '1334052375119273986', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334052375127662595', NULL, '2020-12-02 16:30:46', NULL, NULL, '1334052375119273986', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334052375127662596', NULL, '2020-12-02 16:30:46', NULL, NULL, '1334052375119273986', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334058269185941505', NULL, '2020-12-02 16:54:12', NULL, NULL, '1334058269181747202', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334058269190135810', NULL, '2020-12-02 16:54:12', NULL, NULL, '1334058269181747202', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334060474139942914', NULL, '2020-12-02 17:02:57', NULL, NULL, '1334060474135748610', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334060474144137218', NULL, '2020-12-02 17:02:57', NULL, NULL, '1334060474135748610', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334063192938127362', NULL, '2020-12-02 17:13:46', NULL, NULL, '1334063192933933058', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334063192942321665', NULL, '2020-12-02 17:13:46', NULL, NULL, '1334063192933933058', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334063880170643458', NULL, '2020-12-02 17:16:29', NULL, NULL, '1334063880162254850', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334063880170643459', NULL, '2020-12-02 17:16:29', NULL, NULL, '1334063880162254850', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334068361952239617', NULL, '2020-12-02 17:34:18', NULL, NULL, '1334068361943851009', 'yname', 'yname', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334068361952239618', NULL, '2020-12-02 17:34:18', NULL, NULL, '1334068361943851009', 'ysex', 'ysex', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334068361952239619', NULL, '2020-12-02 17:34:18', NULL, NULL, '1334068361943851009', 'yage', 'yage', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334068361952239620', NULL, '2020-12-02 17:34:18', NULL, NULL, '1334068361943851009', 'danwei', 'danwei', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334083843619037185', NULL, '2020-12-02 18:35:49', NULL, NULL, '1334083843610648578', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334083843619037186', NULL, '2020-12-02 18:35:49', NULL, NULL, '1334083843610648578', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334107015609327618', NULL, '2020-12-02 20:07:54', NULL, NULL, '1334107015605133314', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334107015613521921', NULL, '2020-12-02 20:07:54', NULL, NULL, '1334107015605133314', 'sj', 'sj', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334107015613521922', NULL, '2020-12-02 20:07:54', NULL, NULL, '1334107015605133314', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334107015613521923', NULL, '2020-12-02 20:07:54', NULL, NULL, '1334107015605133314', 'je', 'je', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334107015613521924', NULL, '2020-12-02 20:07:54', NULL, NULL, '1334107015605133314', 'jg', 'jg', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334107015613521925', NULL, '2020-12-02 20:07:54', NULL, NULL, '1334107015605133314', 'jl', 'jl', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825602', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'class', 'class', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825603', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'school', 'school', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825604', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'lv', 'lv', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825605', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_jy', 'renyuan_jy', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825606', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_jy', 'richang_jy', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825607', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'biaozhun_jy', 'biaozhun_jy', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825608', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xinxi_jy', 'xinxi_jy', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825609', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_jy', 'jichubokuan_jy', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825610', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_ct', 'renyuan_ct', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825611', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_ct', 'richang_ct', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825612', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_ct', 'xiangmu_ct', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825613', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_ct', 'jichubokuan_ct', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825614', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_sh', 'xiangmu_sh', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825615', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_sh', 'jichubokuan_sh', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825616', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'diannao', 'diannao', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825617', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiaoyuanwang', 'xiaoyuanwang', 'String', NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451905', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'diqu', 'diqu', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451906', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'class', 'class', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451907', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_11', 'sales_11', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451908', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_12', 'sales_12', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451909', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_13', 'sales_13', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451910', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_14', 'sales_14', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451911', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_15', 'sales_15', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451912', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_16', 'sales_16', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451913', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_17', 'sales_17', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646210', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_18', 'sales_18', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646211', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_19', 'sales_19', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646212', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_20', 'sales_20', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646213', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_21', 'sales_21', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646214', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_22', 'sales_22', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646215', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_31', 'sales_31', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646216', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_32', 'sales_32', 'String', NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646217', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_33', 'sales_33', 'String', NULL, 17, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646218', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_34', 'sales_34', 'String', NULL, 18, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646219', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_35', 'sales_35', 'String', NULL, 19, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646220', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_36', 'sales_36', 'String', NULL, 20, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646221', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_37', 'sales_37', 'String', NULL, 21, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646222', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_38', 'sales_38', 'String', NULL, 22, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646223', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_39', 'sales_39', 'String', NULL, 23, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646224', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_40', 'sales_40', 'String', NULL, 24, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646225', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_41', 'sales_41', 'String', NULL, 25, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646226', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_42', 'sales_42', 'String', NULL, 26, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015277879297', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'city', 'city', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073601', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'school', 'school', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073602', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'ncnum', 'ncnum', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073603', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'num', 'num', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073604', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'name', 'name', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073605', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'class', 'class', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073606', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay', 'pay', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073607', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paytime', 'paytime', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073608', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'payclass', 'payclass', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073609', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay1', 'pay1', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073610', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paymoth', 'paymoth', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073611', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay2', 'pay2', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073612', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_09', 'tuition_09', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073613', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_09', 'meals_09', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073614', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_09', 'busfee_09', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073615', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_10', 'tuition_10', 'String', NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073616', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_10', 'meals_10', 'String', NULL, 17, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073617', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_10', 'busfee_10', 'String', NULL, 18, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504126402561', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'city', 'city', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596866', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'finish', 'finish', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596867', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'semifinish', 'semifinish', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596868', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'time', 'time', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596869', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'state', 'state', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596870', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'attribute', 'attribute', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596871', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'num', 'num', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596872', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'gnum', 'gnum', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596873', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jnum', 'jnum', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596874', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'wnum', 'wnum', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596875', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'uph', 'uph', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596876', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'hc', 'hc', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596877', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jtime', 'jtime', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596878', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'yield', 'yield', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596879', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'beizhu', 'beizhu', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754305', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754306', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754307', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key1', 'key1', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754308', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key2', 'key2', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754309', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key3', 'key3', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754310', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key4', 'key4', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754311', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key5', 'key5', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754312', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key6', 'key6', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754313', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key7', 'key7', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754314', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'percent', 'percent', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1335886666392518658', NULL, '2020-12-07 17:59:35', NULL, NULL, '1335886666363158530', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1335886666413490177', NULL, '2020-12-07 17:59:36', NULL, NULL, '1335886666363158530', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1335889985055866881', NULL, '2020-12-07 18:12:47', NULL, NULL, '1335889985047478274', 'value', 'value', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1335889985060061186', NULL, '2020-12-07 18:12:47', NULL, NULL, '1335889985047478274', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1335909918863114242', NULL, '2020-12-07 19:31:59', NULL, NULL, '1335909918854725633', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1335909918863114243', NULL, '2020-12-07 19:31:59', NULL, NULL, '1335909918854725633', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1337360966253293570', NULL, '2020-12-11 19:37:56', NULL, NULL, '1337360015912087554', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1337360966253293571', NULL, '2020-12-11 19:37:56', NULL, NULL, '1337360015912087554', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1337360966253293572', NULL, '2020-12-11 19:37:56', NULL, NULL, '1337360015912087554', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338412526932602882', NULL, '2020-12-14 17:16:28', NULL, NULL, '1335901385547431937', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338412526936797186', NULL, '2020-12-14 17:16:28', NULL, NULL, '1335901385547431937', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338459533034401794', NULL, '2020-12-14 20:23:15', NULL, NULL, '1338457100451328002', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338459533038596098', NULL, '2020-12-14 20:23:15', NULL, NULL, '1338457100451328002', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338459533038596099', NULL, '2020-12-14 20:23:15', NULL, NULL, '1338457100451328002', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338459533038596100', NULL, '2020-12-14 20:23:15', NULL, NULL, '1338457100451328002', 'type', 'type', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338667866769068033', NULL, '2020-12-15 10:11:05', NULL, NULL, '1338667866760679426', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338667866769068034', NULL, '2020-12-15 10:11:05', NULL, NULL, '1338667866760679426', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338667866769068035', NULL, '2020-12-15 10:11:05', NULL, NULL, '1338667866760679426', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338670467426291713', NULL, '2020-12-15 10:21:25', NULL, NULL, '1338669749617299458', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338670467426291714', NULL, '2020-12-15 10:21:25', NULL, NULL, '1338669749617299458', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338670467426291715', NULL, '2020-12-15 10:21:25', NULL, NULL, '1338669749617299458', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338675446966915074', NULL, '2020-12-15 10:41:13', NULL, NULL, '1338675446962720769', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338675446971109377', NULL, '2020-12-15 10:41:13', NULL, NULL, '1338675446962720769', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338675446971109378', NULL, '2020-12-15 10:41:13', NULL, NULL, '1338675446962720769', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338678877404270594', NULL, '2020-12-15 10:54:50', NULL, NULL, '1338678877395881985', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338678877408464898', NULL, '2020-12-15 10:54:50', NULL, NULL, '1338678877395881985', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338678877408464899', NULL, '2020-12-15 10:54:50', NULL, NULL, '1338678877395881985', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338687435571204098', NULL, '2020-12-15 11:28:51', NULL, NULL, '1338687435562815489', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338687435575398402', NULL, '2020-12-15 11:28:51', NULL, NULL, '1338687435562815489', 'from_name', 'from_name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338687435575398403', NULL, '2020-12-15 11:28:51', NULL, NULL, '1338687435562815489', 'to_name', 'to_name', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338689731134754817', NULL, '2020-12-15 11:37:58', NULL, NULL, '1338687259901169665', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338689731138949122', NULL, '2020-12-15 11:37:58', NULL, NULL, '1338687259901169665', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338689731138949123', NULL, '2020-12-15 11:37:58', NULL, NULL, '1338687259901169665', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338689731138949124', NULL, '2020-12-15 11:37:58', NULL, NULL, '1338687259901169665', 'type', 'type', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338720793172905986', NULL, '2020-12-15 13:41:24', NULL, NULL, '1338720793164517378', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338720793172905987', NULL, '2020-12-15 13:41:24', NULL, NULL, '1338720793164517378', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338720793172905988', NULL, '2020-12-15 13:41:24', NULL, NULL, '1338720793164517378', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338724105830010882', NULL, '2020-12-15 13:54:34', NULL, NULL, '1338724105821622274', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338724105830010883', NULL, '2020-12-15 13:54:34', NULL, NULL, '1338724105821622274', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338724105830010884', NULL, '2020-12-15 13:54:34', NULL, NULL, '1338724105821622274', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641002881025', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641002881026', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641002881027', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'sex', 'sex', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641002881028', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'nation', 'nation', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075330', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'birth', 'birth', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075331', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'address', 'address', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075332', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'card', 'card', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075333', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'date', 'date', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075334', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'orga', 'orga', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075335', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'reason', 'reason', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075336', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'time', 'time', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075337', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'num', 'num', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075338', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'undertaker', 'undertaker', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075339', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'leader', 'leader', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075340', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'autograph', 'autograph', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075341', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'phone', 'phone', 'String', NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075342', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'qianming', 'qianming', 'String', NULL, 17, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075343', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'ltime', 'ltime', 'String', NULL, 18, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075344', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'os', 'os', 'String', NULL, 19, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075345', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'taddress', 'taddress', 'String', NULL, 20, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075346', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'addressee', 'addressee', 'String', NULL, 21, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075347', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'code', 'code', 'String', NULL, 22, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1338741641007075348', NULL, '2020-12-15 15:04:14', NULL, NULL, '1338741640998686721', 'remarks', 'remarks', 'String', NULL, 23, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339491107960029185', NULL, '2020-12-17 16:42:21', NULL, NULL, '1339491107951640577', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339491107960029186', NULL, '2020-12-17 16:42:21', NULL, NULL, '1339491107951640577', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339491107960029187', NULL, '2020-12-17 16:42:21', NULL, NULL, '1339491107951640577', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339495346086117377', NULL, '2020-12-17 16:59:12', NULL, NULL, '1339495346077728770', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339495346086117378', NULL, '2020-12-17 16:59:12', NULL, NULL, '1339495346077728770', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339495346086117379', NULL, '2020-12-17 16:59:12', NULL, NULL, '1339495346077728770', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339498906773389314', NULL, '2020-12-17 17:13:21', NULL, NULL, '1339498906765000705', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339498906773389315', NULL, '2020-12-17 17:13:21', NULL, NULL, '1339498906765000705', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339538388457390081', NULL, '2020-12-17 19:50:14', NULL, NULL, '1339538388453195777', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339538388461584385', NULL, '2020-12-17 19:50:14', NULL, NULL, '1339538388453195777', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339870475500691457', NULL, '2020-12-18 17:49:50', NULL, NULL, '1339870475496497153', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339870475500691458', NULL, '2020-12-18 17:49:50', NULL, NULL, '1339870475496497153', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339870475500691459', NULL, '2020-12-18 17:49:50', NULL, NULL, '1339870475496497153', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339873097628557314', NULL, '2020-12-18 18:00:15', NULL, NULL, '1339873097620168705', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339873097632751618', NULL, '2020-12-18 18:00:15', NULL, NULL, '1339873097620168705', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339873097632751619', NULL, '2020-12-18 18:00:15', NULL, NULL, '1339873097620168705', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339876173676584962', NULL, '2020-12-18 18:12:28', NULL, NULL, '1339876173672390658', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339876173680779266', NULL, '2020-12-18 18:12:28', NULL, NULL, '1339876173672390658', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339876173680779267', NULL, '2020-12-18 18:12:28', NULL, NULL, '1339876173672390658', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339878700648275969', NULL, '2020-12-18 18:22:31', NULL, NULL, '1339878700639887362', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339878700648275970', NULL, '2020-12-18 18:22:31', NULL, NULL, '1339878700639887362', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339878700652470274', NULL, '2020-12-18 18:22:31', NULL, NULL, '1339878700639887362', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339884367199117313', NULL, '2020-12-18 18:45:02', NULL, NULL, '1339884367194923010', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339884367203311617', NULL, '2020-12-18 18:45:02', NULL, NULL, '1339884367194923010', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339884367203311618', NULL, '2020-12-18 18:45:02', NULL, NULL, '1339884367194923010', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339886300571934722', NULL, '2020-12-18 18:52:43', NULL, NULL, '1339886300563546113', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339886300571934723', NULL, '2020-12-18 18:52:43', NULL, NULL, '1339886300563546113', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339886300571934724', NULL, '2020-12-18 18:52:43', NULL, NULL, '1339886300563546113', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339889468164841473', NULL, '2020-12-18 19:05:18', NULL, NULL, '1339888452912586753', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339889468164841474', NULL, '2020-12-18 19:05:18', NULL, NULL, '1339888452912586753', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339889468164841475', NULL, '2020-12-18 19:05:18', NULL, NULL, '1339888452912586753', 'value', 'value', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1339889468164841476', NULL, '2020-12-18 19:05:18', NULL, NULL, '1339888452912586753', 'type', 'type', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('179c2bc8ef420a995c3751062e909b66', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'gtime', 'gtime', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('17a278c53299d1342c56a8eb1614a44e', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'ctime', 'ctime', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('19e6fe3dc95b352d97f460648dc93e15', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_z', 'proportion_z', 'String', NULL, 23, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1b09540b3d8deddc06ebdbec26f6ae87', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'political', 'political', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1b6fbe11728a1c4633eeea8ffb12bc25', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_by', 'update_by', 'String', NULL, 30, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1d21c72184f2e06ca1be3dc95fbcc259', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1ee3018b4d0c305e2c06f77e1e5f3c4c', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_3', 'sales_3', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1fac3f8219222b8963dc6b85870ffd86', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('21f7de0326129dbbbc03d64aceb4d3f7', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'yprice', 'yprice', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('23b2e3b8d0f3f2b564d4284460fe9e79', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'ftime', '发货日期', 'date', NULL, 6, 1, 2, ''); +INSERT INTO `jimu_report_db_field` VALUES ('29fcb4292d4782888e9fd0496bd8ddc8', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a3b35b4830f1b1eff84a5a9bceed0b6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_z', 'gift_z', 'String', NULL, 22, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2be25d6c7e3ac28abec99854618d0e3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'birthday', 'birthday', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2f94a4be25426f3f4013c50103559969', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_4', 'sales_4', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30f8183ff4ec5a6b30724a1da7fbbed0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('319702c956aa5f2e000c89e7b4ad2358', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'customer', 'customer', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('334ffa2aec9300ff712a1f3f3143a4cd', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_gg_moeny', 'bx_gg_moeny', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('34c933903ddf6ba5bad588d913c487c5', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_4', 'gift_4', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('350be7312c299482acfe44fb086f91c1', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_5', 'sales_5', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('35d9204189dd1d1f142a7587f89ab46c', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'email', 'email', 'String', NULL, 18, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c2a8313af79dbecba4c5687b65a66ab', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'cnum', 'cnum', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c71c10a0d27796808cb201e30024fe8', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'school', 'school', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c7597c1efa73ca9400cdc36a9a48e23', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_1', 'gift_1', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3f7ce1ee2ad20770e64016384f2c1cd5', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3f979afa0462738682773d468168b95f', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'region', 'region', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('450316da5f9b7d8505944e16f1284a38', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'monty', 'monty', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('467edbfc6ca934a7a4d600391ed0fb75', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_jj_yongjin', 'bx_jj_yongjin', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4942cc4d04ac7330799ecc3fec48ac8b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id_card', 'id_card', 'String', NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49def4afc641cb52775ff03fdba3007a', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_lowest', 'his_lowest', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49fa04e98f2ed62966d7f6141611dd7e', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49febadfe1eb3a59bfbe802d506aa590', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d0cf377fcd2f03130a53838cbca8069', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d782de2bf10be3a79f04e8841053f00', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d7dd94ecf26b5fa69f9a1f811583340', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'address', 'address', 'String', NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('52444b20f2fcdfe43461a5a49079e4dc', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'health', 'health', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('538563757aa1a49935824ce14568f27c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5406c33ff49384c2bcad5b85a9701355', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'province', 'province', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('57ee0e6ffe7135a943dde2408d424c97', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_1', 'proportion_1', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5a88459afcf01cc20ac5a50322b35fd6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5bc99af9cfddd240794167a6765a1517', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'neikong_zx_money', 'neikong_zx_money', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5cf4a1ca15691d6340e522e1831dc3ac', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_6', 'sales_6', 'String', NULL, 18, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5eb381603c577d06f31e66cb7e2d0a61', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jperson', 'jperson', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6020e457162b86b75a2d335999ab06ec', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'nation', 'nation', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('631632bc2243018788d11d4f8348bfd2', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('665f13c7fcebac6c35c894d885c4b344', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_6', 'proportion_6', 'String', NULL, 20, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('677bf4d6400fc465067b0d5bd6ad2a58', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_2', 'gift_2', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6d1c7b2ec7dbd0488abcd6d2ea59981e', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'company', 'company', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6dae70a5323b3d517c8f13278f0e1d5f', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_5', 'proportion_5', 'String', NULL, 17, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6fdacbeb31220d3bbf203934c158628a', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'hukou', 'hukou', 'String', NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('70abaf24c413f38ff6a3c315ad8824b2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'height', 'height', 'String', NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('718a062a1e42276c1913c7d7836b1bee', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('71cb567cd27fda05d55d80324c7b59e1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'del_flag', 'del_flag', 'String', NULL, 32, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('768fb670937ab4aadde39842df36bfd3', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'cprice', 'cprice', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7b794ecee6f61f64839eb1094a7c20bb', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'region', 'region', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('80017f23232ea91ae32e4718eb10e8c3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_4', 'proportion_4', 'String', NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('80b5e3fd550d9be1a8c8ea69a2a593f8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('812da8abd9d8c538743d0f3617c6ef07', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jphone', 'jphone', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('81dea8f0ccba2b3530038ebcf92b36b1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'name', 'name', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8217bf89dcd0a193f9e2f573fcecf52e', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('84391d55c9bd4185c4abbc0d9a8a3f9b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'native_place', 'native_place', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('85b745b659e7b1e00371b49642ae7cc2', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'update_by', '职位', 'string', NULL, 4, 1, 3, 'zhiwu'); +INSERT INTO `jimu_report_db_field` VALUES ('865ca077977b78934e5e82e733ef4e47', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'major', 'major', 'String', NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8749d00c6c3cf873841a227a5206478a', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_1', 'sales_1', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('87f43f4f5220c34a95d55ff3fa9de0c1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('89bd5c1f5b37b82ab2d56d8c9e50a674', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'sex', 'sex', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8a122291db744a6109a93af5d289787f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'computer_level', 'computer_level', 'String', NULL, 22, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8ab8d51dfb792cdc767e68d7e9370f3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'num', 'num', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8d186f249df9e1c1c549fbdc6a0a4d77', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8db810062e3a19eb83fca651691b848e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_2', 'sales_2', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8e39d42a7fad183fe75ce1a56f148db1', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'bianma', 'bianma', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8fb12c3929ea745f94cc4a90df9d5181', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8fb53733d1fb32d21d2bc2b3c0178c73', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'sex', '性别', 'string', NULL, 10, 1, 1, 'sex'); +INSERT INTO `jimu_report_db_field` VALUES ('9282683fd000d19b205ad6841f0f7b6e', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'total', 'total', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('955f449180fafa0c0a88fcb3aa9138c4', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('967c9254ce5afbb671b2a8fe729ad981', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'city', 'city', NULL, NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('98ff7d929c393a2fcbd41ecc43d1a303', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'birth', 'birth', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9ae6caeaee4354eb80635343707f6e6c', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'dtime', '收货日期', 'datetime', NULL, 9, 1, 2, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9bb9b5329f79564ec030694a639ffd7f', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_zx_money', 'bx_zx_money', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9ddf87596d6701eda383c3d8d7853b2b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education', 'education', 'String', NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9e28f1951ea83b6e6dae4e3892baea90', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'positional_titles', 'positional_titles', 'String', NULL, 25, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9ef07ae18b494bb6cef4fd19efba4771', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'ttime', 'ttime', NULL, NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a2e680c356e712b43343d589539da011', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a42eed89da67da0653650edcc1576f8c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a93ce07361b9d6ec02a58cf7f6b94664', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a949c4beac3fec79e96309a6d2d8f5bb', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a9c7c96a412537b4da3df68ff8e93cc8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ab0aabf8cc08327a4510420bd553e6c0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad146af051ba273a480223d49f59358b', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad1d1fe2ee182c2d3a263a127fea041e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_2', 'proportion_2', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ae5ec6e56478a098b36587e93b1d8908', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'arrival_time', 'arrival_time', 'String', NULL, 24, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b14588abed341d314a08d316dfde553f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'work_experience', 'work_experience', 'String', NULL, 27, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b1de05c2d02cdde59c1e2a93e45964f9', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_time', 'create_time', 'String', NULL, 29, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b279ab8f7d20ebbeec67f5bf2109ba22', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_average', 'his_average', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b450669f376fa9f075ac403c7d7f2ee9', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_3', 'proportion_3', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b46d80bfe53372b6ff92a6f8e8bf38df', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b5afa6c7c63f649460d4d45b7d697098', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'zip_code', 'zip_code', 'String', NULL, 17, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b5df568754994e67a15a8f5b8d4bc297', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'phone', 'phone', 'String', NULL, 19, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b6c59afb66a4143ab7c4dc65ef679926', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'freight', 'freight', 'String', NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b8aafd56ddcf6902909722c7d2529797', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ba83ad8a89105b198aa49798f2940c29', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language', 'foreign_language', 'String', NULL, 20, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c1913cffe0a0a65b8f76ef280af93038', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'tb_zx_money', 'tb_zx_money', 'String', NULL, 6, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c357b23ae68c0ee6c9dab322507dce0b', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3b0443ebecc7152343c5ea3ef32a38f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'graduation_time', 'graduation_time', 'String', NULL, 23, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3d8cd6e68c605fd6d6ac217fed5c8d4', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'weight', 'weight', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3fe8f62ea0c6ce9990bfa22dc0265b6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c40fe2cf7a74a6e96575f73ef5e7d205', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c4d6132699dcdff382c93ab10d64551a', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education_experience', 'education_experience', 'String', NULL, 26, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c5a801ff78f2ca6b1b7a03b3222fdd61', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'biz_income', 'biz_income', 'String', NULL, 1, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c6144f2ca7422a71e951abea1bce6aaf', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c8d1276d19bdd946e9fc18b83aacda15', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'cname', 'cname', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cec893b2241134ba9b03ed6d4edf2919', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d076942aecee8f5197b66eb382ba1995', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d3ef9876d3c56889157747be606f70fc', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_6', 'gift_6', 'String', NULL, 19, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d4872ee0d267f85fd7d0bb090a2e0aa2', NULL, '2021-01-06 11:15:32', NULL, NULL, '1338756341933543425', 'code1', 'code1', 'String', NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d5b7b92023a2fb09fed9d36a4ac7b3e3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_z', 'sales_z', 'String', NULL, 21, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('db503c31de99f35cbcb1f66a69f9964c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('dd56fbd98db5c1cda9dd77637ba1c7e6', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_by', 'create_by', 'String', NULL, 28, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('dfbc8bba6261dcd4ceb3da5f517a0d58', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e7f6104183a7b2408f72b91f4638e9e2', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_3', 'gift_3', 'String', NULL, 10, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ef685270770a69bddb4f24e37eed9dc0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('efe17d82b5daaa3f95364e9afaeffd1c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('efe4e0110a61d9791e18308aed422aa7', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f110f1f947e0f895b552f7edd133a60a', NULL, '2021-01-05 15:09:15', NULL, NULL, '1289140698221678593', 'ctotal', 'ctotal', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f11af753ccbf495818e9c23c1b083ae2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language_level', 'foreign_language_level', 'String', NULL, 21, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f13ddfd9a041fc3b02a164d0541292d5', NULL, '2021-01-06 11:20:40', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'laddress', 'laddress', 'String', NULL, 8, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f1905f7a175f8e56afd8f6c2969582e6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_5', 'gift_5', 'String', NULL, 16, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f430837a3f4c08f425bcd1de46d3a2d3', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f82904af04e557b12dcfe3562900597c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f978117e8eda0daee2c00223f9df4b48', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_time', 'update_time', 'String', NULL, 31, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f984ef26fe0a505b279a0e4a3b27201f', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fac871f69237c6c25abe8c4332eabcbf', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fc07c053ed0ecbfcc45041640acf6cb1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_db_param +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db_param`; +CREATE TABLE `jimu_report_db_param` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jimu_report_head_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '动态报表ID', + `param_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数字段', + `param_txt` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数文本', + `param_value` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数默认值', + `order_num` int(11) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmrheadid`(`jimu_report_head_id`) USING BTREE, + INDEX `idx_jrdp_jimu_report_head_id`(`jimu_report_head_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_db_param +-- ---------------------------- +INSERT INTO `jimu_report_db_param` VALUES ('078d99565feef91904c84b42b43f5174', '1273495682564534273', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:26', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1324279360203526146', '1324279359998005250', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1324279360220303361', '1324279359998005250', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('143f8c164072ddbdeafec5c5b1466827', '1272858455908073473', 'id', 'id', '1', 1, NULL, '2020-07-21 15:31:51', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('173c869cc45b683a9cfe25826110cead', '1272834687525482497', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1805eb351a966dc3c039b5239b6faa49', '1291310198925840385', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('256eb2f8582ce4d74559b1fc1e2917ca', '1291310198925840385', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3a9efc51a6b6723d5a0ddf109aacb2b5', '1288038655293661186', 'pageNo', 'pageNo', '1', 1, NULL, '2020-07-30 17:26:29', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3ced36c7a2cce40c667cc485bf59cd11', '1291217511962902530', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('49bd3f212cd6c406c8584e6bb0d9cf93', '1291549569390243841', 'pageSize', 'pageSize', '10', 2, NULL, '2020-07-30 17:26:29', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('57165a6fe5f2b700d4ef19518de4defd', '1290104038414721025', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('7569e95c1fa73d5438aceb19c1b85ef0', '1288038655293661186', 'pageSize', 'pageSize', '10', 2, NULL, '2020-07-30 17:26:29', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('7d7765754aadaddab91bf1257447ae73', '1291549569390243841', 'pageNo', 'pageNo', '1', 1, NULL, '2020-07-30 17:26:29', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('90b22a058cc331146b548bc93f09b5cd', '1289140698221678593', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('a29c10ed01c6608e899e1368f2d5d7e3', '1316997232402231298', 'id', 'id', '1', 1, NULL, '2021-01-13 14:31:13', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('a803707f3383dd9f4685fadc7efa07f4', '1224643501392728065', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('b7c34e8a3c2804715825af4bdbcf857a', '1224643501392728065', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('d8010a4ffbe567e6117e7f59641aeb7c', '1289140698221678593', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('d9d94d6b09dd074f39af96d7a4696f9a', '1291217511962902530', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_map +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_map`; +CREATE TABLE `jimu_report_map` ( + `id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `label` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地图名称', + `name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地图编码', + `data` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '地图数据', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '0表示未删除,1表示删除', + `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_jmreport_map_name`(`name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '地图配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_map +-- ---------------------------- +INSERT INTO `jimu_report_map` VALUES ('1334703777051127809', '山东', 'shandong', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":370100,\"name\":\"济南市\",\"center\":[117.000923,36.675807],\"centroid\":[117.221244,36.639974],\"childrenNum\":12,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":0,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.273417,37.532619],[117.275549,37.526193],[117.284393,37.522266],[117.286525,37.510046],[117.307215,37.507744],[117.317718,37.499371],[117.312585,37.487068],[117.285894,37.479328],[117.283998,37.471587],[117.304609,37.466069],[117.307768,37.46194],[117.295449,37.4538],[117.309189,37.447486],[117.353332,37.450901],[117.369758,37.436048],[117.368257,37.419563],[117.360202,37.405697],[117.368652,37.396399],[117.401029,37.379071],[117.415401,37.364203],[117.41319,37.342255],[117.409163,37.329488],[117.411611,37.308604],[117.417612,37.296587],[117.430168,37.285166],[117.432379,37.272032],[117.43688,37.27235],[117.438302,37.25786],[117.443908,37.250056],[117.431037,37.254396],[117.424403,37.243367],[117.429141,37.239783],[117.408768,37.239703],[117.402371,37.224808],[117.404977,37.21716],[117.417928,37.20003],[117.436091,37.184251],[117.442724,37.170859],[117.444066,37.156868],[117.4507,37.153957],[117.4507,37.143711],[117.455596,37.11767],[117.459781,37.109931],[117.442092,37.093574],[117.409241,37.089425],[117.391158,37.083479],[117.365256,37.069272],[117.336433,37.073941],[117.339434,37.056419],[117.33667,37.046838],[117.326088,37.036178],[117.315349,37.030547],[117.317323,37.020923],[117.328457,37.011218],[117.35349,37.003349],[117.365335,36.99496],[117.378286,36.956997],[117.391632,36.952],[117.40403,36.955038],[117.415322,36.964311],[117.432853,36.954878],[117.444461,36.958116],[117.458754,36.957676],[117.477628,36.961154],[117.476522,36.968348],[117.494527,36.972344],[117.509847,36.969267],[117.519875,36.957117],[117.536854,36.978498],[117.549094,36.979817],[117.555253,36.970785],[117.54933,36.96507],[117.56544,36.959954],[117.56465,36.945084],[117.553674,36.940727],[117.551305,36.93385],[117.539538,36.941486],[117.534248,36.931611],[117.56923,36.915736],[117.58376,36.894176],[117.585024,36.886815],[117.579891,36.878093],[117.577364,36.862847],[117.580523,36.85136],[117.608556,36.821815],[117.648119,36.805436],[117.677811,36.783245],[117.687603,36.763853],[117.695974,36.754115],[117.724165,36.755998],[117.747303,36.748584],[117.736642,36.729423],[117.739959,36.721004],[117.71848,36.704724],[117.718006,36.697826],[117.715637,36.691208],[117.701265,36.685191],[117.695184,36.666978],[117.698027,36.652974],[117.709003,36.651569],[117.712241,36.642258],[117.70853,36.635154],[117.715321,36.627527],[117.714926,36.610545],[117.706555,36.611549],[117.705055,36.605807],[117.690525,36.604883],[117.697869,36.599422],[117.715163,36.600546],[117.706792,36.593559],[117.715321,36.578537],[117.706792,36.581469],[117.696132,36.575042],[117.694315,36.568896],[117.720849,36.560057],[117.72377,36.54732],[117.739406,36.539925],[117.742486,36.525737],[117.750777,36.524652],[117.76586,36.512994],[117.765544,36.509496],[117.751646,36.509979],[117.735853,36.504993],[117.743118,36.498439],[117.755673,36.496228],[117.757332,36.484485],[117.748566,36.478694],[117.765544,36.469845],[117.757016,36.459144],[117.763491,36.452868],[117.755752,36.445303],[117.779838,36.441239],[117.786471,36.434277],[117.7965,36.43963],[117.799343,36.432265],[117.817268,36.436129],[117.822717,36.44305],[117.833062,36.44301],[117.826823,36.427114],[117.829508,36.417776],[117.855094,36.412945],[117.859279,36.389433],[117.867492,36.386373],[117.879732,36.370626],[117.882101,36.35673],[117.890314,36.366035],[117.89521,36.359227],[117.893472,36.339446],[117.902633,36.352057],[117.915346,36.352903],[117.933904,36.341219],[117.933509,36.334369],[117.919611,36.324738],[117.918347,36.317725],[117.924823,36.313171],[117.922533,36.300514],[117.93114,36.283742],[117.926797,36.277532],[117.932719,36.271846],[117.943696,36.274064],[117.972993,36.268378],[117.975362,36.262328],[117.96707,36.248251],[117.96328,36.224971],[117.967781,36.21464],[117.959332,36.204308],[117.943933,36.207981],[117.928534,36.196558],[117.921664,36.203662],[117.914636,36.200837],[117.915899,36.192562],[117.903027,36.172092],[117.912109,36.171648],[117.917873,36.16337],[117.90666,36.152708],[117.914162,36.140631],[117.91203,36.132753],[117.923875,36.1174],[117.921111,36.110005],[117.931535,36.094203],[117.939984,36.094324],[117.946618,36.100387],[117.954041,36.090201],[117.953172,36.081833],[117.946223,36.08151],[117.94188,36.071807],[117.948829,36.062589],[117.935799,36.061214],[117.932798,36.052196],[117.946855,36.04253],[117.949855,36.018259],[117.94338,36.017288],[117.950803,35.996489],[117.937536,35.99653],[117.935088,36.004421],[117.926165,36.005068],[117.922848,36.015467],[117.914557,36.020039],[117.895052,36.020363],[117.877047,36.016357],[117.866386,36.007415],[117.854462,36.006889],[117.841827,36.011947],[117.828719,36.008022],[117.825244,36.013363],[117.801159,36.012959],[117.794763,36.015143],[117.782286,36.007294],[117.781022,35.995437],[117.762307,35.990621],[117.756621,35.991916],[117.756542,36.002236],[117.750304,36.011947],[117.757016,36.019392],[117.741696,36.036058],[117.725824,36.029667],[117.720454,36.038243],[117.701186,36.04528],[117.689972,36.052358],[117.656569,36.049729],[117.630588,36.059879],[117.601844,36.075648],[117.575943,36.074516],[117.561649,36.079327],[117.552884,36.087978],[117.547672,36.106166],[117.534879,36.111419],[117.505898,36.098245],[117.491052,36.096587],[117.484893,36.10075],[117.473758,36.089797],[117.451963,36.087412],[117.447067,36.09206],[117.456148,36.100467],[117.454885,36.111177],[117.463571,36.116875],[117.44683,36.120834],[117.459623,36.1498],[117.469178,36.154687],[117.476601,36.150123],[117.487972,36.15921],[117.475653,36.173102],[117.461202,36.170194],[117.446988,36.18691],[117.440434,36.191189],[117.452437,36.203138],[117.447778,36.203541],[117.447383,36.218313],[117.427878,36.221662],[117.412716,36.210927],[117.396607,36.215972],[117.385235,36.226989],[117.393132,36.226747],[117.392895,36.237439],[117.417217,36.243652],[117.413901,36.267934],[117.394553,36.266522],[117.397791,36.283782],[117.387604,36.285556],[117.38792,36.296361],[117.379707,36.315146],[117.38871,36.326148],[117.387762,36.337915],[117.362729,36.360234],[117.351753,36.377997],[117.35041,36.393379],[117.344962,36.403968],[117.339434,36.425786],[117.339118,36.438181],[117.346936,36.455724],[117.346383,36.46373],[117.335328,36.466345],[117.30682,36.467029],[117.30682,36.472097],[117.288184,36.476039],[117.288973,36.468718],[117.275786,36.451218],[117.263862,36.449206],[117.249726,36.436732],[117.242145,36.41528],[117.218297,36.406182],[117.208742,36.405297],[117.200924,36.389755],[117.191685,36.378762],[117.180945,36.37256],[117.18292,36.360798],[117.179603,36.353144],[117.161361,36.351895],[117.142567,36.345731],[117.137039,36.335135],[117.111691,36.340413],[117.107347,36.338882],[117.088711,36.346013],[117.07734,36.321957],[117.077655,36.307205],[117.074102,36.296724],[117.066995,36.296885],[117.051201,36.288741],[117.0482,36.283701],[117.030275,36.277532],[117.027353,36.268983],[117.003347,36.265353],[117.002794,36.254503],[116.987632,36.250711],[116.975471,36.243208],[116.956835,36.259787],[116.950201,36.257327],[116.932828,36.261925],[116.928722,36.26991],[116.891133,36.255471],[116.873129,36.264062],[116.867759,36.28108],[116.855519,36.289709],[116.855756,36.301642],[116.830644,36.294587],[116.808612,36.299022],[116.786659,36.311357],[116.772761,36.312002],[116.762574,36.305391],[116.732961,36.294144],[116.710376,36.279185],[116.701058,36.280153],[116.686528,36.275435],[116.675709,36.276645],[116.649018,36.295797],[116.615536,36.294587],[116.610403,36.282451],[116.595794,36.270999],[116.587502,36.268862],[116.581264,36.255471],[116.574393,36.263457],[116.558837,36.261037],[116.552361,36.247767],[116.53641,36.245588],[116.525591,36.255229],[116.512325,36.253414],[116.506402,36.240344],[116.485239,36.236067],[116.487529,36.228441],[116.472604,36.21464],[116.481922,36.197002],[116.502059,36.192764],[116.51035,36.176857],[116.525986,36.168297],[116.52188,36.157151],[116.510192,36.148346],[116.507192,36.141277],[116.519748,36.141196],[116.528513,36.145276],[116.525275,36.135298],[116.543122,36.13958],[116.5586,36.133804],[116.562153,36.121643],[116.569024,36.118774],[116.566891,36.108752],[116.554651,36.108187],[116.546597,36.101195],[116.543359,36.086604],[116.532303,36.074274],[116.504112,36.064732],[116.471182,36.06457],[116.452072,36.058019],[116.449387,36.047302],[116.434541,36.038607],[116.436121,36.046534],[116.429566,36.052439],[116.433357,36.059839],[116.427829,36.067441],[116.409508,36.068007],[116.401059,36.074031],[116.398058,36.084582],[116.386845,36.090807],[116.360233,36.084744],[116.352731,36.070797],[116.338753,36.060082],[116.324855,36.054178],[116.310404,36.052196],[116.304718,36.046251],[116.301244,36.031123],[116.294689,36.031407],[116.271552,36.043824],[116.267998,36.052964],[116.267287,36.074233],[116.273368,36.093758],[116.27171,36.109843],[116.261444,36.122693],[116.246677,36.149436],[116.226066,36.173748],[116.234911,36.180935],[116.255047,36.203703],[116.280159,36.221945],[116.28624,36.239174],[116.307166,36.259464],[116.310799,36.270515],[116.322644,36.284669],[116.331251,36.290677],[116.374526,36.3039],[116.406745,36.319015],[116.430593,36.318007],[116.441411,36.321755],[116.449071,36.337149],[116.484607,36.336948],[116.503717,36.369982],[116.519984,36.384158],[116.528592,36.387259],[116.546202,36.40892],[116.591213,36.416286],[116.612377,36.42333],[116.6198,36.428522],[116.620905,36.44144],[116.611429,36.459104],[116.613009,36.473425],[116.595636,36.480383],[116.593267,36.485973],[116.602032,36.495223],[116.624301,36.497233],[116.627223,36.508853],[116.610087,36.51609],[116.60835,36.52011],[116.622801,36.532651],[116.629592,36.544587],[116.646728,36.544105],[116.658968,36.553026],[116.662916,36.563111],[116.661258,36.578376],[116.682421,36.580586],[116.694345,36.591149],[116.693319,36.607895],[116.71314,36.608858],[116.742042,36.620381],[116.759494,36.632746],[116.763126,36.651971],[116.777262,36.660718],[116.780736,36.671552],[116.780657,36.691048],[116.799689,36.694417],[116.802768,36.706729],[116.830881,36.723851],[116.842489,36.72786],[116.861757,36.730345],[116.873997,36.739846],[116.88679,36.745538],[116.883868,36.758243],[116.87076,36.759164],[116.865548,36.777877],[116.868233,36.801872],[116.872813,36.812004],[116.887975,36.811404],[116.882447,36.824058],[116.887106,36.833427],[116.892476,36.830023],[116.919404,36.822776],[116.933223,36.823697],[116.935908,36.829743],[116.934724,36.845116],[116.9442,36.844916],[116.948069,36.839231],[116.962836,36.842674],[116.96181,36.867529],[116.963152,36.893896],[116.957466,36.916495],[116.934408,36.925973],[116.922563,36.93453],[116.935434,36.93457],[116.931881,36.946204],[116.933381,36.959595],[116.907717,36.963272],[116.897767,36.962712],[116.899188,36.977499],[116.886158,36.983573],[116.885764,36.991444],[116.875024,36.999274],[116.891607,37.00271],[116.907796,37.019046],[116.943173,37.030907],[116.948701,37.036537],[116.944279,37.042327],[116.928643,37.05103],[116.925247,37.069831],[116.91972,37.081364],[116.919009,37.093056],[116.931486,37.100477],[116.982578,37.113601],[117.004531,37.121219],[117.024273,37.119664],[117.044884,37.122615],[117.047411,37.134739],[117.059809,37.137251],[117.054676,37.141717],[117.050648,37.160894],[117.061783,37.16496],[117.06352,37.182656],[117.05744,37.192141],[117.045358,37.197161],[117.037382,37.195169],[117.037777,37.207361],[117.022299,37.215089],[117.03596,37.224091],[117.036592,37.237393],[117.042673,37.238867],[117.041251,37.247667],[117.032328,37.253241],[117.030275,37.264229],[117.038961,37.266538],[117.024273,37.278918],[117.002241,37.285962],[116.993397,37.32201],[116.986684,37.335335],[116.987158,37.342692],[117.006663,37.355138],[117.009664,37.359671],[116.99924,37.376964],[117.008164,37.392464],[117.019693,37.405419],[117.018193,37.418967],[117.029406,37.435174],[117.085631,37.437517],[117.096845,37.440099],[117.104978,37.455309],[117.098819,37.469721],[117.109795,37.47901],[117.124878,37.483853],[117.135618,37.475239],[117.163809,37.478971],[117.176049,37.486116],[117.199345,37.487148],[117.22114,37.51318],[117.230063,37.528891],[117.238197,37.532897],[117.260861,37.530081],[117.273417,37.532619]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370200,\"name\":\"青岛市\",\"center\":[120.355173,36.082982],\"centroid\":[120.150851,36.451234],\"childrenNum\":10,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":1,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.850108,36.612271],[120.86598,36.605606],[120.884854,36.60143],[120.891961,36.58898],[120.893382,36.57918],[120.91265,36.568414],[120.923785,36.572029],[120.936341,36.56532],[120.962163,36.562789],[120.969349,36.559495],[120.983326,36.545913],[120.983958,36.540809],[120.962716,36.519225],[120.954345,36.507567],[120.95861,36.498721],[120.954977,36.489311],[120.967691,36.47797],[120.963585,36.464334],[120.952371,36.459184],[120.947238,36.449287],[120.938315,36.44812],[120.934524,36.454678],[120.920152,36.455201],[120.907833,36.445987],[120.917388,36.435364],[120.91881,36.425383],[120.925522,36.419909],[120.935077,36.421036],[120.927812,36.410047],[120.918968,36.419144],[120.903332,36.406142],[120.891645,36.389675],[120.895909,36.376104],[120.872061,36.367001],[120.87443,36.373244],[120.854925,36.381903],[120.851134,36.406021],[120.859505,36.412422],[120.858952,36.424578],[120.838342,36.436974],[120.842369,36.441601],[120.843001,36.457736],[120.83921,36.464374],[120.828471,36.466627],[120.759453,36.462604],[120.756768,36.458098],[120.761664,36.443211],[120.760084,36.434559],[120.751003,36.431299],[120.736868,36.432829],[120.726997,36.422928],[120.72597,36.413912],[120.71144,36.408678],[120.694383,36.390158],[120.700385,36.37123],[120.709703,36.368089],[120.716494,36.360516],[120.72676,36.359831],[120.729603,36.349801],[120.739632,36.3386],[120.744449,36.328163],[120.73821,36.32373],[120.707966,36.328929],[120.692093,36.325544],[120.663033,36.33179],[120.656005,36.322158],[120.66635,36.309342],[120.665718,36.29749],[120.656005,36.28862],[120.65482,36.27983],[120.659716,36.27483],[120.677326,36.281443],[120.686249,36.279104],[120.685855,36.260231],[120.689724,36.251437],[120.681038,36.238932],[120.689171,36.230176],[120.696752,36.204026],[120.693041,36.190624],[120.697147,36.168579],[120.707255,36.165066],[120.707018,36.159331],[120.698332,36.158887],[120.704333,36.152344],[120.705439,36.139702],[120.716257,36.142085],[120.719811,36.13441],[120.71223,36.126572],[120.695647,36.123744],[120.672667,36.129844],[120.650951,36.117885],[120.632235,36.113319],[120.621259,36.119259],[120.612099,36.117521],[120.607834,36.107217],[120.599859,36.101801],[120.579248,36.103943],[120.580827,36.111419],[120.573325,36.114248],[120.567087,36.105964],[120.547187,36.10952],[120.552241,36.097881],[120.547345,36.092141],[120.526261,36.093435],[120.497832,36.08624],[120.479827,36.091656],[120.467587,36.087169],[120.449662,36.07302],[120.441923,36.063236],[120.437185,36.0655],[120.42226,36.054986],[120.415311,36.057413],[120.404413,36.051589],[120.38783,36.051711],[120.389172,36.059394],[120.37022,36.053409],[120.371089,36.044835],[120.365166,36.041398],[120.35798,36.04892],[120.345661,36.043541],[120.337922,36.044633],[120.342897,36.05167],[120.337527,36.054986],[120.324577,36.051104],[120.324814,36.059515],[120.315969,36.059677],[120.307993,36.050214],[120.296069,36.052439],[120.297649,36.045361],[120.286119,36.047181],[120.290147,36.060526],[120.30136,36.071282],[120.311231,36.087614],[120.312653,36.100185],[120.317549,36.108106],[120.326235,36.111662],[120.333658,36.134652],[120.347004,36.155818],[120.356953,36.166076],[120.358217,36.174757],[120.369509,36.177745],[120.35877,36.200312],[120.336896,36.213954],[120.319997,36.232234],[120.297412,36.225455],[120.293305,36.219241],[120.29828,36.203783],[120.313205,36.196316],[120.310283,36.185295],[120.291489,36.185941],[120.28075,36.17932],[120.276564,36.185699],[120.262982,36.182267],[120.260929,36.198415],[120.244819,36.199384],[120.235027,36.189211],[120.224445,36.19131],[120.217338,36.211412],[120.20723,36.211613],[120.181566,36.203945],[120.164351,36.188767],[120.140345,36.173304],[120.142556,36.143539],[120.128105,36.129723],[120.1086,36.12742],[120.116023,36.114046],[120.116891,36.102852],[120.152111,36.095254],[120.161903,36.082682],[120.173906,36.077225],[120.181645,36.066511],[120.19499,36.064206],[120.231868,36.063842],[120.241345,36.060445],[120.24095,36.047828],[120.230605,36.044916],[120.23479,36.030638],[120.223656,36.022385],[120.223577,36.016398],[120.19886,35.99572],[120.213232,35.998351],[120.244977,36.020444],[120.25698,36.024813],[120.265509,36.014011],[120.256427,36.005433],[120.248768,35.992078],[120.247662,35.982567],[120.254927,35.980826],[120.265588,36.001062],[120.271273,35.99394],[120.278775,35.996368],[120.27459,36.004664],[120.289673,36.017086],[120.309494,36.014132],[120.316522,36.002155],[120.305072,35.97184],[120.284619,35.965565],[120.261718,35.965484],[120.251531,35.95937],[120.246477,35.947466],[120.233132,35.941553],[120.222076,35.924947],[120.209284,35.917616],[120.204388,35.910404],[120.202098,35.89205],[120.185198,35.88747],[120.169405,35.888565],[120.172169,35.904408],[120.184172,35.915671],[120.194438,35.93402],[120.210784,35.938435],[120.207862,35.947344],[120.179276,35.936653],[120.167983,35.918426],[120.15677,35.909149],[120.147768,35.907852],[120.141924,35.919438],[120.142714,35.909392],[120.135843,35.905421],[120.12542,35.906718],[120.123998,35.895291],[120.118392,35.888524],[120.102203,35.881918],[120.084041,35.880378],[120.07875,35.885768],[120.062798,35.87134],[120.036423,35.824753],[120.033264,35.806013],[120.041319,35.799198],[120.049453,35.782278],[120.043135,35.776759],[120.03745,35.763041],[120.037529,35.753908],[120.031369,35.752244],[120.020235,35.722239],[120.011074,35.713223],[120.001519,35.720209],[119.981224,35.715335],[119.986041,35.729711],[119.978461,35.739496],[119.967879,35.74108],[119.969932,35.749078],[119.959982,35.759104],[119.937081,35.763407],[119.924841,35.758252],[119.920735,35.737548],[119.930369,35.728899],[119.949321,35.729873],[119.953349,35.72561],[119.952954,35.713142],[119.94482,35.705506],[119.923894,35.696529],[119.910864,35.674305],[119.912285,35.660651],[119.927921,35.65045],[119.925157,35.63736],[119.902493,35.63297],[119.894597,35.628742],[119.877619,35.610972],[119.868379,35.608817],[119.851717,35.622074],[119.844768,35.623619],[119.831422,35.618333],[119.829606,35.643702],[119.824315,35.646304],[119.818472,35.63858],[119.800625,35.626465],[119.802204,35.620244],[119.792649,35.615446],[119.802994,35.609183],[119.800467,35.59869],[119.792649,35.59385],[119.800862,35.581891],[119.786174,35.576073],[119.780172,35.58486],[119.76967,35.577212],[119.762483,35.578351],[119.752849,35.588684],[119.751349,35.617845],[119.729949,35.618943],[119.717946,35.615649],[119.682173,35.590027],[119.662115,35.589294],[119.651455,35.588766],[119.634713,35.598731],[119.614972,35.606336],[119.609286,35.59202],[119.600599,35.590271],[119.592308,35.600683],[119.57762,35.586243],[119.556535,35.592508],[119.538215,35.589294],[119.536872,35.606011],[119.518157,35.615446],[119.517762,35.625774],[119.524474,35.632279],[119.528265,35.674305],[119.519105,35.68552],[119.51484,35.697992],[119.518473,35.700632],[119.521079,35.716879],[119.517762,35.723742],[119.525422,35.730604],[119.527317,35.723214],[119.545085,35.726747],[119.560563,35.721752],[119.566485,35.714523],[119.576988,35.71237],[119.588833,35.715701],[119.601231,35.709446],[119.614182,35.716675],[119.624685,35.712817],[119.627843,35.722077],[119.605495,35.747454],[119.591992,35.753218],[119.596256,35.773756],[119.611576,35.776597],[119.617972,35.789623],[119.60897,35.799279],[119.612445,35.812707],[119.622631,35.816114],[119.629344,35.833878],[119.649796,35.845191],[119.664326,35.841015],[119.676014,35.842515],[119.68699,35.861814],[119.704047,35.863962],[119.71834,35.853138],[119.725211,35.856746],[119.72221,35.865138],[119.736898,35.86303],[119.738003,35.873123],[119.727738,35.902544],[119.721262,35.906718],[119.716208,35.927337],[119.701362,35.923732],[119.701757,35.944469],[119.690149,35.963702],[119.684858,35.982648],[119.689122,36.000212],[119.681068,36.012068],[119.706495,36.028292],[119.717314,36.044229],[119.704126,36.055269],[119.695677,36.053045],[119.675698,36.064085],[119.666695,36.062993],[119.633608,36.067683],[119.632187,36.091535],[119.657061,36.100872],[119.657614,36.108631],[119.643716,36.127178],[119.651218,36.130531],[119.649954,36.137157],[119.660852,36.154122],[119.671039,36.177866],[119.681305,36.18045],[119.691728,36.176292],[119.723473,36.175565],[119.732792,36.172536],[119.733818,36.163572],[119.748111,36.158645],[119.772354,36.167691],[119.782778,36.165308],[119.792333,36.171648],[119.813023,36.167691],[119.81326,36.175242],[119.821315,36.171285],[119.82242,36.177987],[119.831738,36.180612],[119.823131,36.19894],[119.828816,36.210685],[119.819498,36.211856],[119.808048,36.232839],[119.82092,36.244499],[119.820446,36.257367],[119.82929,36.258859],[119.83387,36.278822],[119.848795,36.292692],[119.854402,36.302328],[119.862773,36.302368],[119.865379,36.308898],[119.891991,36.318773],[119.896966,36.334047],[119.895939,36.34827],[119.904784,36.369942],[119.90431,36.38154],[119.909837,36.384359],[119.93029,36.385165],[119.936371,36.380655],[119.945452,36.384682],[119.941425,36.39503],[119.926421,36.403324],[119.925236,36.419346],[119.933923,36.42007],[119.935976,36.427436],[119.949795,36.446511],[119.953981,36.444217],[119.968432,36.450051],[119.994175,36.450333],[119.996623,36.446309],[120.011864,36.454236],[120.012812,36.467833],[120.006889,36.468799],[120.004125,36.477447],[120.010758,36.484445],[120.004204,36.489512],[120.010364,36.509255],[119.997571,36.504431],[119.974749,36.515688],[119.971985,36.522441],[119.951375,36.519788],[119.936292,36.511507],[119.936687,36.496389],[119.923025,36.495464],[119.920261,36.522079],[119.917576,36.525858],[119.826763,36.54101],[119.798019,36.551619],[119.784516,36.554673],[119.755929,36.565521],[119.74748,36.571788],[119.72758,36.562749],[119.730107,36.581027],[119.701125,36.602634],[119.681857,36.606891],[119.670328,36.616246],[119.651297,36.623633],[119.625079,36.638807],[119.617025,36.652532],[119.61355,36.66453],[119.607154,36.667379],[119.596651,36.689884],[119.587412,36.696101],[119.579831,36.711581],[119.567433,36.713065],[119.561036,36.720884],[119.547059,36.725454],[119.534977,36.743333],[119.530555,36.765256],[119.532766,36.78008],[119.539162,36.787732],[119.539162,36.799949],[119.550613,36.80868],[119.563721,36.802753],[119.56767,36.805717],[119.597757,36.857244],[119.599652,36.878253],[119.599968,36.920614],[119.5837,36.950441],[119.598072,36.989406],[119.604548,36.996038],[119.60976,37.013894],[119.619078,37.017848],[119.61971,37.012895],[119.629344,37.01621],[119.66251,37.008262],[119.681699,36.998475],[119.716998,37.007144],[119.722289,36.993401],[119.731133,36.988487],[119.743057,36.992483],[119.750559,36.990844],[119.769906,36.996597],[119.771881,37.006984],[119.804968,37.013814],[119.820209,36.999594],[119.829606,37.002031],[119.85148,37.002031],[119.900045,36.997556],[119.902257,36.9948],[119.923341,36.993961],[119.939608,37.004108],[119.949716,37.006185],[119.961561,37.013654],[119.975618,37.011098],[119.980198,37.018088],[119.993543,37.012176],[120.002309,37.013494],[120.024104,36.999913],[120.035238,36.998395],[120.049374,37.020045],[120.09249,37.017928],[120.101571,37.014293],[120.123051,37.01645],[120.138134,37.022201],[120.142319,37.015292],[120.159929,37.013375],[120.167273,37.017968],[120.166404,37.025795],[120.173037,37.034421],[120.180697,37.032544],[120.189621,37.038094],[120.193411,37.034261],[120.205335,37.038374],[120.21647,37.056699],[120.214101,37.07019],[120.220497,37.08711],[120.229894,37.089544],[120.231237,37.106301],[120.236606,37.125965],[120.245688,37.118906],[120.264087,37.114718],[120.280828,37.13111],[120.303413,37.130153],[120.300176,37.119584],[120.315337,37.113043],[120.320628,37.10654],[120.331684,37.111966],[120.336896,37.104267],[120.336343,37.092058],[120.34574,37.087789],[120.348583,37.077094],[120.357822,37.084357],[120.362244,37.100477],[120.369667,37.104626],[120.388225,37.104227],[120.398096,37.096447],[120.408914,37.09517],[120.412942,37.103149],[120.407098,37.112803],[120.415153,37.110569],[120.439475,37.116912],[120.440265,37.122655],[120.462928,37.115157],[120.478643,37.124211],[120.493015,37.126723],[120.493805,37.1345],[120.505729,37.143551],[120.506834,37.148854],[120.517258,37.148974],[120.527129,37.143352],[120.527998,37.136733],[120.542528,37.128677],[120.547661,37.113003],[120.536368,37.081963],[120.539843,37.060371],[120.533289,37.053944],[120.541738,37.044163],[120.549793,37.041288],[120.558953,37.047437],[120.570877,37.046399],[120.58446,37.058136],[120.586513,37.048515],[120.606176,37.047157],[120.613915,37.023839],[120.601754,37.012696],[120.606413,37.001192],[120.593857,36.991244],[120.582328,37.001791],[120.575931,36.999074],[120.574036,36.987568],[120.568508,36.983293],[120.566534,36.96559],[120.560296,36.960674],[120.563218,36.95172],[120.571114,36.948682],[120.574984,36.927053],[120.592909,36.912216],[120.617389,36.911136],[120.622838,36.907377],[120.622838,36.890856],[120.592909,36.882134],[120.576642,36.879894],[120.57988,36.858885],[120.588408,36.859045],[120.595989,36.852681],[120.58754,36.843635],[120.589751,36.838791],[120.609809,36.832906],[120.612336,36.829223],[120.601517,36.804996],[120.590382,36.801552],[120.563454,36.802953],[120.56377,36.795343],[120.5554,36.778718],[120.540791,36.7679],[120.544502,36.76213],[120.546397,36.744616],[120.560375,36.742492],[120.562586,36.736479],[120.584065,36.735236],[120.58525,36.728501],[120.596542,36.708052],[120.586118,36.698829],[120.589751,36.694497],[120.616521,36.689764],[120.619206,36.681541],[120.631446,36.673357],[120.625128,36.671231],[120.627339,36.659836],[120.642027,36.666095],[120.652135,36.663327],[120.648977,36.655863],[120.660585,36.647998],[120.657426,36.626644],[120.644712,36.626524],[120.643449,36.613436],[120.635947,36.597775],[120.637763,36.574199],[120.664059,36.583478],[120.665402,36.587454],[120.679695,36.589181],[120.702991,36.598338],[120.699121,36.60665],[120.70836,36.612914],[120.708281,36.621385],[120.725733,36.624436],[120.751556,36.615042],[120.757557,36.606088],[120.765533,36.607011],[120.777062,36.600546],[120.779747,36.591551],[120.786223,36.589663],[120.850108,36.612271]]],[[[120.584381,36.096183],[120.587461,36.099457],[120.595042,36.090282],[120.579485,36.091535],[120.584381,36.096183]]],[[[120.990039,36.413348],[120.981431,36.417494],[120.963663,36.41363],[120.950318,36.414757],[120.948502,36.421117],[120.9639,36.424618],[120.969823,36.431581],[120.978115,36.428643],[120.990039,36.413348]]],[[[121.004253,36.488306],[120.988538,36.485249],[120.989881,36.492367],[121.004253,36.488306]]],[[[120.877352,35.89359],[120.888802,35.897277],[120.875377,35.888443],[120.877352,35.89359]]],[[[119.73524,35.595762],[119.738872,35.599666],[119.743689,35.591328],[119.741873,35.583884],[119.73524,35.595762]]],[[[120.158823,35.76499],[120.17209,35.785727],[120.180539,35.788649],[120.184725,35.766978],[120.192858,35.757156],[120.187962,35.748712],[120.173037,35.741405],[120.158665,35.744896],[120.155428,35.751838],[120.158823,35.76499]]],[[[120.775088,36.237963],[120.777457,36.222308],[120.76806,36.230701],[120.775088,36.237963]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370300,\"name\":\"淄博市\",\"center\":[118.047648,36.814939],\"centroid\":[118.058672,36.610968],\"childrenNum\":8,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":2,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.718006,36.697826],[117.725666,36.695219],[117.754173,36.696944],[117.777942,36.695219],[117.78197,36.70304],[117.793025,36.707451],[117.795157,36.719761],[117.810161,36.734394],[117.820743,36.756359],[117.826429,36.763011],[117.834404,36.751871],[117.832983,36.744816],[117.852488,36.750708],[117.850672,36.764735],[117.840327,36.777516],[117.825639,36.775834],[117.824297,36.787933],[117.815531,36.788573],[117.814662,36.797306],[117.820901,36.801511],[117.822085,36.825139],[117.831877,36.836629],[117.828008,36.855883],[117.832825,36.859966],[117.856594,36.859926],[117.865597,36.866529],[117.875152,36.861246],[117.891103,36.864408],[117.891814,36.871811],[117.917005,36.86973],[117.9189,36.880094],[117.929719,36.890216],[117.940616,36.891616],[117.9403,36.901177],[117.950645,36.902137],[117.960674,36.910376],[117.96178,36.922494],[117.949145,36.918375],[117.94338,36.930012],[117.935404,36.915736],[117.936115,36.93489],[117.931772,36.941886],[117.913372,36.953679],[117.910292,36.962592],[117.911951,36.975141],[117.906581,36.981695],[117.870493,36.985451],[117.866623,36.993282],[117.866386,37.007024],[117.870493,37.013375],[117.865992,37.023719],[117.841827,37.026354],[117.840327,37.035539],[117.847355,37.065959],[117.800369,37.070789],[117.771783,37.069032],[117.761991,37.065839],[117.739801,37.064921],[117.726692,37.068753],[117.703002,37.068673],[117.673942,37.073143],[117.644645,37.083878],[117.619375,37.090103],[117.608477,37.090622],[117.590946,37.084996],[117.575074,37.089185],[117.567888,37.11029],[117.576969,37.114758],[117.574442,37.12106],[117.557464,37.124211],[117.551305,37.146781],[117.574284,37.151366],[117.586366,37.160216],[117.592052,37.169624],[117.598212,37.203058],[117.615348,37.212699],[117.627193,37.228074],[117.63043,37.247269],[117.644329,37.265862],[117.659491,37.274101],[117.675995,37.270121],[117.693447,37.257661],[117.729851,37.249101],[117.760333,37.244959],[117.773678,37.244959],[117.782128,37.248702],[117.818848,37.276012],[117.83859,37.282659],[117.850909,37.28246],[117.8776,37.273027],[117.888497,37.262319],[117.909266,37.265065],[117.941327,37.280549],[117.948829,37.26829],[117.947013,37.262159],[117.963833,37.271753],[117.990603,37.262358],[117.990761,37.248981],[117.996446,37.246273],[117.981048,37.238429],[117.973862,37.216483],[117.98089,37.218674],[117.984364,37.210349],[117.994393,37.212699],[118.010898,37.20756],[118.019584,37.210309],[118.022348,37.2221],[118.036799,37.220905],[118.046275,37.216324],[118.048012,37.205568],[118.064122,37.21007],[118.074072,37.204094],[118.077941,37.188953],[118.082995,37.185605],[118.071545,37.177675],[118.074467,37.170341],[118.062385,37.162528],[118.059858,37.151087],[118.065069,37.139564],[118.079679,37.120781],[118.068623,37.115875],[118.057252,37.106141],[118.045485,37.105982],[118.045959,37.098202],[118.056857,37.093654],[118.063016,37.082841],[118.086075,37.091899],[118.111187,37.094652],[118.115925,37.100636],[118.130455,37.091101],[118.136062,37.077773],[118.13622,37.06536],[118.156909,37.065281],[118.15762,37.057776],[118.150829,37.054743],[118.15146,37.047038],[118.139615,37.044363],[118.139299,37.033103],[118.134008,37.025955],[118.139299,37.014693],[118.138983,37.005985],[118.153198,37.000512],[118.15146,36.988527],[118.161331,36.988567],[118.160936,36.981934],[118.192918,36.977739],[118.195209,36.967348],[118.209739,36.963152],[118.222531,36.967109],[118.231376,36.974822],[118.235087,36.98557],[118.247327,36.98613],[118.250802,37.002949],[118.262568,37.00271],[118.271412,37.006744],[118.288785,36.999993],[118.291628,36.995878],[118.294629,36.969666],[118.312476,36.970905],[118.322347,36.974502],[118.324637,36.964751],[118.3443,36.960714],[118.352276,36.974582],[118.384652,36.974382],[118.387574,36.971305],[118.386548,36.950481],[118.401788,36.949802],[118.40321,36.943125],[118.439061,36.942206],[118.467411,36.945484],[118.494339,36.941846],[118.492365,36.931611],[118.496708,36.924733],[118.48968,36.914096],[118.481862,36.914136],[118.474913,36.905297],[118.483046,36.900777],[118.482809,36.879214],[118.476966,36.876893],[118.465042,36.861366],[118.479967,36.860166],[118.480993,36.852641],[118.460462,36.846597],[118.461488,36.854322],[118.453828,36.857564],[118.450038,36.83747],[118.435508,36.838391],[118.44072,36.828142],[118.438666,36.809682],[118.424531,36.802673],[118.419872,36.796304],[118.388522,36.791217],[118.350222,36.768301],[118.321636,36.770905],[118.318161,36.77972],[118.307501,36.776234],[118.297788,36.777677],[118.298183,36.753914],[118.279546,36.753033],[118.27157,36.744015],[118.276151,36.731749],[118.284363,36.72337],[118.277019,36.719801],[118.264147,36.72373],[118.254276,36.731789],[118.234219,36.726457],[118.227743,36.717957],[118.237614,36.712704],[118.227585,36.697625],[118.238246,36.697305],[118.245037,36.690647],[118.228059,36.694016],[118.21653,36.6811],[118.215819,36.668262],[118.226796,36.668382],[118.230191,36.660357],[118.221189,36.664169],[118.215898,36.648921],[118.199631,36.639047],[118.20658,36.637482],[118.214793,36.621144],[118.200657,36.612071],[118.189523,36.599141],[118.180363,36.593599],[118.176967,36.582996],[118.180678,36.577412],[118.180915,36.5607],[118.183916,36.561142],[118.191892,36.546074],[118.214556,36.539322],[118.221663,36.531887],[118.210844,36.526099],[118.213766,36.513075],[118.210528,36.503466],[118.218346,36.497354],[118.212818,36.490075],[118.216135,36.478573],[118.229638,36.467793],[118.233508,36.456609],[118.22719,36.451379],[118.232797,36.432869],[118.228533,36.430736],[118.224427,36.414234],[118.227427,36.408034],[118.250407,36.411214],[118.251592,36.401995],[118.235403,36.389634],[118.239825,36.376748],[118.256093,36.363175],[118.262726,36.352218],[118.261857,36.345852],[118.269912,36.339849],[118.300157,36.338116],[118.291075,36.326189],[118.304105,36.321393],[118.30908,36.307125],[118.315477,36.304464],[118.310107,36.295716],[118.317609,36.288903],[118.31366,36.277371],[118.315003,36.266361],[118.306948,36.252123],[118.31524,36.24938],[118.350775,36.263538],[118.368385,36.248412],[118.379756,36.245265],[118.386548,36.239053],[118.382046,36.207335],[118.374387,36.203097],[118.387653,36.174555],[118.402262,36.162926],[118.405263,36.141641],[118.402183,36.131622],[118.412844,36.127218],[118.428953,36.132672],[118.440956,36.132511],[118.447116,36.140913],[118.457303,36.13247],[118.462594,36.14059],[118.487863,36.131784],[118.492601,36.127057],[118.479493,36.118814],[118.484468,36.104064],[118.478545,36.098245],[118.482099,36.092546],[118.48044,36.074071],[118.496866,36.067683],[118.507842,36.074961],[118.516608,36.068573],[118.513449,36.064085],[118.522214,36.05349],[118.522609,36.043622],[118.516845,36.026107],[118.507447,36.029789],[118.503341,36.024246],[118.489206,36.025784],[118.476097,36.031407],[118.469859,36.022992],[118.476571,36.012797],[118.487074,36.005797],[118.49268,35.995437],[118.486521,35.988759],[118.499393,35.976212],[118.505157,35.965808],[118.502157,35.962488],[118.470964,35.960868],[118.459356,35.952689],[118.430612,35.969694],[118.415213,35.990783],[118.387021,35.987586],[118.382283,35.975078],[118.360725,35.970908],[118.352828,35.956698],[118.344774,35.955888],[118.320136,35.946575],[118.314134,35.950827],[118.303552,35.948923],[118.293523,35.937503],[118.281362,35.935964],[118.26928,35.928512],[118.257593,35.925717],[118.257119,35.930699],[118.245906,35.932157],[118.236904,35.939245],[118.236351,35.947749],[118.22569,35.948235],[118.209897,35.955767],[118.207054,35.964391],[118.193787,35.974026],[118.206106,35.97864],[118.197578,36.004947],[118.178388,36.017005],[118.135588,36.02364],[118.132666,36.030436],[118.10937,36.030031],[118.096104,36.024246],[118.093261,36.014618],[118.084338,36.012149],[118.078415,36.017652],[118.075888,36.009034],[118.066807,36.009155],[118.058989,35.992968],[118.042248,35.986371],[118.032693,35.974268],[118.03293,35.964998],[118.02298,35.958965],[118.021084,35.949004],[117.988471,35.947709],[117.984443,35.956293],[117.992577,35.971273],[117.971414,35.969937],[117.953962,35.957913],[117.947013,35.960382],[117.946065,35.970949],[117.937221,35.98119],[117.937536,35.99653],[117.950803,35.996489],[117.94338,36.017288],[117.949855,36.018259],[117.946855,36.04253],[117.932798,36.052196],[117.935799,36.061214],[117.948829,36.062589],[117.94188,36.071807],[117.946223,36.08151],[117.953172,36.081833],[117.954041,36.090201],[117.946618,36.100387],[117.939984,36.094324],[117.931535,36.094203],[117.921111,36.110005],[117.923875,36.1174],[117.91203,36.132753],[117.914162,36.140631],[117.90666,36.152708],[117.917873,36.16337],[117.912109,36.171648],[117.903027,36.172092],[117.915899,36.192562],[117.914636,36.200837],[117.921664,36.203662],[117.928534,36.196558],[117.943933,36.207981],[117.959332,36.204308],[117.967781,36.21464],[117.96328,36.224971],[117.96707,36.248251],[117.975362,36.262328],[117.972993,36.268378],[117.943696,36.274064],[117.932719,36.271846],[117.926797,36.277532],[117.93114,36.283742],[117.922533,36.300514],[117.924823,36.313171],[117.918347,36.317725],[117.919611,36.324738],[117.933509,36.334369],[117.933904,36.341219],[117.915346,36.352903],[117.902633,36.352057],[117.893472,36.339446],[117.89521,36.359227],[117.890314,36.366035],[117.882101,36.35673],[117.879732,36.370626],[117.867492,36.386373],[117.859279,36.389433],[117.855094,36.412945],[117.829508,36.417776],[117.826823,36.427114],[117.833062,36.44301],[117.822717,36.44305],[117.817268,36.436129],[117.799343,36.432265],[117.7965,36.43963],[117.786471,36.434277],[117.779838,36.441239],[117.755752,36.445303],[117.763491,36.452868],[117.757016,36.459144],[117.765544,36.469845],[117.748566,36.478694],[117.757332,36.484485],[117.755673,36.496228],[117.743118,36.498439],[117.735853,36.504993],[117.751646,36.509979],[117.765544,36.509496],[117.76586,36.512994],[117.750777,36.524652],[117.742486,36.525737],[117.739406,36.539925],[117.72377,36.54732],[117.720849,36.560057],[117.694315,36.568896],[117.696132,36.575042],[117.706792,36.581469],[117.715321,36.578537],[117.706792,36.593559],[117.715163,36.600546],[117.697869,36.599422],[117.690525,36.604883],[117.705055,36.605807],[117.706555,36.611549],[117.714926,36.610545],[117.715321,36.627527],[117.70853,36.635154],[117.712241,36.642258],[117.709003,36.651569],[117.698027,36.652974],[117.695184,36.666978],[117.701265,36.685191],[117.715637,36.691208],[117.718006,36.697826]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370400,\"name\":\"枣庄市\",\"center\":[117.557964,34.856424],\"centroid\":[117.39817,34.916234],\"childrenNum\":6,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":3,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.392342,34.574909],[117.393922,34.587676],[117.398976,34.588335],[117.397949,34.604393],[117.407978,34.610651],[117.4109,34.623454],[117.402687,34.628434],[117.384051,34.628228],[117.376707,34.622301],[117.374022,34.636172],[117.366915,34.650246],[117.354201,34.653538],[117.35657,34.661643],[117.346067,34.670982],[117.329247,34.677359],[117.335485,34.692454],[117.324272,34.697307],[117.326167,34.703434],[117.310611,34.717333],[117.304609,34.714866],[117.278787,34.715647],[117.271443,34.726501],[117.253675,34.721444],[117.242067,34.729995],[117.236697,34.746355],[117.22422,34.745533],[117.212927,34.761027],[117.191369,34.780914],[117.180551,34.784201],[117.176523,34.779065],[117.162467,34.782105],[117.172733,34.799194],[117.180314,34.800221],[117.194686,34.816239],[117.17755,34.828722],[117.156623,34.834306],[117.140593,34.846499],[117.139013,34.854052],[117.125826,34.863451],[117.12093,34.903581],[117.110111,34.90514],[117.111059,34.917774],[117.103399,34.937459],[117.082551,34.934917],[117.073707,34.925485],[117.06123,34.930406],[117.05815,34.926961],[117.041093,34.925157],[117.043462,34.932825],[117.038487,34.937869],[117.017719,34.942503],[116.989448,34.93873],[116.980367,34.941027],[116.9671,34.951072],[116.955334,34.967142],[116.943015,34.975627],[116.954466,34.993331],[116.956993,35.01054],[116.951702,35.020618],[116.937172,35.0275],[116.907875,35.046995],[116.900767,35.05977],[116.881183,35.058133],[116.880473,35.062595],[116.900373,35.068737],[116.888212,35.085193],[116.888922,35.093829],[116.863179,35.091496],[116.848649,35.103774],[116.832065,35.123783],[116.825748,35.147631],[116.81793,35.150699],[116.813192,35.159573],[116.81564,35.170777],[116.811218,35.17736],[116.832776,35.184392],[116.85394,35.16861],[116.86618,35.172617],[116.876603,35.188031],[116.898398,35.195757],[116.904716,35.182471],[116.913718,35.178791],[116.925721,35.182266],[116.938277,35.172168],[116.962047,35.177319],[116.969706,35.187377],[116.995687,35.1978],[117.014639,35.214844],[117.028774,35.221219],[117.053333,35.224202],[117.065336,35.22792],[117.092896,35.220361],[117.104899,35.221464],[117.123536,35.23078],[117.152675,35.232047],[117.176681,35.243159],[117.199108,35.24749],[117.204873,35.258518],[117.220824,35.26489],[117.269231,35.261296],[117.262203,35.287472],[117.284472,35.294331],[117.290079,35.299394],[117.305794,35.295229],[117.311163,35.28588],[117.314085,35.302129],[117.308557,35.312579],[117.318034,35.320252],[117.347568,35.315109],[117.359571,35.318375],[117.399528,35.306374],[117.403635,35.301394],[117.406004,35.283348],[117.419191,35.273997],[117.426456,35.261786],[117.439486,35.258927],[117.449752,35.246795],[117.448331,35.231842],[117.468073,35.228369],[117.480628,35.222771],[117.494843,35.205893],[117.507162,35.198986],[117.526825,35.200621],[117.528009,35.184351],[117.548462,35.161741],[117.556043,35.161291],[117.570336,35.168365],[117.58376,35.164317],[117.586208,35.152989],[117.591025,35.152539],[117.600344,35.135524],[117.604371,35.13401],[117.623007,35.113063],[117.650725,35.092724],[117.656885,35.077497],[117.676469,35.065543],[117.69321,35.06018],[117.707345,35.052318],[117.704423,35.031227],[117.736247,35.031514],[117.744618,35.022748],[117.737985,35.013203],[117.728035,35.008041],[117.726534,34.979561],[117.719506,34.968331],[117.724323,34.958329],[117.714689,34.947833],[117.712004,34.934999],[117.704265,34.933605],[117.698501,34.919989],[117.70466,34.906699],[117.715163,34.896238],[117.729298,34.876994],[117.742407,34.874163],[117.75291,34.857623],[117.763175,34.848839],[117.795315,34.835907],[117.803686,34.830734],[117.798632,34.810653],[117.77739,34.801248],[117.784023,34.79484],[117.784576,34.780667],[117.79958,34.768875],[117.830614,34.760246],[117.830061,34.740888],[117.823665,34.72868],[117.825244,34.713139],[117.831719,34.707793],[117.825639,34.684392],[117.819243,34.681842],[117.805818,34.646254],[117.793657,34.651768],[117.796026,34.637736],[117.793657,34.625594],[117.798553,34.621848],[117.791446,34.585082],[117.794605,34.559751],[117.793499,34.548463],[117.799185,34.535155],[117.801712,34.518753],[117.790498,34.518918],[117.773994,34.529056],[117.748645,34.533383],[117.700712,34.54525],[117.684523,34.547351],[117.681996,34.529551],[117.673389,34.515827],[117.659096,34.501071],[117.647014,34.492908],[117.642039,34.496825],[117.629246,34.488538],[117.609662,34.490476],[117.603187,34.476828],[117.592289,34.462518],[117.569783,34.463054],[117.561334,34.471962],[117.54783,34.475179],[117.538275,34.46722],[117.513005,34.472581],[117.493263,34.472663],[117.487341,34.466354],[117.48663,34.482065],[117.48205,34.48594],[117.465467,34.48458],[117.45141,34.506264],[117.438223,34.516445],[117.439486,34.520031],[117.426772,34.525224],[117.424482,34.537009],[117.403793,34.546898],[117.402529,34.569431],[117.392342,34.574909]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370500,\"name\":\"东营市\",\"center\":[118.66471,37.434564],\"centroid\":[118.625299,37.636119],\"childrenNum\":5,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":4,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.039928,37.304466],[118.856959,37.293842],[118.821897,37.288788],[118.777991,37.280112],[118.728399,37.252764],[118.709684,37.241256],[118.680624,37.229269],[118.672332,37.215129],[118.668779,37.198436],[118.660408,37.187877],[118.649274,37.189112],[118.645483,37.178153],[118.633638,37.171178],[118.634191,37.163366],[118.64572,37.159579],[118.649195,37.164243],[118.653617,37.149692],[118.673754,37.144309],[118.667041,37.11392],[118.668384,37.091539],[118.665146,37.081763],[118.655512,37.082681],[118.654091,37.076935],[118.632138,37.070429],[118.631901,37.066757],[118.610895,37.063005],[118.591469,37.068474],[118.580414,37.063325],[118.561303,37.063325],[118.557592,37.051469],[118.56004,37.041408],[118.545431,37.038494],[118.545826,37.023519],[118.57149,37.022081],[118.588389,37.017409],[118.583572,37.008422],[118.590206,37.001351],[118.571174,37.004148],[118.566199,36.999034],[118.580493,36.994999],[118.564146,36.99416],[118.553959,37.000233],[118.552301,36.979657],[118.559803,36.977059],[118.557434,36.96539],[118.560751,36.946564],[118.55467,36.938368],[118.537771,36.936769],[118.52711,36.939687],[118.524583,36.945284],[118.503183,36.944285],[118.503736,36.95156],[118.47665,36.957077],[118.467411,36.945484],[118.439061,36.942206],[118.40321,36.943125],[118.401788,36.949802],[118.386548,36.950481],[118.387574,36.971305],[118.384652,36.974382],[118.352276,36.974582],[118.3443,36.960714],[118.324637,36.964751],[118.322347,36.974502],[118.312476,36.970905],[118.294629,36.969666],[118.291628,36.995878],[118.288785,36.999993],[118.28997,37.00946],[118.308212,37.019885],[118.310186,37.028231],[118.3259,37.035459],[118.324558,37.046279],[118.337588,37.053904],[118.338535,37.072265],[118.332928,37.081923],[118.338851,37.093894],[118.338298,37.10311],[118.349354,37.101753],[118.338219,37.123134],[118.346116,37.123931],[118.340667,37.131748],[118.347616,37.139803],[118.356224,37.139325],[118.361594,37.148495],[118.366569,37.146781],[118.377545,37.154157],[118.380467,37.175164],[118.387574,37.177834],[118.383389,37.190587],[118.376598,37.196962],[118.375966,37.206126],[118.3642,37.210189],[118.346669,37.233252],[118.350459,37.243765],[118.36033,37.244561],[118.368385,37.258576],[118.375729,37.258497],[118.372096,37.273703],[118.36262,37.273783],[118.368069,37.279594],[118.358277,37.280669],[118.355197,37.286997],[118.342168,37.287076],[118.342168,37.295075],[118.325584,37.296866],[118.326058,37.306535],[118.319741,37.305978],[118.31524,37.31477],[118.315398,37.352514],[118.287285,37.352434],[118.291865,37.358518],[118.286495,37.362772],[118.273624,37.360029],[118.262015,37.364283],[118.258541,37.37911],[118.245827,37.376646],[118.245353,37.367781],[118.222768,37.367861],[118.217951,37.371478],[118.216925,37.385191],[118.202,37.382409],[118.161015,37.362573],[118.156198,37.364322],[118.154935,37.377401],[118.141668,37.376487],[118.135509,37.384834],[118.144037,37.392822],[118.16141,37.389961],[118.160147,37.399618],[118.165596,37.4082],[118.163937,37.416742],[118.14996,37.438351],[118.136141,37.441688],[118.114898,37.439742],[118.118531,37.456182],[118.125322,37.45912],[118.112766,37.463528],[118.120426,37.480757],[118.128481,37.483694],[118.127849,37.491831],[118.135035,37.496752],[118.134245,37.507387],[118.139378,37.507427],[118.136772,37.516791],[118.142537,37.518933],[118.150987,37.530517],[118.156988,37.530358],[118.159831,37.539164],[118.173255,37.546858],[118.176098,37.557129],[118.173176,37.563593],[118.141431,37.556297],[118.134166,37.558478],[118.13922,37.571364],[118.131324,37.571285],[118.127612,37.578103],[118.134877,37.590035],[118.148696,37.594078],[118.146722,37.599943],[118.154935,37.605491],[118.157462,37.62035],[118.154935,37.628036],[118.163542,37.63069],[118.165596,37.644633],[118.172545,37.644079],[118.177125,37.657623],[118.195445,37.661742],[118.200657,37.667404],[118.207449,37.661583],[118.22569,37.663682],[118.239431,37.65596],[118.246459,37.658376],[118.260989,37.654614],[118.2846,37.662058],[118.293129,37.670096],[118.294076,37.678529],[118.305132,37.683122],[118.3045,37.690722],[118.316187,37.714151],[118.319425,37.712924],[118.31753,37.728395],[118.337509,37.729502],[118.341931,37.74667],[118.353697,37.750151],[118.353065,37.75814],[118.340667,37.763913],[118.340588,37.774391],[118.348406,37.790719],[118.36191,37.792063],[118.352355,37.814274],[118.356382,37.820834],[118.344932,37.824627],[118.346116,37.832371],[118.334271,37.832134],[118.340193,37.838059],[118.328111,37.865272],[118.313265,37.861521],[118.301657,37.870208],[118.286337,37.8569],[118.269754,37.853109],[118.258304,37.844182],[118.258146,37.854886],[118.247643,37.871788],[118.248749,37.858164],[118.239115,37.868708],[118.236588,37.884501],[118.243142,37.895673],[118.235403,37.905343],[118.232718,37.922509],[118.225611,37.923417],[118.226954,37.939672],[118.224742,37.950559],[118.215503,37.949376],[118.213529,37.95541],[118.223479,37.959788],[118.220873,37.98258],[118.22956,37.986444],[118.2234,38.00095],[118.40779,38.026212],[118.419951,38.025503],[118.419319,38.053119],[118.410001,38.053277],[118.227585,38.037874],[118.230665,38.056743],[118.226638,38.079583],[118.235324,38.082969],[118.245511,38.103322],[118.241247,38.112138],[118.227664,38.119262],[118.236272,38.125754],[118.245432,38.144286],[118.274334,38.138542],[118.330717,38.125046],[118.360172,38.120954],[118.38023,38.119931],[118.39097,38.123315],[118.404078,38.120914],[118.420425,38.107337],[118.43148,38.106274],[118.449722,38.124259],[118.461409,38.126659],[118.483204,38.123236],[118.504526,38.113909],[118.513212,38.10466],[118.517081,38.088363],[118.526321,38.071314],[118.534533,38.063517],[118.552459,38.055679],[118.565568,38.060209],[118.597629,38.078993],[118.603946,38.101354],[118.607816,38.12906],[118.62582,38.138306],[118.726425,38.154238],[118.777754,38.156952],[118.811474,38.15762],[118.853721,38.154985],[118.877491,38.149596],[118.908051,38.139368],[118.931426,38.127486],[118.958512,38.110131],[118.974068,38.09415],[118.985282,38.062099],[118.996495,38.013996],[119.00455,37.992278],[119.045297,37.967597],[119.110604,37.921365],[119.120554,37.897054],[119.122844,37.866536],[119.128293,37.855992],[119.126555,37.845723],[119.119764,37.839442],[119.121501,37.827511],[119.128293,37.814393],[119.15451,37.80645],[119.180254,37.809098],[119.204734,37.815618],[119.217605,37.810244],[119.219974,37.793723],[119.21421,37.769647],[119.215394,37.76332],[119.225344,37.752998],[119.275252,37.739353],[119.278963,37.729819],[119.275726,37.717435],[119.26009,37.702398],[119.247218,37.698519],[119.22487,37.697332],[119.196916,37.699073],[119.138006,37.705128],[119.107129,37.703941],[119.080122,37.696382],[119.047509,37.679044],[119.020186,37.657227],[118.997206,37.632592],[118.972331,37.594474],[118.9518,37.556019],[118.939638,37.527066],[118.942955,37.497466],[118.958275,37.454912],[118.973121,37.404346],[118.977385,37.382052],[118.982597,37.378077],[119.003444,37.383403],[119.012842,37.376089],[119.009841,37.370763],[118.985598,37.365754],[118.981412,37.35983],[118.98694,37.339511],[119.001233,37.318748],[119.010315,37.313218],[119.039928,37.304466]]],[[[118.410001,38.053277],[118.40779,38.026212],[118.2234,38.00095],[118.227585,38.037874],[118.410001,38.053277]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370600,\"name\":\"烟台市\",\"center\":[121.391382,37.539297],\"centroid\":[120.805129,37.241857],\"childrenNum\":12,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":5,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.576514,37.127561],[119.629423,37.142116],[119.678541,37.157984],[119.68628,37.15611],[119.687069,37.14395],[119.698598,37.127002],[119.744795,37.135257],[119.754034,37.147459],[119.771091,37.160456],[119.780488,37.175204],[119.790517,37.185008],[119.80789,37.196404],[119.822104,37.220068],[119.83008,37.225724],[119.865063,37.233969],[119.877066,37.24046],[119.885989,37.252286],[119.858982,37.253719],[119.860956,37.262557],[119.892149,37.263911],[119.895781,37.275495],[119.887332,37.283972],[119.889227,37.298457],[119.883383,37.310871],[119.874697,37.313099],[119.869406,37.321016],[119.85306,37.326226],[119.848085,37.337323],[119.838214,37.34309],[119.842715,37.361341],[119.839714,37.37112],[119.843978,37.376725],[119.927131,37.386702],[119.937397,37.393339],[119.949874,37.42004],[119.986357,37.425681],[120.012654,37.442919],[120.06493,37.449114],[120.086252,37.465275],[120.108758,37.470515],[120.144372,37.481908],[120.194517,37.512982],[120.199492,37.524646],[120.222313,37.532857],[120.235975,37.548128],[120.246793,37.556614],[120.208178,37.588648],[120.217575,37.603787],[120.210152,37.616745],[120.215048,37.621143],[120.24861,37.623876],[120.265667,37.628868],[120.2723,37.63683],[120.273563,37.650891],[120.269299,37.658495],[120.244661,37.657703],[120.232895,37.662138],[120.220339,37.672036],[120.216154,37.686605],[120.227209,37.693611],[120.341555,37.693215],[120.368246,37.698005],[120.386408,37.707701],[120.437817,37.74141],[120.447924,37.754659],[120.47201,37.757626],[120.482354,37.755015],[120.518443,37.750586],[120.528235,37.757151],[120.579959,37.760868],[120.595357,37.767551],[120.621654,37.790877],[120.63421,37.796371],[120.657031,37.793051],[120.733393,37.833556],[120.743185,37.833082],[120.754241,37.837506],[120.762611,37.829961],[120.778563,37.831146],[120.797278,37.827709],[120.811887,37.822098],[120.832972,37.821624],[120.865112,37.832963],[120.890381,37.832963],[120.900489,37.823679],[120.915019,37.824034],[120.921653,37.819885],[120.935788,37.822375],[120.94637,37.813405],[120.947712,37.798624],[120.941158,37.793367],[120.943448,37.78554],[120.952924,37.776882],[120.975588,37.762371],[120.995724,37.759049],[121.016098,37.741766],[121.019573,37.731085],[121.037735,37.718583],[121.055108,37.715734],[121.064584,37.717119],[121.068375,37.72519],[121.075482,37.717791],[121.096329,37.722698],[121.139841,37.723054],[121.148527,37.719651],[121.159583,37.70687],[121.160057,37.699034],[121.146079,37.678846],[121.142684,37.661267],[121.156582,37.657386],[121.161715,37.646336],[121.150107,37.628987],[121.149554,37.619875],[121.16977,37.600617],[121.182483,37.594276],[121.215887,37.583098],[121.251264,37.581116],[121.304963,37.582979],[121.354791,37.596178],[121.361583,37.600855],[121.358266,37.616467],[121.344289,37.627759],[121.349264,37.635206],[121.361898,37.634216],[121.374849,37.628749],[121.386142,37.627798],[121.411174,37.609494],[121.43676,37.600815],[121.439603,37.596218],[121.427047,37.590788],[121.411016,37.591263],[121.389774,37.59705],[121.385905,37.591303],[121.395934,37.589876],[121.401066,37.557804],[121.412438,37.547652],[121.436444,37.541227],[121.459819,37.522623],[121.45666,37.502665],[121.46045,37.493855],[121.479245,37.474961],[121.514938,37.46186],[121.532074,37.462456],[121.537207,37.451219],[121.56532,37.440377],[121.571558,37.441449],[121.576059,37.460391],[121.586562,37.467299],[121.599118,37.46992],[121.618939,37.481948],[121.633469,37.49318],[121.653843,37.493061],[121.660239,37.487187],[121.665767,37.473453],[121.747893,37.467458],[121.773084,37.466505],[121.838943,37.471468],[121.887587,37.470039],[121.923992,37.473096],[121.92944,37.460868],[121.929519,37.454713],[121.920438,37.429931],[121.91878,37.420755],[121.908435,37.400969],[121.90038,37.391232],[121.882454,37.381694],[121.870293,37.368894],[121.865239,37.336727],[121.859396,37.329249],[121.834047,37.318311],[121.822281,37.303988],[121.815253,37.300447],[121.794879,37.30375],[121.790615,37.299532],[121.792431,37.288469],[121.784692,37.268409],[121.778296,37.260487],[121.7749,37.248225],[121.757211,37.247667],[121.74813,37.241575],[121.748525,37.223255],[121.755632,37.220506],[121.754527,37.212022],[121.761634,37.217997],[121.769057,37.196364],[121.759738,37.19222],[121.760686,37.178831],[121.749315,37.176439],[121.753895,37.172493],[121.761002,37.177954],[121.767872,37.170979],[121.747656,37.135776],[121.737706,37.136175],[121.733995,37.125607],[121.699328,37.125926],[121.694037,37.141239],[121.683455,37.141917],[121.688983,37.133503],[121.682271,37.13127],[121.683692,37.123014],[121.678007,37.121658],[121.669162,37.110649],[121.666714,37.12082],[121.654316,37.121897],[121.639865,37.131908],[121.638839,37.139524],[121.628889,37.137969],[121.625414,37.131908],[121.612147,37.125846],[121.600539,37.141079],[121.590747,37.144269],[121.585377,37.132306],[121.590352,37.128518],[121.589168,37.116712],[121.580323,37.10674],[121.574954,37.110091],[121.547868,37.104945],[121.49946,37.104426],[121.465425,37.12086],[121.447578,37.123333],[121.441656,37.12106],[121.427363,37.100796],[121.391432,37.098282],[121.382746,37.112125],[121.376823,37.115915],[121.369795,37.110889],[121.351475,37.126962],[121.363715,37.129236],[121.358187,37.140282],[121.348316,37.135975],[121.34113,37.127002],[121.326916,37.12768],[121.317992,37.132825],[121.314044,37.141079],[121.306542,37.141996],[121.287827,37.136055],[121.26153,37.117989],[121.246368,37.102631],[121.243131,37.092138],[121.204279,37.07897],[121.191407,37.072026],[121.192512,37.052108],[121.188011,37.041169],[121.188564,37.029948],[121.19496,37.027273],[121.194565,37.019485],[121.181299,37.016131],[121.177587,37.003748],[121.182404,36.99456],[121.19038,36.996558],[121.209096,36.985371],[121.222915,36.986649],[121.22639,36.971065],[121.233734,36.956917],[121.248501,36.953679],[121.252607,36.938088],[121.263189,36.926093],[121.272191,36.927532],[121.282615,36.918535],[121.304173,36.918335],[121.308358,36.905177],[121.312938,36.904097],[121.347605,36.920574],[121.360951,36.921494],[121.366557,36.903617],[121.36482,36.897417],[121.385431,36.877333],[121.363873,36.871651],[121.357397,36.864048],[121.357239,36.852401],[121.36174,36.841273],[121.373428,36.840593],[121.376665,36.830384],[121.396802,36.803834],[121.395855,36.794342],[121.409121,36.790176],[121.417334,36.792739],[121.450184,36.790056],[121.462424,36.784888],[121.478218,36.770825],[121.460687,36.76245],[121.454291,36.752351],[121.412596,36.748103],[121.394038,36.737962],[121.390406,36.728742],[121.404304,36.726457],[121.410385,36.714709],[121.405489,36.704443],[121.394354,36.699029],[121.374691,36.699791],[121.365531,36.711461],[121.357792,36.713105],[121.318308,36.702117],[121.298724,36.702318],[121.285536,36.699871],[121.274876,36.692652],[121.251896,36.671351],[121.239261,36.668342],[121.220941,36.671271],[121.194881,36.653295],[121.176877,36.65482],[121.161399,36.651288],[121.146079,36.640372],[121.113939,36.621907],[121.07793,36.607614],[121.055582,36.592675],[121.045237,36.579581],[121.02897,36.573194],[121.016019,36.574721],[120.955609,36.576087],[120.928681,36.589783],[120.924495,36.596892],[120.925917,36.613837],[120.90578,36.623473],[120.89504,36.622188],[120.882011,36.627086],[120.847107,36.618615],[120.850108,36.612271],[120.786223,36.589663],[120.779747,36.591551],[120.777062,36.600546],[120.765533,36.607011],[120.757557,36.606088],[120.751556,36.615042],[120.725733,36.624436],[120.708281,36.621385],[120.70836,36.612914],[120.699121,36.60665],[120.702991,36.598338],[120.679695,36.589181],[120.665402,36.587454],[120.664059,36.583478],[120.637763,36.574199],[120.635947,36.597775],[120.643449,36.613436],[120.644712,36.626524],[120.657426,36.626644],[120.660585,36.647998],[120.648977,36.655863],[120.652135,36.663327],[120.642027,36.666095],[120.627339,36.659836],[120.625128,36.671231],[120.631446,36.673357],[120.619206,36.681541],[120.616521,36.689764],[120.589751,36.694497],[120.586118,36.698829],[120.596542,36.708052],[120.58525,36.728501],[120.584065,36.735236],[120.562586,36.736479],[120.560375,36.742492],[120.546397,36.744616],[120.544502,36.76213],[120.540791,36.7679],[120.5554,36.778718],[120.56377,36.795343],[120.563454,36.802953],[120.590382,36.801552],[120.601517,36.804996],[120.612336,36.829223],[120.609809,36.832906],[120.589751,36.838791],[120.58754,36.843635],[120.595989,36.852681],[120.588408,36.859045],[120.57988,36.858885],[120.576642,36.879894],[120.592909,36.882134],[120.622838,36.890856],[120.622838,36.907377],[120.617389,36.911136],[120.592909,36.912216],[120.574984,36.927053],[120.571114,36.948682],[120.563218,36.95172],[120.560296,36.960674],[120.566534,36.96559],[120.568508,36.983293],[120.574036,36.987568],[120.575931,36.999074],[120.582328,37.001791],[120.593857,36.991244],[120.606413,37.001192],[120.601754,37.012696],[120.613915,37.023839],[120.606176,37.047157],[120.586513,37.048515],[120.58446,37.058136],[120.570877,37.046399],[120.558953,37.047437],[120.549793,37.041288],[120.541738,37.044163],[120.533289,37.053944],[120.539843,37.060371],[120.536368,37.081963],[120.547661,37.113003],[120.542528,37.128677],[120.527998,37.136733],[120.527129,37.143352],[120.517258,37.148974],[120.506834,37.148854],[120.505729,37.143551],[120.493805,37.1345],[120.493015,37.126723],[120.478643,37.124211],[120.462928,37.115157],[120.440265,37.122655],[120.439475,37.116912],[120.415153,37.110569],[120.407098,37.112803],[120.412942,37.103149],[120.408914,37.09517],[120.398096,37.096447],[120.388225,37.104227],[120.369667,37.104626],[120.362244,37.100477],[120.357822,37.084357],[120.348583,37.077094],[120.34574,37.087789],[120.336343,37.092058],[120.336896,37.104267],[120.331684,37.111966],[120.320628,37.10654],[120.315337,37.113043],[120.300176,37.119584],[120.303413,37.130153],[120.280828,37.13111],[120.264087,37.114718],[120.245688,37.118906],[120.236606,37.125965],[120.231237,37.106301],[120.229894,37.089544],[120.220497,37.08711],[120.214101,37.07019],[120.21647,37.056699],[120.205335,37.038374],[120.193411,37.034261],[120.189621,37.038094],[120.180697,37.032544],[120.173037,37.034421],[120.166404,37.025795],[120.167273,37.017968],[120.159929,37.013375],[120.142319,37.015292],[120.138134,37.022201],[120.123051,37.01645],[120.101571,37.014293],[120.09249,37.017928],[120.049374,37.020045],[120.035238,36.998395],[120.024104,36.999913],[120.002309,37.013494],[119.993543,37.012176],[119.980198,37.018088],[119.975618,37.011098],[119.961561,37.013654],[119.949716,37.006185],[119.939608,37.004108],[119.923341,36.993961],[119.902257,36.9948],[119.900045,36.997556],[119.85148,37.002031],[119.829606,37.002031],[119.820209,36.999594],[119.804968,37.013814],[119.771881,37.006984],[119.769906,36.996597],[119.750559,36.990844],[119.743057,36.992483],[119.731133,36.988487],[119.722289,36.993401],[119.716998,37.007144],[119.681699,36.998475],[119.66251,37.008262],[119.629344,37.01621],[119.61971,37.012895],[119.619078,37.017848],[119.60976,37.013894],[119.613155,37.034101],[119.606048,37.04037],[119.563406,37.058495],[119.559615,37.071786],[119.576198,37.087509],[119.568696,37.100157],[119.576514,37.127561]]],[[[121.508621,37.55253],[121.50712,37.556892],[121.520308,37.565139],[121.526625,37.562522],[121.508621,37.55253]]],[[[120.728339,37.92393],[120.725733,37.928586],[120.721548,37.931308],[120.722101,37.94551],[120.732446,37.948192],[120.737736,37.955174],[120.746423,37.951466],[120.758031,37.929454],[120.765375,37.922904],[120.759058,37.911776],[120.764901,37.896186],[120.760558,37.890581],[120.753056,37.894883],[120.740974,37.908777],[120.727708,37.909448],[120.721627,37.917182],[120.728339,37.92393]]],[[[120.692409,37.983842],[120.685539,37.991332],[120.697147,37.995117],[120.71602,37.987311],[120.724707,37.987429],[120.730787,37.974142],[120.736631,37.971146],[120.732525,37.961484],[120.706465,37.966808],[120.696278,37.974024],[120.692409,37.983842]]],[[[120.653004,37.980017],[120.658611,37.975483],[120.653952,37.963969],[120.64416,37.964757],[120.653004,37.980017]]],[[[120.452584,37.768856],[120.443976,37.770991],[120.435526,37.786608],[120.453136,37.788387],[120.463323,37.786054],[120.452584,37.768856]]],[[[120.682775,37.92831],[120.673536,37.929178],[120.679379,37.937147],[120.678511,37.944642],[120.692804,37.94693],[120.687829,37.931308],[120.682775,37.92831]]],[[[120.750687,38.150304],[120.73821,38.161711],[120.738052,38.174688],[120.742554,38.198986],[120.747607,38.202759],[120.753688,38.195291],[120.760321,38.176615],[120.777694,38.172565],[120.787328,38.158682],[120.771456,38.156558],[120.760479,38.15939],[120.750687,38.150304]]],[[[120.91881,38.34511],[120.90657,38.349778],[120.895277,38.363232],[120.900015,38.3719],[120.91494,38.373429],[120.913993,38.364566],[120.921021,38.362997],[120.914151,38.354682],[120.91881,38.34511]]],[[[120.841342,38.335655],[120.842843,38.355898],[120.85682,38.343188],[120.841342,38.335655]]],[[[120.62655,37.945786],[120.604913,37.956712],[120.598279,37.970633],[120.60207,37.97848],[120.614152,37.984512],[120.632472,37.978913],[120.630972,37.952018],[120.62655,37.945786]]],[[[120.903332,38.381742],[120.898515,38.386487],[120.91573,38.401933],[120.931997,38.391231],[120.931918,38.382291],[120.922126,38.385271],[120.903332,38.381742]]],[[[120.802253,38.284041],[120.797041,38.288282],[120.808492,38.311913],[120.816546,38.318075],[120.835262,38.320077],[120.849871,38.310343],[120.84308,38.30057],[120.82389,38.297939],[120.81552,38.288714],[120.802253,38.284041]]],[[[120.943843,38.019907],[120.932708,38.026882],[120.931287,38.035353],[120.94787,38.032398],[120.951108,38.02436],[120.943843,38.019907]]],[[[119.821394,37.309121],[119.818867,37.31656],[119.825895,37.315168],[119.821394,37.309121]]],[[[121.388668,36.266442],[121.391432,36.271926],[121.396644,36.264183],[121.388668,36.266442]]],[[[120.645818,38.132011],[120.637763,38.139171],[120.640922,38.148141],[120.647318,38.149557],[120.653715,38.141532],[120.645818,38.132011]]],[[[120.878141,38.026961],[120.87672,38.018213],[120.872693,38.027552],[120.878141,38.026961]]],[[[120.645423,38.05501],[120.641238,38.061233],[120.644791,38.06966],[120.652056,38.069109],[120.652767,38.058988],[120.645423,38.05501]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370700,\"name\":\"潍坊市\",\"center\":[119.107078,36.70925],\"centroid\":[119.077723,36.554349],\"childrenNum\":12,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":6,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[118.467411,36.945484],[118.47665,36.957077],[118.503736,36.95156],[118.503183,36.944285],[118.524583,36.945284],[118.52711,36.939687],[118.537771,36.936769],[118.55467,36.938368],[118.560751,36.946564],[118.557434,36.96539],[118.559803,36.977059],[118.552301,36.979657],[118.553959,37.000233],[118.564146,36.99416],[118.580493,36.994999],[118.566199,36.999034],[118.571174,37.004148],[118.590206,37.001351],[118.583572,37.008422],[118.588389,37.017409],[118.57149,37.022081],[118.545826,37.023519],[118.545431,37.038494],[118.56004,37.041408],[118.557592,37.051469],[118.561303,37.063325],[118.580414,37.063325],[118.591469,37.068474],[118.610895,37.063005],[118.631901,37.066757],[118.632138,37.070429],[118.654091,37.076935],[118.655512,37.082681],[118.665146,37.081763],[118.668384,37.091539],[118.667041,37.11392],[118.673754,37.144309],[118.653617,37.149692],[118.649195,37.164243],[118.64572,37.159579],[118.634191,37.163366],[118.633638,37.171178],[118.645483,37.178153],[118.649274,37.189112],[118.660408,37.187877],[118.668779,37.198436],[118.672332,37.215129],[118.680624,37.229269],[118.709684,37.241256],[118.728399,37.252764],[118.777991,37.280112],[118.821897,37.288788],[118.856959,37.293842],[119.039928,37.304466],[119.045376,37.298935],[119.052089,37.276848],[119.054142,37.254953],[119.066935,37.241814],[119.084465,37.239424],[119.091336,37.257581],[119.108393,37.260328],[119.128214,37.254874],[119.134294,37.263314],[119.135479,37.282102],[119.139032,37.288191],[119.157748,37.288191],[119.16983,37.278599],[119.166513,37.27438],[119.15759,37.281226],[119.142586,37.279475],[119.141559,37.262557],[119.128451,37.235721],[119.136979,37.231181],[119.20426,37.280112],[119.212788,37.273305],[119.190993,37.259452],[119.191941,37.254117],[119.202365,37.253759],[119.204418,37.246313],[119.194231,37.221741],[119.191941,37.197639],[119.205365,37.194292],[119.204102,37.21007],[119.206945,37.223175],[119.222106,37.225007],[119.232767,37.221821],[119.244533,37.211424],[119.261432,37.207998],[119.282201,37.21242],[119.296336,37.20505],[119.298389,37.19736],[119.291519,37.177635],[119.291756,37.164801],[119.297126,37.158781],[119.299337,37.142594],[119.30826,37.136733],[119.320421,37.120501],[119.329582,37.115715],[119.342296,37.11735],[119.351298,37.122894],[119.36567,37.126045],[119.425528,37.125447],[119.445585,37.130831],[119.489729,37.13446],[119.489965,37.142355],[119.479068,37.153399],[119.481832,37.155791],[119.493282,37.143591],[119.493282,37.133383],[119.503153,37.128279],[119.51942,37.130312],[119.576514,37.127561],[119.568696,37.100157],[119.576198,37.087509],[119.559615,37.071786],[119.563406,37.058495],[119.606048,37.04037],[119.613155,37.034101],[119.60976,37.013894],[119.604548,36.996038],[119.598072,36.989406],[119.5837,36.950441],[119.599968,36.920614],[119.599652,36.878253],[119.597757,36.857244],[119.56767,36.805717],[119.563721,36.802753],[119.550613,36.80868],[119.539162,36.799949],[119.539162,36.787732],[119.532766,36.78008],[119.530555,36.765256],[119.534977,36.743333],[119.547059,36.725454],[119.561036,36.720884],[119.567433,36.713065],[119.579831,36.711581],[119.587412,36.696101],[119.596651,36.689884],[119.607154,36.667379],[119.61355,36.66453],[119.617025,36.652532],[119.625079,36.638807],[119.651297,36.623633],[119.670328,36.616246],[119.681857,36.606891],[119.701125,36.602634],[119.730107,36.581027],[119.72758,36.562749],[119.74748,36.571788],[119.755929,36.565521],[119.784516,36.554673],[119.798019,36.551619],[119.826763,36.54101],[119.917576,36.525858],[119.920261,36.522079],[119.923025,36.495464],[119.936687,36.496389],[119.936292,36.511507],[119.951375,36.519788],[119.971985,36.522441],[119.974749,36.515688],[119.997571,36.504431],[120.010364,36.509255],[120.004204,36.489512],[120.010758,36.484445],[120.004125,36.477447],[120.006889,36.468799],[120.012812,36.467833],[120.011864,36.454236],[119.996623,36.446309],[119.994175,36.450333],[119.968432,36.450051],[119.953981,36.444217],[119.949795,36.446511],[119.935976,36.427436],[119.933923,36.42007],[119.925236,36.419346],[119.926421,36.403324],[119.941425,36.39503],[119.945452,36.384682],[119.936371,36.380655],[119.93029,36.385165],[119.909837,36.384359],[119.90431,36.38154],[119.904784,36.369942],[119.895939,36.34827],[119.896966,36.334047],[119.891991,36.318773],[119.865379,36.308898],[119.862773,36.302368],[119.854402,36.302328],[119.848795,36.292692],[119.83387,36.278822],[119.82929,36.258859],[119.820446,36.257367],[119.82092,36.244499],[119.808048,36.232839],[119.819498,36.211856],[119.828816,36.210685],[119.823131,36.19894],[119.831738,36.180612],[119.82242,36.177987],[119.821315,36.171285],[119.81326,36.175242],[119.813023,36.167691],[119.792333,36.171648],[119.782778,36.165308],[119.772354,36.167691],[119.748111,36.158645],[119.733818,36.163572],[119.732792,36.172536],[119.723473,36.175565],[119.691728,36.176292],[119.681305,36.18045],[119.671039,36.177866],[119.660852,36.154122],[119.649954,36.137157],[119.651218,36.130531],[119.643716,36.127178],[119.657614,36.108631],[119.657061,36.100872],[119.632187,36.091535],[119.633608,36.067683],[119.666695,36.062993],[119.675698,36.064085],[119.695677,36.053045],[119.704126,36.055269],[119.717314,36.044229],[119.706495,36.028292],[119.681068,36.012068],[119.689122,36.000212],[119.684858,35.982648],[119.690149,35.963702],[119.701757,35.944469],[119.701362,35.923732],[119.716208,35.927337],[119.721262,35.906718],[119.727738,35.902544],[119.738003,35.873123],[119.736898,35.86303],[119.72221,35.865138],[119.725211,35.856746],[119.71834,35.853138],[119.704047,35.863962],[119.68699,35.861814],[119.676014,35.842515],[119.664326,35.841015],[119.649796,35.845191],[119.629344,35.833878],[119.622631,35.816114],[119.612445,35.812707],[119.60897,35.799279],[119.617972,35.789623],[119.611576,35.776597],[119.596256,35.773756],[119.591992,35.753218],[119.605495,35.747454],[119.627843,35.722077],[119.624685,35.712817],[119.614182,35.716675],[119.601231,35.709446],[119.588833,35.715701],[119.576988,35.71237],[119.566485,35.714523],[119.560563,35.721752],[119.545085,35.726747],[119.527317,35.723214],[119.525422,35.730604],[119.504101,35.752325],[119.48807,35.754599],[119.48657,35.771646],[119.496599,35.779235],[119.493282,35.789866],[119.482385,35.799725],[119.464696,35.80861],[119.455693,35.809056],[119.444322,35.804026],[119.427739,35.802078],[119.397731,35.786823],[119.390466,35.778707],[119.375857,35.770712],[119.368829,35.770834],[119.374041,35.816154],[119.372382,35.830025],[119.358247,35.84511],[119.371435,35.860476],[119.360695,35.884066],[119.345533,35.893792],[119.315999,35.887552],[119.298153,35.893022],[119.294441,35.911336],[119.281964,35.910202],[119.240427,35.884269],[119.217053,35.879527],[119.190598,35.879446],[119.169119,35.894846],[119.161854,35.894481],[119.158221,35.882486],[119.135637,35.892982],[119.144718,35.904449],[119.151746,35.905502],[119.169672,35.91721],[119.183412,35.91875],[119.179385,35.926163],[119.182623,35.962285],[119.178595,35.97107],[119.155063,35.965767],[119.153246,35.971192],[119.134373,35.968601],[119.121817,35.962731],[119.088888,35.963176],[119.07878,35.959289],[119.066619,35.963986],[119.060538,35.978195],[119.05201,35.9803],[119.021054,35.977426],[119.015606,35.995923],[119.024924,36.003571],[119.023739,36.011219],[119.014105,36.013404],[119.017659,36.024044],[119.024134,36.02631],[119.035584,36.02275],[119.047903,36.024813],[119.052089,36.037838],[119.040322,36.042934],[119.042534,36.055512],[119.049641,36.066632],[119.063539,36.075042],[119.066935,36.081631],[119.048851,36.092707],[119.038506,36.090444],[119.020344,36.104307],[119.013868,36.09881],[119.000523,36.099497],[118.988756,36.092343],[118.970278,36.09873],[118.970041,36.104671],[118.958512,36.104145],[118.954642,36.1115],[118.943271,36.119582],[118.936322,36.11344],[118.916185,36.111702],[118.920765,36.105721],[118.908288,36.091292],[118.886493,36.088584],[118.880886,36.08438],[118.875911,36.091535],[118.860513,36.101316],[118.865961,36.113682],[118.860197,36.114733],[118.858302,36.129966],[118.863908,36.139298],[118.858302,36.143256],[118.859802,36.16232],[118.85459,36.170194],[118.846614,36.172092],[118.844561,36.18473],[118.848746,36.188606],[118.847009,36.199263],[118.835796,36.203138],[118.809026,36.198738],[118.802076,36.202855],[118.78573,36.197487],[118.766383,36.206649],[118.745535,36.191754],[118.751142,36.183115],[118.741824,36.165551],[118.733532,36.166802],[118.73298,36.1519],[118.736454,36.146528],[118.72603,36.141035],[118.714659,36.154485],[118.703761,36.150446],[118.701235,36.144509],[118.679913,36.152062],[118.683388,36.158564],[118.675491,36.170194],[118.666015,36.168983],[118.653143,36.176695],[118.644299,36.177018],[118.640824,36.171042],[118.622109,36.17718],[118.606236,36.164218],[118.581914,36.151456],[118.572201,36.156424],[118.563988,36.147094],[118.565015,36.130087],[118.556881,36.130935],[118.541719,36.124996],[118.535797,36.118531],[118.515502,36.109884],[118.509974,36.114612],[118.504762,36.105802],[118.526716,36.104671],[118.529479,36.093879],[118.522925,36.084784],[118.507842,36.074961],[118.496866,36.067683],[118.48044,36.074071],[118.482099,36.092546],[118.478545,36.098245],[118.484468,36.104064],[118.479493,36.118814],[118.492601,36.127057],[118.487863,36.131784],[118.462594,36.14059],[118.457303,36.13247],[118.447116,36.140913],[118.440956,36.132511],[118.428953,36.132672],[118.412844,36.127218],[118.402183,36.131622],[118.405263,36.141641],[118.402262,36.162926],[118.387653,36.174555],[118.374387,36.203097],[118.382046,36.207335],[118.386548,36.239053],[118.379756,36.245265],[118.368385,36.248412],[118.350775,36.263538],[118.31524,36.24938],[118.306948,36.252123],[118.315003,36.266361],[118.31366,36.277371],[118.317609,36.288903],[118.310107,36.295716],[118.315477,36.304464],[118.30908,36.307125],[118.304105,36.321393],[118.291075,36.326189],[118.300157,36.338116],[118.269912,36.339849],[118.261857,36.345852],[118.262726,36.352218],[118.256093,36.363175],[118.239825,36.376748],[118.235403,36.389634],[118.251592,36.401995],[118.250407,36.411214],[118.227427,36.408034],[118.224427,36.414234],[118.228533,36.430736],[118.232797,36.432869],[118.22719,36.451379],[118.233508,36.456609],[118.229638,36.467793],[118.216135,36.478573],[118.212818,36.490075],[118.218346,36.497354],[118.210528,36.503466],[118.213766,36.513075],[118.210844,36.526099],[118.221663,36.531887],[118.214556,36.539322],[118.191892,36.546074],[118.183916,36.561142],[118.180915,36.5607],[118.180678,36.577412],[118.176967,36.582996],[118.180363,36.593599],[118.189523,36.599141],[118.200657,36.612071],[118.214793,36.621144],[118.20658,36.637482],[118.199631,36.639047],[118.215898,36.648921],[118.221189,36.664169],[118.230191,36.660357],[118.226796,36.668382],[118.215819,36.668262],[118.21653,36.6811],[118.228059,36.694016],[118.245037,36.690647],[118.238246,36.697305],[118.227585,36.697625],[118.237614,36.712704],[118.227743,36.717957],[118.234219,36.726457],[118.254276,36.731789],[118.264147,36.72373],[118.277019,36.719801],[118.284363,36.72337],[118.276151,36.731749],[118.27157,36.744015],[118.279546,36.753033],[118.298183,36.753914],[118.297788,36.777677],[118.307501,36.776234],[118.318161,36.77972],[118.321636,36.770905],[118.350222,36.768301],[118.388522,36.791217],[118.419872,36.796304],[118.424531,36.802673],[118.438666,36.809682],[118.44072,36.828142],[118.435508,36.838391],[118.450038,36.83747],[118.453828,36.857564],[118.461488,36.854322],[118.460462,36.846597],[118.480993,36.852641],[118.479967,36.860166],[118.465042,36.861366],[118.476966,36.876893],[118.482809,36.879214],[118.483046,36.900777],[118.474913,36.905297],[118.481862,36.914136],[118.48968,36.914096],[118.496708,36.924733],[118.492365,36.931611],[118.494339,36.941846],[118.467411,36.945484]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370800,\"name\":\"济宁市\",\"center\":[116.587245,35.415393],\"centroid\":[116.74105,35.371092],\"childrenNum\":11,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":7,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.392342,34.574909],[117.363045,34.589241],[117.357991,34.582693],[117.344014,34.582075],[117.325378,34.570996],[117.333037,34.56177],[117.32135,34.565436],[117.294264,34.554025],[117.30303,34.548999],[117.302477,34.541253],[117.285341,34.533012],[117.268047,34.532806],[117.27547,34.520113],[117.269705,34.511664],[117.274364,34.503544],[117.259282,34.49736],[117.267494,34.480003],[117.263625,34.472622],[117.256044,34.476292],[117.252332,34.486518],[117.242698,34.478519],[117.255096,34.472539],[117.255886,34.462023],[117.24791,34.451052],[117.234644,34.454476],[117.222325,34.450599],[117.222088,34.445731],[117.200214,34.441606],[117.199503,34.43451],[117.166099,34.434675],[117.159861,34.453115],[117.156623,34.48091],[117.145963,34.503956],[117.139803,34.522875],[117.140593,34.538699],[117.151253,34.559257],[117.147621,34.570255],[117.133486,34.58607],[117.123694,34.604682],[117.115244,34.628146],[117.103952,34.64897],[117.095897,34.64753],[117.081525,34.638188],[117.072996,34.639094],[117.062336,34.657735],[117.061704,34.675713],[117.072049,34.694181],[117.07734,34.696484],[117.069048,34.708287],[117.070469,34.713714],[117.061151,34.723993],[117.043225,34.736531],[117.021904,34.759219],[116.995687,34.758274],[116.989685,34.765136],[116.978472,34.763616],[116.976814,34.771259],[116.96789,34.772984],[116.965837,34.785063],[116.951623,34.794553],[116.951149,34.810571],[116.971681,34.811885],[116.979183,34.814966],[116.966074,34.844487],[116.92888,34.842886],[116.930144,34.859675],[116.936303,34.865093],[116.951465,34.864313],[116.976892,34.868541],[116.966943,34.875599],[116.945226,34.876789],[116.945305,34.873794],[116.922168,34.871413],[116.922326,34.894515],[116.89903,34.904689],[116.876129,34.912524],[116.858125,34.928355],[116.822115,34.929299],[116.815877,34.965298],[116.80877,34.968823],[116.812166,34.927945],[116.803874,34.928314],[116.803716,34.970339],[116.789107,34.975094],[116.789107,34.959804],[116.781605,34.961895],[116.785474,34.9473],[116.796925,34.944143],[116.797635,34.938771],[116.786975,34.940453],[116.78121,34.916585],[116.756572,34.917487],[116.74599,34.915764],[116.74528,34.920973],[116.720405,34.926141],[116.706191,34.933974],[116.696951,34.932743],[116.677999,34.939182],[116.675709,34.933154],[116.658415,34.933441],[116.657862,34.929012],[116.640016,34.932579],[116.631803,34.94074],[116.622485,34.940043],[116.613877,34.922778],[116.5601,34.909324],[116.546123,34.909406],[116.523064,34.903951],[116.502769,34.906125],[116.500558,34.90112],[116.480737,34.897387],[116.455784,34.900628],[116.445044,34.895418],[116.445281,34.888648],[116.436042,34.883026],[116.409745,34.852944],[116.373815,34.86538],[116.339543,34.867022],[116.325803,34.874943],[116.299032,34.877733],[116.286713,34.88159],[116.266261,34.89751],[116.226935,34.911786],[116.213826,34.913098],[116.201586,34.919702],[116.192505,34.939182],[116.162181,34.94361],[116.155153,34.947259],[116.162023,34.957632],[116.171499,34.964683],[116.170789,34.974684],[116.139754,34.995421],[116.115748,35.025574],[116.114564,35.039828],[116.119381,35.053383],[116.141413,35.055062],[116.140228,35.06018],[116.15389,35.088467],[116.141018,35.09076],[116.154284,35.113513],[116.181765,35.11204],[116.204903,35.145668],[116.214537,35.155606],[116.223618,35.173231],[116.221881,35.181817],[116.213115,35.196697],[116.228356,35.194367],[116.234516,35.200008],[116.234437,35.208264],[116.248256,35.195634],[116.269104,35.191178],[116.284265,35.22506],[116.285608,35.242669],[116.269656,35.269872],[116.265866,35.271547],[116.237201,35.261745],[116.223539,35.260438],[116.215642,35.29131],[116.199612,35.304986],[116.193452,35.337555],[116.201744,35.345185],[116.215169,35.350734],[116.22117,35.358608],[116.223855,35.371702],[116.215879,35.393438],[116.212642,35.409054],[116.215958,35.419857],[116.215484,35.435957],[116.204429,35.436079],[116.20206,35.458247],[116.206798,35.465703],[116.19669,35.46334],[116.188319,35.467781],[116.188319,35.477313],[116.177817,35.466151],[116.178685,35.450342],[116.167946,35.452217],[116.15689,35.446838],[116.160918,35.471569],[116.15002,35.469573],[116.129567,35.475235],[116.128778,35.489614],[116.121276,35.497881],[116.12554,35.516042],[116.123408,35.540589],[116.115274,35.566471],[116.114327,35.577456],[116.125145,35.587871],[116.125145,35.59385],[116.116222,35.606621],[116.115906,35.618414],[116.134384,35.638539],[116.127514,35.649433],[116.121829,35.67459],[116.103034,35.687348],[116.089847,35.699373],[116.079897,35.712452],[116.071052,35.719072],[116.041518,35.733893],[116.026909,35.749687],[116.017591,35.756263],[115.970289,35.782156],[115.945493,35.791976],[115.922119,35.799157],[115.925988,35.804756],[115.911932,35.811733],[115.898192,35.805202],[115.883583,35.808163],[115.877107,35.820657],[115.875212,35.835095],[115.876002,35.867124],[115.876081,35.875069],[115.882872,35.879892],[115.883267,35.895413],[115.88911,35.897561],[115.884767,35.909108],[115.872369,35.909351],[115.875133,35.920168],[115.907826,35.926851],[115.909958,35.935762],[115.906325,35.9454],[115.911853,35.960261],[115.957654,35.967994],[115.985135,35.974107],[116.00006,35.974349],[116.036069,35.96771],[116.048704,35.970301],[116.0506,35.981919],[116.061892,35.97358],[116.065367,35.964714],[116.060392,35.956374],[116.048704,35.948114],[116.05897,35.936167],[116.07279,35.940055],[116.074606,35.927459],[116.086767,35.923246],[116.081634,35.914172],[116.09261,35.904935],[116.126172,35.891037],[116.142834,35.895656],[116.154284,35.886012],[116.161155,35.900397],[116.166998,35.90457],[116.185398,35.900478],[116.190057,35.892536],[116.20814,35.886863],[116.214774,35.889659],[116.218485,35.879811],[116.221091,35.892779],[116.233963,35.888403],[116.230804,35.860963],[116.233963,35.851273],[116.245808,35.834162],[116.250072,35.823536],[116.274868,35.803377],[116.277395,35.806581],[116.304007,35.799401],[116.297295,35.795546],[116.301875,35.777084],[116.309377,35.77404],[116.32983,35.787594],[116.336621,35.796723],[116.355652,35.800537],[116.362838,35.795952],[116.377921,35.796642],[116.385581,35.801754],[116.400822,35.794613],[116.421196,35.799279],[116.428698,35.796398],[116.436989,35.807271],[116.459811,35.81583],[116.459732,35.828241],[116.468024,35.836149],[116.475841,35.83327],[116.486976,35.84138],[116.507508,35.84361],[116.515325,35.841866],[116.520616,35.853057],[116.525275,35.847462],[116.53641,35.847178],[116.549834,35.857517],[116.55702,35.890753],[116.566023,35.899222],[116.595715,35.905056],[116.599663,35.916157],[116.618536,35.935195],[116.62817,35.938556],[116.665996,35.940176],[116.676973,35.925596],[116.672392,35.92118],[116.666944,35.898209],[116.647518,35.884674],[116.62438,35.878068],[116.614904,35.865746],[116.617036,35.855206],[116.641042,35.836879],[116.656441,35.828525],[116.676736,35.822198],[116.686607,35.814005],[116.687317,35.798062],[116.670497,35.761499],[116.662679,35.758252],[116.636699,35.764137],[116.619563,35.756628],[116.614588,35.74924],[116.612061,35.71237],[116.615615,35.705222],[116.627539,35.705791],[116.648939,35.713426],[116.664969,35.716716],[116.68866,35.724838],[116.698847,35.72098],[116.705322,35.70839],[116.733829,35.703435],[116.743069,35.703597],[116.743069,35.703597],[116.762732,35.708309],[116.770076,35.703557],[116.77742,35.690882],[116.795345,35.682188],[116.8049,35.686292],[116.811376,35.706034],[116.8218,35.705222],[116.8233,35.696935],[116.836882,35.697382],[116.861994,35.679059],[116.879367,35.685479],[116.88071,35.696732],[116.897135,35.701851],[116.909849,35.699982],[116.91814,35.706278],[116.930538,35.709406],[116.931012,35.713629],[116.949649,35.715741],[116.954939,35.719072],[116.952412,35.737507],[116.946253,35.744368],[116.952412,35.7561],[116.974366,35.760444],[116.993397,35.794045],[116.991423,35.805973],[117.009506,35.807636],[117.0268,35.799401],[117.049622,35.801307],[117.070864,35.790394],[117.083815,35.80431],[117.097318,35.802687],[117.103241,35.790272],[117.131275,35.786498],[117.137908,35.783374],[117.135855,35.774811],[117.128353,35.769901],[117.135381,35.767303],[117.143436,35.771727],[117.163651,35.775014],[117.175023,35.780209],[117.200214,35.775095],[117.21806,35.778464],[117.226984,35.773959],[117.260308,35.771037],[117.297581,35.788487],[117.306504,35.798833],[117.318428,35.793802],[117.341013,35.793558],[117.343382,35.784267],[117.350331,35.782725],[117.364467,35.770225],[117.379155,35.775785],[117.391,35.767141],[117.415559,35.775177],[117.431195,35.760971],[117.440197,35.744571],[117.452832,35.742298],[117.478733,35.732675],[117.488683,35.721102],[117.49121,35.707903],[117.511031,35.712411],[117.530931,35.707131],[117.520586,35.697626],[117.529431,35.682879],[117.576022,35.650206],[117.596948,35.630449],[117.588893,35.619878],[117.585577,35.593972],[117.592763,35.589701],[117.590394,35.573551],[117.593473,35.567448],[117.582418,35.554141],[117.528641,35.547182],[117.515058,35.551008],[117.499502,35.550845],[117.496264,35.543031],[117.50424,35.531675],[117.516401,35.527319],[117.520033,35.51991],[117.513795,35.514576],[117.501634,35.512947],[117.498396,35.503093],[117.481734,35.507898],[117.472416,35.514372],[117.467441,35.512255],[117.462703,35.497922],[117.452279,35.490306],[117.442171,35.469247],[117.42851,35.458614],[117.453779,35.442396],[117.455833,35.424953],[117.467441,35.418186],[117.474785,35.400941],[117.463334,35.39038],[117.463887,35.375617],[117.439644,35.359668],[117.439012,35.348939],[117.446988,35.330292],[117.453937,35.325027],[117.478891,35.314375],[117.463098,35.287472],[117.439565,35.282368],[117.419191,35.273997],[117.406004,35.283348],[117.403635,35.301394],[117.399528,35.306374],[117.359571,35.318375],[117.347568,35.315109],[117.318034,35.320252],[117.308557,35.312579],[117.314085,35.302129],[117.311163,35.28588],[117.305794,35.295229],[117.290079,35.299394],[117.284472,35.294331],[117.262203,35.287472],[117.269231,35.261296],[117.220824,35.26489],[117.204873,35.258518],[117.199108,35.24749],[117.176681,35.243159],[117.152675,35.232047],[117.123536,35.23078],[117.104899,35.221464],[117.092896,35.220361],[117.065336,35.22792],[117.053333,35.224202],[117.028774,35.221219],[117.014639,35.214844],[116.995687,35.1978],[116.969706,35.187377],[116.962047,35.177319],[116.938277,35.172168],[116.925721,35.182266],[116.913718,35.178791],[116.904716,35.182471],[116.898398,35.195757],[116.876603,35.188031],[116.86618,35.172617],[116.85394,35.16861],[116.832776,35.184392],[116.811218,35.17736],[116.81564,35.170777],[116.813192,35.159573],[116.81793,35.150699],[116.825748,35.147631],[116.832065,35.123783],[116.848649,35.103774],[116.863179,35.091496],[116.888922,35.093829],[116.888212,35.085193],[116.900373,35.068737],[116.880473,35.062595],[116.881183,35.058133],[116.900767,35.05977],[116.907875,35.046995],[116.937172,35.0275],[116.951702,35.020618],[116.956993,35.01054],[116.954466,34.993331],[116.943015,34.975627],[116.955334,34.967142],[116.9671,34.951072],[116.980367,34.941027],[116.989448,34.93873],[117.017719,34.942503],[117.038487,34.937869],[117.043462,34.932825],[117.041093,34.925157],[117.05815,34.926961],[117.06123,34.930406],[117.073707,34.925485],[117.082551,34.934917],[117.103399,34.937459],[117.111059,34.917774],[117.110111,34.90514],[117.12093,34.903581],[117.125826,34.863451],[117.139013,34.854052],[117.140593,34.846499],[117.156623,34.834306],[117.17755,34.828722],[117.194686,34.816239],[117.180314,34.800221],[117.172733,34.799194],[117.162467,34.782105],[117.176523,34.779065],[117.180551,34.784201],[117.191369,34.780914],[117.212927,34.761027],[117.22422,34.745533],[117.236697,34.746355],[117.242067,34.729995],[117.253675,34.721444],[117.271443,34.726501],[117.278787,34.715647],[117.304609,34.714866],[117.310611,34.717333],[117.326167,34.703434],[117.324272,34.697307],[117.335485,34.692454],[117.329247,34.677359],[117.346067,34.670982],[117.35657,34.661643],[117.354201,34.653538],[117.366915,34.650246],[117.374022,34.636172],[117.376707,34.622301],[117.384051,34.628228],[117.402687,34.628434],[117.4109,34.623454],[117.407978,34.610651],[117.397949,34.604393],[117.398976,34.588335],[117.393922,34.587676],[117.392342,34.574909]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":370900,\"name\":\"泰安市\",\"center\":[117.129063,36.194968],\"centroid\":[117.030947,36.002333],\"childrenNum\":6,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":8,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.596948,35.630449],[117.576022,35.650206],[117.529431,35.682879],[117.520586,35.697626],[117.530931,35.707131],[117.511031,35.712411],[117.49121,35.707903],[117.488683,35.721102],[117.478733,35.732675],[117.452832,35.742298],[117.440197,35.744571],[117.431195,35.760971],[117.415559,35.775177],[117.391,35.767141],[117.379155,35.775785],[117.364467,35.770225],[117.350331,35.782725],[117.343382,35.784267],[117.341013,35.793558],[117.318428,35.793802],[117.306504,35.798833],[117.297581,35.788487],[117.260308,35.771037],[117.226984,35.773959],[117.21806,35.778464],[117.200214,35.775095],[117.175023,35.780209],[117.163651,35.775014],[117.143436,35.771727],[117.135381,35.767303],[117.128353,35.769901],[117.135855,35.774811],[117.137908,35.783374],[117.131275,35.786498],[117.103241,35.790272],[117.097318,35.802687],[117.083815,35.80431],[117.070864,35.790394],[117.049622,35.801307],[117.0268,35.799401],[117.009506,35.807636],[116.991423,35.805973],[116.993397,35.794045],[116.974366,35.760444],[116.952412,35.7561],[116.946253,35.744368],[116.952412,35.737507],[116.954939,35.719072],[116.949649,35.715741],[116.931012,35.713629],[116.930538,35.709406],[116.91814,35.706278],[116.909849,35.699982],[116.897135,35.701851],[116.88071,35.696732],[116.879367,35.685479],[116.861994,35.679059],[116.836882,35.697382],[116.8233,35.696935],[116.8218,35.705222],[116.811376,35.706034],[116.8049,35.686292],[116.795345,35.682188],[116.77742,35.690882],[116.770076,35.703557],[116.762732,35.708309],[116.743069,35.703597],[116.743069,35.703597],[116.733829,35.703435],[116.705322,35.70839],[116.698847,35.72098],[116.68866,35.724838],[116.664969,35.716716],[116.648939,35.713426],[116.627539,35.705791],[116.615615,35.705222],[116.612061,35.71237],[116.614588,35.74924],[116.619563,35.756628],[116.636699,35.764137],[116.662679,35.758252],[116.670497,35.761499],[116.687317,35.798062],[116.686607,35.814005],[116.676736,35.822198],[116.656441,35.828525],[116.641042,35.836879],[116.617036,35.855206],[116.614904,35.865746],[116.62438,35.878068],[116.647518,35.884674],[116.666944,35.898209],[116.672392,35.92118],[116.676973,35.925596],[116.665996,35.940176],[116.62817,35.938556],[116.618536,35.935195],[116.599663,35.916157],[116.595715,35.905056],[116.566023,35.899222],[116.55702,35.890753],[116.549834,35.857517],[116.53641,35.847178],[116.525275,35.847462],[116.520616,35.853057],[116.515325,35.841866],[116.507508,35.84361],[116.486976,35.84138],[116.475841,35.83327],[116.468024,35.836149],[116.459732,35.828241],[116.459811,35.81583],[116.436989,35.807271],[116.428698,35.796398],[116.421196,35.799279],[116.400822,35.794613],[116.385581,35.801754],[116.377921,35.796642],[116.362838,35.795952],[116.355652,35.800537],[116.336621,35.796723],[116.32983,35.787594],[116.309377,35.77404],[116.301875,35.777084],[116.297295,35.795546],[116.304007,35.799401],[116.277395,35.806581],[116.274868,35.803377],[116.250072,35.823536],[116.245808,35.834162],[116.233963,35.851273],[116.230804,35.860963],[116.233963,35.888403],[116.221091,35.892779],[116.218485,35.879811],[116.214774,35.889659],[116.20814,35.886863],[116.190057,35.892536],[116.185398,35.900478],[116.166998,35.90457],[116.161155,35.900397],[116.154284,35.886012],[116.142834,35.895656],[116.126172,35.891037],[116.09261,35.904935],[116.081634,35.914172],[116.086767,35.923246],[116.074606,35.927459],[116.07279,35.940055],[116.05897,35.936167],[116.048704,35.948114],[116.060392,35.956374],[116.065367,35.964714],[116.061892,35.97358],[116.0506,35.981919],[116.052574,35.99912],[116.06284,36.028899],[116.073658,36.026148],[116.079502,36.042611],[116.076106,36.056887],[116.087162,36.071403],[116.091742,36.089474],[116.096875,36.092182],[116.099323,36.112066],[116.114011,36.122047],[116.123882,36.136429],[116.164313,36.146084],[116.164392,36.168862],[116.169446,36.171325],[116.213036,36.169831],[116.226066,36.173748],[116.246677,36.149436],[116.261444,36.122693],[116.27171,36.109843],[116.273368,36.093758],[116.267287,36.074233],[116.267998,36.052964],[116.271552,36.043824],[116.294689,36.031407],[116.301244,36.031123],[116.304718,36.046251],[116.310404,36.052196],[116.324855,36.054178],[116.338753,36.060082],[116.352731,36.070797],[116.360233,36.084744],[116.386845,36.090807],[116.398058,36.084582],[116.401059,36.074031],[116.409508,36.068007],[116.427829,36.067441],[116.433357,36.059839],[116.429566,36.052439],[116.436121,36.046534],[116.434541,36.038607],[116.449387,36.047302],[116.452072,36.058019],[116.471182,36.06457],[116.504112,36.064732],[116.532303,36.074274],[116.543359,36.086604],[116.546597,36.101195],[116.554651,36.108187],[116.566891,36.108752],[116.569024,36.118774],[116.562153,36.121643],[116.5586,36.133804],[116.543122,36.13958],[116.525275,36.135298],[116.528513,36.145276],[116.519748,36.141196],[116.507192,36.141277],[116.510192,36.148346],[116.52188,36.157151],[116.525986,36.168297],[116.51035,36.176857],[116.502059,36.192764],[116.481922,36.197002],[116.472604,36.21464],[116.487529,36.228441],[116.485239,36.236067],[116.506402,36.240344],[116.512325,36.253414],[116.525591,36.255229],[116.53641,36.245588],[116.552361,36.247767],[116.558837,36.261037],[116.574393,36.263457],[116.581264,36.255471],[116.587502,36.268862],[116.595794,36.270999],[116.610403,36.282451],[116.615536,36.294587],[116.649018,36.295797],[116.675709,36.276645],[116.686528,36.275435],[116.701058,36.280153],[116.710376,36.279185],[116.732961,36.294144],[116.762574,36.305391],[116.772761,36.312002],[116.786659,36.311357],[116.808612,36.299022],[116.830644,36.294587],[116.855756,36.301642],[116.855519,36.289709],[116.867759,36.28108],[116.873129,36.264062],[116.891133,36.255471],[116.928722,36.26991],[116.932828,36.261925],[116.950201,36.257327],[116.956835,36.259787],[116.975471,36.243208],[116.987632,36.250711],[117.002794,36.254503],[117.003347,36.265353],[117.027353,36.268983],[117.030275,36.277532],[117.0482,36.283701],[117.051201,36.288741],[117.066995,36.296885],[117.074102,36.296724],[117.077655,36.307205],[117.07734,36.321957],[117.088711,36.346013],[117.107347,36.338882],[117.111691,36.340413],[117.137039,36.335135],[117.142567,36.345731],[117.161361,36.351895],[117.179603,36.353144],[117.18292,36.360798],[117.180945,36.37256],[117.191685,36.378762],[117.200924,36.389755],[117.208742,36.405297],[117.218297,36.406182],[117.242145,36.41528],[117.249726,36.436732],[117.263862,36.449206],[117.275786,36.451218],[117.288973,36.468718],[117.288184,36.476039],[117.30682,36.472097],[117.30682,36.467029],[117.335328,36.466345],[117.346383,36.46373],[117.346936,36.455724],[117.339118,36.438181],[117.339434,36.425786],[117.344962,36.403968],[117.35041,36.393379],[117.351753,36.377997],[117.362729,36.360234],[117.387762,36.337915],[117.38871,36.326148],[117.379707,36.315146],[117.38792,36.296361],[117.387604,36.285556],[117.397791,36.283782],[117.394553,36.266522],[117.413901,36.267934],[117.417217,36.243652],[117.392895,36.237439],[117.393132,36.226747],[117.385235,36.226989],[117.396607,36.215972],[117.412716,36.210927],[117.427878,36.221662],[117.447383,36.218313],[117.447778,36.203541],[117.452437,36.203138],[117.440434,36.191189],[117.446988,36.18691],[117.461202,36.170194],[117.475653,36.173102],[117.487972,36.15921],[117.476601,36.150123],[117.469178,36.154687],[117.459623,36.1498],[117.44683,36.120834],[117.463571,36.116875],[117.454885,36.111177],[117.456148,36.100467],[117.447067,36.09206],[117.451963,36.087412],[117.473758,36.089797],[117.484893,36.10075],[117.491052,36.096587],[117.505898,36.098245],[117.534879,36.111419],[117.547672,36.106166],[117.552884,36.087978],[117.561649,36.079327],[117.575943,36.074516],[117.601844,36.075648],[117.630588,36.059879],[117.656569,36.049729],[117.689972,36.052358],[117.701186,36.04528],[117.720454,36.038243],[117.725824,36.029667],[117.741696,36.036058],[117.757016,36.019392],[117.750304,36.011947],[117.756542,36.002236],[117.756621,35.991916],[117.762307,35.990621],[117.781022,35.995437],[117.782286,36.007294],[117.794763,36.015143],[117.801159,36.012959],[117.825244,36.013363],[117.828719,36.008022],[117.841827,36.011947],[117.854462,36.006889],[117.866386,36.007415],[117.877047,36.016357],[117.895052,36.020363],[117.914557,36.020039],[117.922848,36.015467],[117.926165,36.005068],[117.935088,36.004421],[117.937536,35.99653],[117.937221,35.98119],[117.946065,35.970949],[117.947013,35.960382],[117.953962,35.957913],[117.971414,35.969937],[117.992577,35.971273],[117.984443,35.956293],[117.988471,35.947709],[117.997394,35.934587],[117.99921,35.925393],[117.988234,35.908703],[117.981364,35.906191],[117.97931,35.889699],[117.968097,35.884066],[117.960516,35.87057],[117.937615,35.874826],[117.924586,35.880946],[117.906265,35.884634],[117.883364,35.882648],[117.86686,35.86984],[117.85541,35.850219],[117.842143,35.84507],[117.827376,35.827754],[117.828403,35.821792],[117.840959,35.812058],[117.846092,35.796398],[117.831167,35.786661],[117.828482,35.773837],[117.833694,35.760484],[117.837405,35.741445],[117.823033,35.739496],[117.811504,35.732919],[117.781733,35.734096],[117.769019,35.726625],[117.754173,35.709609],[117.732615,35.71237],[117.707424,35.726016],[117.679154,35.713305],[117.663913,35.70969],[117.634616,35.709324],[117.62585,35.703841],[117.605319,35.674834],[117.599001,35.649149],[117.596948,35.630449]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371000,\"name\":\"威海市\",\"center\":[122.116394,37.509691],\"centroid\":[122.000809,37.118689],\"childrenNum\":4,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":9,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.923992,37.473096],[121.966002,37.489648],[121.979111,37.488378],[121.996958,37.493974],[121.999485,37.506236],[122.013225,37.510006],[122.017253,37.530914],[122.036284,37.529446],[122.045207,37.531628],[122.053736,37.543448],[122.069924,37.537062],[122.075215,37.540473],[122.074583,37.551816],[122.066529,37.562364],[122.069529,37.568747],[122.088797,37.554116],[122.107434,37.550309],[122.123148,37.552926],[122.119437,37.564227],[122.125833,37.56732],[122.133572,37.556455],[122.150471,37.557129],[122.144154,37.550388],[122.150708,37.544281],[122.171398,37.541147],[122.171714,37.534285],[122.163106,37.518973],[122.15442,37.518219],[122.14755,37.51199],[122.136336,37.512307],[122.131993,37.499371],[122.149524,37.493418],[122.153946,37.488616],[122.148892,37.481948],[122.156947,37.459438],[122.165712,37.450027],[122.167213,37.438073],[122.183717,37.431282],[122.185849,37.441688],[122.194456,37.456222],[122.212461,37.455666],[122.220595,37.463289],[122.233151,37.46051],[122.235046,37.469205],[122.24089,37.465354],[122.252656,37.467855],[122.260316,37.46047],[122.27682,37.456778],[122.286138,37.447287],[122.280373,37.442641],[122.280216,37.433863],[122.285664,37.425403],[122.31046,37.423059],[122.312355,37.416663],[122.336993,37.414438],[122.387375,37.42],[122.393376,37.415114],[122.416751,37.414676],[122.437046,37.420358],[122.464684,37.42441],[122.480952,37.433665],[122.489559,37.431917],[122.487348,37.420278],[122.495245,37.413683],[122.513408,37.410703],[122.553602,37.406929],[122.580293,37.410187],[122.595929,37.421152],[122.606511,37.424131],[122.626648,37.424688],[122.643862,37.428064],[122.649548,37.419881],[122.656655,37.428461],[122.665816,37.424251],[122.659735,37.421589],[122.666526,37.414438],[122.675923,37.413326],[122.669527,37.42858],[122.684847,37.4287],[122.688558,37.422423],[122.704273,37.414955],[122.706958,37.404108],[122.715802,37.396121],[122.697877,37.384118],[122.69456,37.376328],[122.680662,37.37438],[122.675134,37.383761],[122.655629,37.388292],[122.641809,37.385867],[122.626884,37.36957],[122.611486,37.366907],[122.594823,37.347981],[122.59356,37.336289],[122.611486,37.339431],[122.610459,37.331119],[122.594192,37.319822],[122.573897,37.296349],[122.581083,37.286957],[122.57137,37.279037],[122.577056,37.271395],[122.567185,37.261164],[122.584716,37.258736],[122.592454,37.261284],[122.590638,37.248065],[122.60043,37.242212],[122.60043,37.22895],[122.604063,37.221462],[122.623963,37.212739],[122.628859,37.203456],[122.624042,37.191144],[122.606274,37.193057],[122.596877,37.181262],[122.57903,37.183493],[122.573344,37.17624],[122.587243,37.163684],[122.586374,37.153519],[122.581083,37.147738],[122.559762,37.147419],[122.533544,37.153359],[122.501562,37.148695],[122.493113,37.142036],[122.484505,37.128877],[122.481189,37.117829],[122.477951,37.091539],[122.481031,37.071786],[122.480083,37.06105],[122.45963,37.04584],[122.461447,37.039532],[122.487901,37.034301],[122.498641,37.034301],[122.524226,37.04033],[122.548706,37.05091],[122.575634,37.054423],[122.585268,37.042965],[122.583373,37.037296],[122.555971,37.02324],[122.544837,37.004587],[122.545232,36.990205],[122.556919,36.978898],[122.557551,36.968707],[122.545863,36.956317],[122.546574,36.923494],[122.542468,36.913536],[122.532123,36.901457],[122.516408,36.890256],[122.497061,36.886095],[122.484663,36.891536],[122.485453,36.903777],[122.492639,36.912176],[122.483005,36.914056],[122.434124,36.914256],[122.428833,36.908856],[122.446601,36.898217],[122.454498,36.878813],[122.464448,36.879294],[122.457025,36.86913],[122.445732,36.873052],[122.416119,36.859485],[122.403326,36.860686],[122.392587,36.866209],[122.3839,36.865368],[122.386506,36.860046],[122.378373,36.844275],[122.350655,36.835228],[122.342758,36.828502],[122.335414,36.83767],[122.32657,36.830424],[122.298141,36.83707],[122.280452,36.835829],[122.263869,36.841633],[122.250603,36.839912],[122.245865,36.835428],[122.220437,36.848919],[122.196115,36.842874],[122.174714,36.842474],[122.17203,36.852441],[122.181427,36.856323],[122.188534,36.866209],[122.175662,36.894537],[122.164291,36.892536],[122.155999,36.883055],[122.119674,36.892096],[122.117463,36.895737],[122.127176,36.918535],[122.14139,36.938288],[122.136731,36.944325],[122.12765,36.945484],[122.112409,36.939607],[122.106486,36.941686],[122.0993,36.93289],[122.100801,36.921934],[122.09322,36.914136],[122.073636,36.914376],[122.051998,36.904977],[122.05342,36.895697],[122.046234,36.891176],[122.042522,36.872011],[122.037784,36.875492],[122.03731,36.895817],[122.025307,36.908856],[122.022464,36.942006],[122.013936,36.959994],[121.994668,36.953719],[121.98306,36.958436],[121.977611,36.947163],[121.964818,36.938128],[121.927545,36.932371],[121.897616,36.921694],[121.870846,36.915736],[121.862791,36.909256],[121.829388,36.898057],[121.816121,36.891856],[121.790457,36.884255],[121.767714,36.874852],[121.76195,36.866049],[121.763766,36.85084],[121.757606,36.841753],[121.73818,36.835068],[121.726256,36.82626],[121.718517,36.829223],[121.70683,36.822296],[121.670742,36.817651],[121.64176,36.805757],[121.628494,36.797306],[121.628968,36.783245],[121.634416,36.766858],[121.653527,36.72798],[121.651473,36.723851],[121.620834,36.737241],[121.606067,36.738122],[121.599671,36.745578],[121.60125,36.763412],[121.586009,36.756399],[121.570531,36.766257],[121.556317,36.764294],[121.574638,36.745538],[121.574322,36.737],[121.565477,36.728822],[121.542024,36.734595],[121.531995,36.731027],[121.532153,36.736198],[121.546051,36.741971],[121.547394,36.74642],[121.53239,36.753273],[121.520466,36.749386],[121.517702,36.761088],[121.507594,36.760928],[121.505857,36.770665],[121.482245,36.77355],[121.481061,36.780401],[121.496302,36.792379],[121.528205,36.805637],[121.546051,36.806558],[121.554027,36.81709],[121.569979,36.827501],[121.565083,36.830504],[121.539339,36.823417],[121.530179,36.818772],[121.522914,36.80824],[121.506962,36.803834],[121.480271,36.784487],[121.478218,36.770825],[121.462424,36.784888],[121.450184,36.790056],[121.417334,36.792739],[121.409121,36.790176],[121.395855,36.794342],[121.396802,36.803834],[121.376665,36.830384],[121.373428,36.840593],[121.36174,36.841273],[121.357239,36.852401],[121.357397,36.864048],[121.363873,36.871651],[121.385431,36.877333],[121.36482,36.897417],[121.366557,36.903617],[121.360951,36.921494],[121.347605,36.920574],[121.312938,36.904097],[121.308358,36.905177],[121.304173,36.918335],[121.282615,36.918535],[121.272191,36.927532],[121.263189,36.926093],[121.252607,36.938088],[121.248501,36.953679],[121.233734,36.956917],[121.22639,36.971065],[121.222915,36.986649],[121.209096,36.985371],[121.19038,36.996558],[121.182404,36.99456],[121.177587,37.003748],[121.181299,37.016131],[121.194565,37.019485],[121.19496,37.027273],[121.188564,37.029948],[121.188011,37.041169],[121.192512,37.052108],[121.191407,37.072026],[121.204279,37.07897],[121.243131,37.092138],[121.246368,37.102631],[121.26153,37.117989],[121.287827,37.136055],[121.306542,37.141996],[121.314044,37.141079],[121.317992,37.132825],[121.326916,37.12768],[121.34113,37.127002],[121.348316,37.135975],[121.358187,37.140282],[121.363715,37.129236],[121.351475,37.126962],[121.369795,37.110889],[121.376823,37.115915],[121.382746,37.112125],[121.391432,37.098282],[121.427363,37.100796],[121.441656,37.12106],[121.447578,37.123333],[121.465425,37.12086],[121.49946,37.104426],[121.547868,37.104945],[121.574954,37.110091],[121.580323,37.10674],[121.589168,37.116712],[121.590352,37.128518],[121.585377,37.132306],[121.590747,37.144269],[121.600539,37.141079],[121.612147,37.125846],[121.625414,37.131908],[121.628889,37.137969],[121.638839,37.139524],[121.639865,37.131908],[121.654316,37.121897],[121.666714,37.12082],[121.669162,37.110649],[121.678007,37.121658],[121.683692,37.123014],[121.682271,37.13127],[121.688983,37.133503],[121.683455,37.141917],[121.694037,37.141239],[121.699328,37.125926],[121.733995,37.125607],[121.737706,37.136175],[121.747656,37.135776],[121.767872,37.170979],[121.761002,37.177954],[121.753895,37.172493],[121.749315,37.176439],[121.760686,37.178831],[121.759738,37.19222],[121.769057,37.196364],[121.761634,37.217997],[121.754527,37.212022],[121.755632,37.220506],[121.748525,37.223255],[121.74813,37.241575],[121.757211,37.247667],[121.7749,37.248225],[121.778296,37.260487],[121.784692,37.268409],[121.792431,37.288469],[121.790615,37.299532],[121.794879,37.30375],[121.815253,37.300447],[121.822281,37.303988],[121.834047,37.318311],[121.859396,37.329249],[121.865239,37.336727],[121.870293,37.368894],[121.882454,37.381694],[121.90038,37.391232],[121.908435,37.400969],[121.91878,37.420755],[121.920438,37.429931],[121.933941,37.452529],[121.929519,37.454713],[121.92944,37.460868],[121.923992,37.473096]]],[[[122.183559,37.49957],[122.171951,37.501792],[122.184901,37.5156],[122.188218,37.510165],[122.199747,37.510323],[122.202748,37.501951],[122.216173,37.497824],[122.183559,37.49957]]],[[[122.257631,36.755638],[122.267028,36.754195],[122.260316,36.748704],[122.257631,36.755638]]],[[[121.484614,36.732871],[121.492274,36.740207],[121.499776,36.73712],[121.484614,36.732871]]],[[[121.620834,36.713827],[121.623124,36.728702],[121.631179,36.725855],[121.620834,36.713827]]],[[[122.482215,37.447089],[122.483479,37.454991],[122.490586,37.449829],[122.482215,37.447089]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371100,\"name\":\"日照市\",\"center\":[119.461208,35.428588],\"centroid\":[119.146499,35.578656],\"childrenNum\":4,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":10,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.662115,35.589294],[119.665748,35.570255],[119.649875,35.537658],[119.639215,35.509446],[119.628712,35.500854],[119.618999,35.459469],[119.612997,35.449813],[119.600205,35.443537],[119.592545,35.43339],[119.579673,35.406527],[119.578804,35.385568],[119.588991,35.376106],[119.586938,35.36387],[119.57912,35.357629],[119.543743,35.34796],[119.539794,35.329802],[119.552745,35.330006],[119.552113,35.324456],[119.53861,35.320456],[119.538452,35.29674],[119.528502,35.303721],[119.520447,35.303803],[119.516025,35.318089],[119.502442,35.321721],[119.476541,35.308334],[119.451113,35.28539],[119.42458,35.255332],[119.411313,35.231638],[119.397652,35.166893],[119.416604,35.167465],[119.416999,35.158183],[119.396073,35.157815],[119.393546,35.143582],[119.397731,35.137692],[119.418973,35.128283],[119.428292,35.121205],[119.432398,35.111385],[119.426633,35.108234],[119.412893,35.11073],[119.403259,35.106802],[119.396467,35.091701],[119.386518,35.088918],[119.374041,35.078685],[119.360379,35.075655],[119.350508,35.083883],[119.305812,35.076679],[119.301785,35.093174],[119.286702,35.11515],[119.267276,35.117154],[119.25551,35.122637],[119.240743,35.122923],[119.220685,35.10717],[119.203233,35.110894],[119.196679,35.129919],[119.189967,35.138101],[119.174252,35.139042],[119.164223,35.143173],[119.163433,35.154134],[119.173146,35.1617],[119.164855,35.166525],[119.157274,35.18243],[119.149219,35.189298],[119.1354,35.191669],[119.139032,35.202338],[119.161301,35.204136],[119.170225,35.21231],[119.174568,35.230331],[119.182149,35.241852],[119.181991,35.25231],[119.187519,35.258192],[119.179543,35.287595],[119.164065,35.289554],[119.155931,35.293882],[119.157669,35.301721],[119.143218,35.314048],[119.141322,35.320823],[119.148193,35.326741],[119.146455,35.334862],[119.133741,35.335596],[119.105708,35.330659],[119.096153,35.326864],[119.087229,35.340575],[119.085571,35.354243],[119.078385,35.357506],[119.075542,35.366113],[119.06575,35.364563],[119.04893,35.371498],[119.044587,35.377004],[119.024371,35.386873],[118.999654,35.388953],[118.984413,35.382224],[118.98852,35.36697],[118.986861,35.353141],[118.973042,35.340167],[118.961828,35.334168],[118.947219,35.336943],[118.930478,35.331271],[118.923213,35.339187],[118.92195,35.348408],[118.904814,35.355507],[118.889573,35.357261],[118.871015,35.367215],[118.874174,35.388464],[118.865725,35.391685],[118.859644,35.381694],[118.84314,35.370804],[118.816764,35.373292],[118.797575,35.369417],[118.784151,35.371049],[118.776412,35.37627],[118.768989,35.368031],[118.739455,35.359505],[118.723898,35.368479],[118.712527,35.363544],[118.709605,35.369825],[118.696891,35.379818],[118.682914,35.368642],[118.652274,35.373578],[118.632059,35.368438],[118.625425,35.370315],[118.624952,35.387036],[118.606157,35.390747],[118.601419,35.414517],[118.619029,35.423118],[118.635691,35.421039],[118.642246,35.425156],[118.632611,35.430903],[118.6289,35.449324],[118.64801,35.453276],[118.651011,35.458614],[118.662066,35.461547],[118.667831,35.456821],[118.693575,35.459103],[118.698234,35.455436],[118.709131,35.457677],[118.723898,35.468758],[118.734322,35.48607],[118.725004,35.496578],[118.698865,35.513558],[118.696575,35.528622],[118.725083,35.553205],[118.724056,35.562972],[118.734875,35.569767],[118.74056,35.581484],[118.735822,35.593443],[118.739692,35.62496],[118.751458,35.640409],[118.76662,35.653539],[118.791416,35.68296],[118.794101,35.697504],[118.806499,35.718056],[118.804209,35.728655],[118.798918,35.730117],[118.757223,35.725935],[118.743482,35.729346],[118.722161,35.73101],[118.707078,35.738075],[118.703288,35.745221],[118.706525,35.765152],[118.702182,35.772295],[118.700603,35.791367],[118.716712,35.80723],[118.724609,35.820454],[118.722082,35.834932],[118.732822,35.848111],[118.7498,35.849489],[118.75438,35.853544],[118.756038,35.877379],[118.765198,35.898331],[118.777281,35.896791],[118.775148,35.917251],[118.805709,35.923854],[118.80413,35.939731],[118.813922,35.948761],[118.837217,35.948883],[118.883571,35.957305],[118.893047,35.963257],[118.897312,35.97605],[118.87986,35.992321],[118.896048,36.006404],[118.956853,36.008427],[118.981886,36.017409],[118.999022,36.038404],[119.012526,36.03533],[119.024134,36.02631],[119.017659,36.024044],[119.014105,36.013404],[119.023739,36.011219],[119.024924,36.003571],[119.015606,35.995923],[119.021054,35.977426],[119.05201,35.9803],[119.060538,35.978195],[119.066619,35.963986],[119.07878,35.959289],[119.088888,35.963176],[119.121817,35.962731],[119.134373,35.968601],[119.153246,35.971192],[119.155063,35.965767],[119.178595,35.97107],[119.182623,35.962285],[119.179385,35.926163],[119.183412,35.91875],[119.169672,35.91721],[119.151746,35.905502],[119.144718,35.904449],[119.135637,35.892982],[119.158221,35.882486],[119.161854,35.894481],[119.169119,35.894846],[119.190598,35.879446],[119.217053,35.879527],[119.240427,35.884269],[119.281964,35.910202],[119.294441,35.911336],[119.298153,35.893022],[119.315999,35.887552],[119.345533,35.893792],[119.360695,35.884066],[119.371435,35.860476],[119.358247,35.84511],[119.372382,35.830025],[119.374041,35.816154],[119.368829,35.770834],[119.375857,35.770712],[119.390466,35.778707],[119.397731,35.786823],[119.427739,35.802078],[119.444322,35.804026],[119.455693,35.809056],[119.464696,35.80861],[119.482385,35.799725],[119.493282,35.789866],[119.496599,35.779235],[119.48657,35.771646],[119.48807,35.754599],[119.504101,35.752325],[119.525422,35.730604],[119.517762,35.723742],[119.521079,35.716879],[119.518473,35.700632],[119.51484,35.697992],[119.519105,35.68552],[119.528265,35.674305],[119.524474,35.632279],[119.517762,35.625774],[119.518157,35.615446],[119.536872,35.606011],[119.538215,35.589294],[119.556535,35.592508],[119.57762,35.586243],[119.592308,35.600683],[119.600599,35.590271],[119.609286,35.59202],[119.614972,35.606336],[119.634713,35.598731],[119.651455,35.588766],[119.662115,35.589294]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371300,\"name\":\"临沂市\",\"center\":[118.326443,35.065282],\"centroid\":[118.286436,35.311894],\"childrenNum\":12,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":11,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.419191,35.273997],[117.439565,35.282368],[117.463098,35.287472],[117.478891,35.314375],[117.453937,35.325027],[117.446988,35.330292],[117.439012,35.348939],[117.439644,35.359668],[117.463887,35.375617],[117.463334,35.39038],[117.474785,35.400941],[117.467441,35.418186],[117.455833,35.424953],[117.453779,35.442396],[117.42851,35.458614],[117.442171,35.469247],[117.452279,35.490306],[117.462703,35.497922],[117.467441,35.512255],[117.472416,35.514372],[117.481734,35.507898],[117.498396,35.503093],[117.501634,35.512947],[117.513795,35.514576],[117.520033,35.51991],[117.516401,35.527319],[117.50424,35.531675],[117.496264,35.543031],[117.499502,35.550845],[117.515058,35.551008],[117.528641,35.547182],[117.582418,35.554141],[117.593473,35.567448],[117.590394,35.573551],[117.592763,35.589701],[117.585577,35.593972],[117.588893,35.619878],[117.596948,35.630449],[117.599001,35.649149],[117.605319,35.674834],[117.62585,35.703841],[117.634616,35.709324],[117.663913,35.70969],[117.679154,35.713305],[117.707424,35.726016],[117.732615,35.71237],[117.754173,35.709609],[117.769019,35.726625],[117.781733,35.734096],[117.811504,35.732919],[117.823033,35.739496],[117.837405,35.741445],[117.833694,35.760484],[117.828482,35.773837],[117.831167,35.786661],[117.846092,35.796398],[117.840959,35.812058],[117.828403,35.821792],[117.827376,35.827754],[117.842143,35.84507],[117.85541,35.850219],[117.86686,35.86984],[117.883364,35.882648],[117.906265,35.884634],[117.924586,35.880946],[117.937615,35.874826],[117.960516,35.87057],[117.968097,35.884066],[117.97931,35.889699],[117.981364,35.906191],[117.988234,35.908703],[117.99921,35.925393],[117.997394,35.934587],[117.988471,35.947709],[118.021084,35.949004],[118.02298,35.958965],[118.03293,35.964998],[118.032693,35.974268],[118.042248,35.986371],[118.058989,35.992968],[118.066807,36.009155],[118.075888,36.009034],[118.078415,36.017652],[118.084338,36.012149],[118.093261,36.014618],[118.096104,36.024246],[118.10937,36.030031],[118.132666,36.030436],[118.135588,36.02364],[118.178388,36.017005],[118.197578,36.004947],[118.206106,35.97864],[118.193787,35.974026],[118.207054,35.964391],[118.209897,35.955767],[118.22569,35.948235],[118.236351,35.947749],[118.236904,35.939245],[118.245906,35.932157],[118.257119,35.930699],[118.257593,35.925717],[118.26928,35.928512],[118.281362,35.935964],[118.293523,35.937503],[118.303552,35.948923],[118.314134,35.950827],[118.320136,35.946575],[118.344774,35.955888],[118.352828,35.956698],[118.360725,35.970908],[118.382283,35.975078],[118.387021,35.987586],[118.415213,35.990783],[118.430612,35.969694],[118.459356,35.952689],[118.470964,35.960868],[118.502157,35.962488],[118.505157,35.965808],[118.499393,35.976212],[118.486521,35.988759],[118.49268,35.995437],[118.487074,36.005797],[118.476571,36.012797],[118.469859,36.022992],[118.476097,36.031407],[118.489206,36.025784],[118.503341,36.024246],[118.507447,36.029789],[118.516845,36.026107],[118.522609,36.043622],[118.522214,36.05349],[118.513449,36.064085],[118.516608,36.068573],[118.507842,36.074961],[118.522925,36.084784],[118.529479,36.093879],[118.526716,36.104671],[118.504762,36.105802],[118.509974,36.114612],[118.515502,36.109884],[118.535797,36.118531],[118.541719,36.124996],[118.556881,36.130935],[118.565015,36.130087],[118.563988,36.147094],[118.572201,36.156424],[118.581914,36.151456],[118.606236,36.164218],[118.622109,36.17718],[118.640824,36.171042],[118.644299,36.177018],[118.653143,36.176695],[118.666015,36.168983],[118.675491,36.170194],[118.683388,36.158564],[118.679913,36.152062],[118.701235,36.144509],[118.703761,36.150446],[118.714659,36.154485],[118.72603,36.141035],[118.736454,36.146528],[118.73298,36.1519],[118.733532,36.166802],[118.741824,36.165551],[118.751142,36.183115],[118.745535,36.191754],[118.766383,36.206649],[118.78573,36.197487],[118.802076,36.202855],[118.809026,36.198738],[118.835796,36.203138],[118.847009,36.199263],[118.848746,36.188606],[118.844561,36.18473],[118.846614,36.172092],[118.85459,36.170194],[118.859802,36.16232],[118.858302,36.143256],[118.863908,36.139298],[118.858302,36.129966],[118.860197,36.114733],[118.865961,36.113682],[118.860513,36.101316],[118.875911,36.091535],[118.880886,36.08438],[118.886493,36.088584],[118.908288,36.091292],[118.920765,36.105721],[118.916185,36.111702],[118.936322,36.11344],[118.943271,36.119582],[118.954642,36.1115],[118.958512,36.104145],[118.970041,36.104671],[118.970278,36.09873],[118.988756,36.092343],[119.000523,36.099497],[119.013868,36.09881],[119.020344,36.104307],[119.038506,36.090444],[119.048851,36.092707],[119.066935,36.081631],[119.063539,36.075042],[119.049641,36.066632],[119.042534,36.055512],[119.040322,36.042934],[119.052089,36.037838],[119.047903,36.024813],[119.035584,36.02275],[119.024134,36.02631],[119.012526,36.03533],[118.999022,36.038404],[118.981886,36.017409],[118.956853,36.008427],[118.896048,36.006404],[118.87986,35.992321],[118.897312,35.97605],[118.893047,35.963257],[118.883571,35.957305],[118.837217,35.948883],[118.813922,35.948761],[118.80413,35.939731],[118.805709,35.923854],[118.775148,35.917251],[118.777281,35.896791],[118.765198,35.898331],[118.756038,35.877379],[118.75438,35.853544],[118.7498,35.849489],[118.732822,35.848111],[118.722082,35.834932],[118.724609,35.820454],[118.716712,35.80723],[118.700603,35.791367],[118.702182,35.772295],[118.706525,35.765152],[118.703288,35.745221],[118.707078,35.738075],[118.722161,35.73101],[118.743482,35.729346],[118.757223,35.725935],[118.798918,35.730117],[118.804209,35.728655],[118.806499,35.718056],[118.794101,35.697504],[118.791416,35.68296],[118.76662,35.653539],[118.751458,35.640409],[118.739692,35.62496],[118.735822,35.593443],[118.74056,35.581484],[118.734875,35.569767],[118.724056,35.562972],[118.725083,35.553205],[118.696575,35.528622],[118.698865,35.513558],[118.725004,35.496578],[118.734322,35.48607],[118.723898,35.468758],[118.709131,35.457677],[118.698234,35.455436],[118.693575,35.459103],[118.667831,35.456821],[118.662066,35.461547],[118.651011,35.458614],[118.64801,35.453276],[118.6289,35.449324],[118.632611,35.430903],[118.642246,35.425156],[118.635691,35.421039],[118.619029,35.423118],[118.601419,35.414517],[118.606157,35.390747],[118.624952,35.387036],[118.625425,35.370315],[118.632059,35.368438],[118.652274,35.373578],[118.682914,35.368642],[118.696891,35.379818],[118.709605,35.369825],[118.712527,35.363544],[118.723898,35.368479],[118.739455,35.359505],[118.768989,35.368031],[118.776412,35.37627],[118.784151,35.371049],[118.797575,35.369417],[118.816764,35.373292],[118.84314,35.370804],[118.859644,35.381694],[118.865725,35.391685],[118.874174,35.388464],[118.871015,35.367215],[118.889573,35.357261],[118.904814,35.355507],[118.92195,35.348408],[118.923213,35.339187],[118.930478,35.331271],[118.947219,35.336943],[118.961828,35.334168],[118.973042,35.340167],[118.986861,35.353141],[118.98852,35.36697],[118.984413,35.382224],[118.999654,35.388953],[119.024371,35.386873],[119.044587,35.377004],[119.04893,35.371498],[119.06575,35.364563],[119.075542,35.366113],[119.078385,35.357506],[119.085571,35.354243],[119.087229,35.340575],[119.096153,35.326864],[119.105708,35.330659],[119.133741,35.335596],[119.146455,35.334862],[119.148193,35.326741],[119.141322,35.320823],[119.143218,35.314048],[119.157669,35.301721],[119.155931,35.293882],[119.164065,35.289554],[119.179543,35.287595],[119.187519,35.258192],[119.181991,35.25231],[119.182149,35.241852],[119.174568,35.230331],[119.170225,35.21231],[119.161301,35.204136],[119.139032,35.202338],[119.1354,35.191669],[119.149219,35.189298],[119.157274,35.18243],[119.164855,35.166525],[119.173146,35.1617],[119.163433,35.154134],[119.164223,35.143173],[119.174252,35.139042],[119.189967,35.138101],[119.196679,35.129919],[119.203233,35.110894],[119.171409,35.10717],[119.159011,35.100991],[119.138085,35.096285],[119.129477,35.076187],[119.120475,35.070088],[119.120396,35.05801],[119.114631,35.05498],[119.073647,35.056659],[119.061407,35.051581],[119.037401,35.051335],[119.00534,35.05412],[118.992152,35.048182],[118.965619,35.046462],[118.945166,35.040811],[118.928504,35.050885],[118.911131,35.047773],[118.903787,35.041343],[118.885782,35.034258],[118.86533,35.029834],[118.862487,35.025697],[118.865093,34.993208],[118.859249,34.962633],[118.86075,34.943979],[118.829715,34.911129],[118.805235,34.873055],[118.802471,34.845637],[118.768989,34.846129],[118.768278,34.838822],[118.78194,34.82749],[118.776649,34.818785],[118.779018,34.809627],[118.773569,34.795333],[118.756512,34.789541],[118.73756,34.792088],[118.728399,34.786871],[118.740166,34.781243],[118.738507,34.766862],[118.727215,34.768752],[118.716475,34.763821],[118.719239,34.745533],[118.730374,34.745451],[118.740087,34.736901],[118.759197,34.740847],[118.768515,34.738093],[118.78344,34.722061],[118.758723,34.703434],[118.739376,34.69377],[118.720108,34.694222],[118.704077,34.688752],[118.690258,34.678593],[118.681335,34.678346],[118.664357,34.693441],[118.650537,34.695086],[118.633717,34.687025],[118.604894,34.696484],[118.60134,34.714167],[118.570464,34.712522],[118.558934,34.706847],[118.546063,34.70619],[118.53935,34.711494],[118.525215,34.712563],[118.522688,34.692289],[118.508158,34.687066],[118.500814,34.675178],[118.484231,34.6709],[118.468437,34.674315],[118.460856,34.65757],[118.466463,34.643127],[118.474913,34.637201],[118.473807,34.623412],[118.46362,34.625265],[118.452881,34.617691],[118.439219,34.626294],[118.42382,34.591094],[118.428322,34.563253],[118.440956,34.52477],[118.439535,34.507996],[118.430928,34.489074],[118.421372,34.483219],[118.41624,34.473859],[118.411344,34.446391],[118.405342,34.437027],[118.404947,34.427744],[118.395155,34.427084],[118.379993,34.415531],[118.353223,34.41747],[118.352197,34.422834],[118.320925,34.421349],[118.290681,34.424567],[118.28918,34.412271],[118.279862,34.412188],[118.277414,34.404677],[118.242431,34.405709],[118.230981,34.398693],[118.220241,34.405957],[118.217714,34.379127],[118.204369,34.377352],[118.189602,34.380654],[118.183363,34.390355],[118.179336,34.379416],[118.170413,34.381356],[118.177125,34.408722],[118.178862,34.425186],[118.177757,34.453238],[118.139931,34.475344],[118.132824,34.483425],[118.141826,34.497154],[118.164964,34.504904],[118.16757,34.519701],[118.184706,34.544179],[118.163542,34.551471],[118.153671,34.549164],[118.140721,34.554025],[118.137167,34.563253],[118.126428,34.55522],[118.100447,34.564736],[118.078968,34.569761],[118.082363,34.579893],[118.102816,34.593441],[118.11474,34.614397],[118.113003,34.621437],[118.100526,34.626582],[118.094603,34.636583],[118.102658,34.647736],[118.084022,34.655924],[118.077783,34.653702],[118.05741,34.655019],[118.053935,34.650945],[118.02069,34.660409],[118.018242,34.647036],[118.007818,34.64753],[118.007423,34.65613],[117.99084,34.661726],[117.991708,34.670077],[117.96328,34.678552],[117.951672,34.678469],[117.939669,34.664852],[117.90974,34.67016],[117.903106,34.644567],[117.880995,34.645184],[117.877916,34.650205],[117.863465,34.645184],[117.849408,34.647201],[117.847513,34.652386],[117.834483,34.647324],[117.831798,34.653455],[117.820111,34.646172],[117.805818,34.646254],[117.819243,34.681842],[117.825639,34.684392],[117.831719,34.707793],[117.825244,34.713139],[117.823665,34.72868],[117.830061,34.740888],[117.830614,34.760246],[117.79958,34.768875],[117.784576,34.780667],[117.784023,34.79484],[117.77739,34.801248],[117.798632,34.810653],[117.803686,34.830734],[117.795315,34.835907],[117.763175,34.848839],[117.75291,34.857623],[117.742407,34.874163],[117.729298,34.876994],[117.715163,34.896238],[117.70466,34.906699],[117.698501,34.919989],[117.704265,34.933605],[117.712004,34.934999],[117.714689,34.947833],[117.724323,34.958329],[117.719506,34.968331],[117.726534,34.979561],[117.728035,35.008041],[117.737985,35.013203],[117.744618,35.022748],[117.736247,35.031514],[117.704423,35.031227],[117.707345,35.052318],[117.69321,35.06018],[117.676469,35.065543],[117.656885,35.077497],[117.650725,35.092724],[117.623007,35.113063],[117.604371,35.13401],[117.600344,35.135524],[117.591025,35.152539],[117.586208,35.152989],[117.58376,35.164317],[117.570336,35.168365],[117.556043,35.161291],[117.548462,35.161741],[117.528009,35.184351],[117.526825,35.200621],[117.507162,35.198986],[117.494843,35.205893],[117.480628,35.222771],[117.468073,35.228369],[117.448331,35.231842],[117.449752,35.246795],[117.439486,35.258927],[117.426456,35.261786],[117.419191,35.273997]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371400,\"name\":\"德州市\",\"center\":[116.307428,37.453968],\"centroid\":[116.653994,37.251363],\"childrenNum\":11,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":12,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.768684,36.921014],[115.761972,36.924413],[115.762683,36.939327],[115.772791,36.936849],[115.788189,36.9526],[115.796876,36.968747],[115.791743,36.975261],[115.784478,36.970625],[115.786373,36.983093],[115.776265,36.990884],[115.790874,37.005985],[115.808089,37.010259],[115.813222,37.019126],[115.812354,37.02895],[115.825778,37.032384],[115.831938,37.045281],[115.85626,37.06073],[115.855154,37.071108],[115.865025,37.070828],[115.868263,37.084038],[115.879476,37.105583],[115.885399,37.128757],[115.879397,37.138647],[115.87995,37.152004],[115.892269,37.157625],[115.912485,37.178751],[115.904825,37.189391],[115.9098,37.206803],[115.920145,37.214173],[115.920934,37.223534],[115.926778,37.219511],[115.941387,37.227716],[115.953232,37.223693],[115.969421,37.239464],[115.971079,37.245636],[115.963972,37.250096],[115.972895,37.257103],[115.966973,37.265742],[115.975185,37.268967],[115.976212,37.276171],[115.96871,37.28632],[115.970763,37.295553],[115.981503,37.30737],[115.984346,37.319265],[115.975659,37.317515],[115.972974,37.324039],[115.984503,37.326067],[115.975738,37.337283],[115.986951,37.341738],[116.009457,37.343169],[116.000376,37.350804],[116.013643,37.349571],[116.024461,37.359949],[116.031252,37.356411],[116.051942,37.357484],[116.056206,37.369053],[116.072474,37.368099],[116.087557,37.373307],[116.106588,37.368815],[116.116459,37.374301],[116.126646,37.373466],[116.168814,37.384118],[116.18524,37.369928],[116.195506,37.365674],[116.234437,37.361221],[116.251652,37.376566],[116.261602,37.389802],[116.270446,37.389126],[116.273052,37.398425],[116.282923,37.401326],[116.270446,37.413802],[116.275026,37.418252],[116.263023,37.422423],[116.270999,37.426714],[116.250072,37.425919],[116.247151,37.422066],[116.231515,37.424529],[116.22733,37.434261],[116.243123,37.448201],[116.243597,37.455904],[116.229936,37.459676],[116.224803,37.479963],[116.235068,37.479725],[116.241307,37.491434],[116.258285,37.482662],[116.256469,37.478812],[116.276448,37.466902],[116.271473,37.478931],[116.290899,37.484766],[116.286082,37.491117],[116.292952,37.497387],[116.284344,37.500721],[116.297532,37.508816],[116.280317,37.510879],[116.283555,37.517584],[116.278422,37.524765],[116.291373,37.523813],[116.286082,37.532619],[116.291373,37.545589],[116.287898,37.549317],[116.299348,37.55935],[116.299664,37.56958],[116.304481,37.564505],[116.334805,37.574773],[116.319406,37.580046],[116.33591,37.581235],[116.344913,37.570492],[116.343491,37.566011],[116.367655,37.566289],[116.375473,37.560341],[116.376895,37.546581],[116.367892,37.533809],[116.368919,37.526392],[116.382738,37.523615],[116.388661,37.516315],[116.402164,37.509847],[116.414089,37.490997],[116.434146,37.473334],[116.438648,37.477224],[116.446702,37.500562],[116.46218,37.517426],[116.482633,37.52179],[116.49969,37.537855],[116.507113,37.541822],[116.51959,37.559905],[116.538463,37.56843],[116.545807,37.582504],[116.563496,37.596495],[116.556547,37.596852],[116.580316,37.613258],[116.60448,37.625105],[116.630776,37.652713],[116.640884,37.666454],[116.636462,37.675877],[116.641042,37.68233],[116.646412,37.676233],[116.653677,37.67754],[116.664022,37.687793],[116.675235,37.720838],[116.679736,37.72879],[116.69932,37.73065],[116.698768,37.738759],[116.709586,37.735199],[116.724511,37.744297],[116.718826,37.762331],[116.723169,37.766721],[116.73912,37.756914],[116.744174,37.757349],[116.753808,37.770517],[116.75365,37.793011],[116.74599,37.795778],[116.758941,37.801865],[116.766838,37.81135],[116.786185,37.826326],[116.788159,37.843432],[116.794556,37.846987],[116.811771,37.847935],[116.812718,37.84359],[116.828038,37.840627],[116.843753,37.834465],[116.879604,37.843748],[116.919325,37.84592],[116.950359,37.839719],[116.976656,37.841062],[117.008874,37.833872],[117.027195,37.832371],[117.040541,37.839324],[117.074339,37.848725],[117.093765,37.849515],[117.150148,37.8396],[117.163651,37.839798],[117.185368,37.849791],[117.208821,37.843748],[117.259755,37.838257],[117.271364,37.839916],[117.284472,37.84675],[117.302951,37.852358],[117.320166,37.861402],[117.344251,37.862666],[117.364704,37.854136],[117.381919,37.854531],[117.40632,37.843511],[117.423614,37.847263],[117.438539,37.853859],[117.466809,37.890739],[117.481181,37.914854],[117.49271,37.927481],[117.512847,37.943459],[117.520902,37.966729],[117.524377,37.989479],[117.541039,38.011237],[117.54933,38.010252],[117.563545,37.998585],[117.570652,37.957264],[117.567809,37.946772],[117.529036,37.932295],[117.539302,37.913552],[117.542776,37.890146],[117.547198,37.883198],[117.568835,37.882409],[117.580602,37.875302],[117.581076,37.858993],[117.595685,37.853504],[117.606582,37.845209],[117.605003,37.838968],[117.59529,37.834741],[117.588025,37.82273],[117.56623,37.812733],[117.568599,37.804987],[117.559912,37.800008],[117.546567,37.776368],[117.547356,37.767512],[117.526509,37.762964],[117.522165,37.755371],[117.531563,37.748213],[117.544119,37.747699],[117.547198,37.737494],[117.542618,37.726258],[117.556201,37.716683],[117.539775,37.713993],[117.543092,37.703625],[117.531247,37.688901],[117.506451,37.686803],[117.50345,37.680548],[117.488604,37.677025],[117.477075,37.654416],[117.465625,37.655564],[117.451963,37.669978],[117.444224,37.671918],[117.428825,37.665741],[117.415401,37.669582],[117.407188,37.678846],[117.392974,37.660039],[117.373074,37.648594],[117.363835,37.649624],[117.357596,37.658495],[117.358149,37.672947],[117.363598,37.679559],[117.36573,37.698361],[117.352543,37.707345],[117.344567,37.693136],[117.347489,37.683319],[117.329405,37.673343],[117.318428,37.662019],[117.312506,37.64194],[117.304925,37.640514],[117.312585,37.633701],[117.317797,37.615081],[117.314875,37.600458],[117.308321,37.589956],[117.288973,37.577112],[117.280682,37.56621],[117.277681,37.545391],[117.273417,37.532619],[117.260861,37.530081],[117.238197,37.532897],[117.230063,37.528891],[117.22114,37.51318],[117.199345,37.487148],[117.176049,37.486116],[117.163809,37.478971],[117.135618,37.475239],[117.124878,37.483853],[117.109795,37.47901],[117.098819,37.469721],[117.104978,37.455309],[117.096845,37.440099],[117.085631,37.437517],[117.029406,37.435174],[117.018193,37.418967],[117.019693,37.405419],[117.008164,37.392464],[116.99924,37.376964],[117.009664,37.359671],[117.006663,37.355138],[116.987158,37.342692],[116.986684,37.335335],[116.993397,37.32201],[117.002241,37.285962],[117.024273,37.278918],[117.038961,37.266538],[117.030275,37.264229],[117.032328,37.253241],[117.041251,37.247667],[117.042673,37.238867],[117.036592,37.237393],[117.03596,37.224091],[117.022299,37.215089],[117.037777,37.207361],[117.037382,37.195169],[117.045358,37.197161],[117.05744,37.192141],[117.06352,37.182656],[117.061783,37.16496],[117.050648,37.160894],[117.054676,37.141717],[117.059809,37.137251],[117.047411,37.134739],[117.044884,37.122615],[117.024273,37.119664],[117.004531,37.121219],[116.982578,37.113601],[116.931486,37.100477],[116.919009,37.093056],[116.91972,37.081364],[116.925247,37.069831],[116.928643,37.05103],[116.944279,37.042327],[116.948701,37.036537],[116.943173,37.030907],[116.907796,37.019046],[116.891607,37.00271],[116.875024,36.999274],[116.885764,36.991444],[116.886158,36.983573],[116.899188,36.977499],[116.897767,36.962712],[116.907717,36.963272],[116.933381,36.959595],[116.931881,36.946204],[116.935434,36.93457],[116.922563,36.93453],[116.934408,36.925973],[116.957466,36.916495],[116.963152,36.893896],[116.96181,36.867529],[116.962836,36.842674],[116.948069,36.839231],[116.9442,36.844916],[116.934724,36.845116],[116.935908,36.829743],[116.933223,36.823697],[116.919404,36.822776],[116.892476,36.830023],[116.887106,36.833427],[116.882447,36.824058],[116.887975,36.811404],[116.872813,36.812004],[116.868233,36.801872],[116.865548,36.777877],[116.87076,36.759164],[116.883868,36.758243],[116.88679,36.745538],[116.873997,36.739846],[116.861757,36.730345],[116.842489,36.72786],[116.830881,36.723851],[116.802768,36.706729],[116.799689,36.694417],[116.780657,36.691048],[116.780736,36.671552],[116.777262,36.660718],[116.763126,36.651971],[116.759494,36.632746],[116.742042,36.620381],[116.71314,36.608858],[116.693319,36.607895],[116.694345,36.591149],[116.682421,36.580586],[116.661258,36.578376],[116.662916,36.563111],[116.658968,36.553026],[116.646728,36.544105],[116.629592,36.544587],[116.622801,36.532651],[116.60835,36.52011],[116.610087,36.51609],[116.627223,36.508853],[116.624301,36.497233],[116.602032,36.495223],[116.593267,36.485973],[116.595636,36.480383],[116.613009,36.473425],[116.611429,36.459104],[116.620905,36.44144],[116.6198,36.428522],[116.612377,36.42333],[116.591213,36.416286],[116.546202,36.40892],[116.549518,36.417333],[116.535857,36.41842],[116.539647,36.427597],[116.527092,36.424337],[116.511851,36.430012],[116.512798,36.441239],[116.507271,36.447999],[116.489345,36.454477],[116.481685,36.448361],[116.461548,36.449971],[116.455705,36.46192],[116.459258,36.47978],[116.445676,36.488587],[116.443544,36.498319],[116.431304,36.500611],[116.412983,36.519145],[116.400901,36.524813],[116.399322,36.540126],[116.403507,36.564878],[116.410298,36.593237],[116.411325,36.615242],[116.406034,36.631983],[116.41322,36.643181],[116.411246,36.676647],[116.40706,36.689042],[116.407139,36.704804],[116.397584,36.715431],[116.393399,36.731708],[116.401849,36.74634],[116.405639,36.761208],[116.396242,36.792459],[116.376026,36.797025],[116.391978,36.802913],[116.397663,36.809441],[116.409193,36.807038],[116.408008,36.815729],[116.399874,36.823857],[116.409587,36.83759],[116.407218,36.846717],[116.415352,36.855923],[116.412746,36.861086],[116.429645,36.865208],[116.434146,36.876453],[116.419537,36.877213],[116.415905,36.881374],[116.422143,36.890536],[116.417958,36.894297],[116.421591,36.905257],[116.433988,36.908417],[116.447966,36.899977],[116.452467,36.906417],[116.449308,36.915496],[116.439911,36.916495],[116.444728,36.923694],[116.443149,36.932211],[116.461548,36.940687],[116.470551,36.940007],[116.471103,36.947043],[116.458074,36.955358],[116.442675,36.954319],[116.434383,36.968228],[116.405876,36.969067],[116.379343,36.966309],[116.370261,36.963272],[116.366471,36.971864],[116.341359,36.980256],[116.340175,36.971944],[116.324065,36.972024],[116.317037,36.981854],[116.304955,36.990245],[116.30535,36.994999],[116.290741,36.995759],[116.26784,37.010499],[116.254731,37.008262],[116.247624,37.019685],[116.250388,37.025476],[116.232857,37.032225],[116.225592,37.025396],[116.222276,37.010339],[116.235779,37.010139],[116.229225,36.996438],[116.211694,36.990085],[116.212089,36.982454],[116.219196,36.979617],[116.210588,36.970146],[116.211536,36.963112],[116.191478,36.963312],[116.18366,36.959595],[116.172842,36.947723],[116.173237,36.929692],[116.164392,36.916975],[116.146388,36.910776],[116.123724,36.890656],[116.114958,36.897697],[116.097349,36.891336],[116.098217,36.883895],[116.082424,36.883855],[116.075948,36.889496],[116.061892,36.888576],[116.050126,36.894497],[116.005667,36.884375],[115.947704,36.888576],[115.920461,36.892976],[115.894796,36.905657],[115.885241,36.907017],[115.881687,36.917575],[115.875844,36.916255],[115.868421,36.901457],[115.853733,36.904777],[115.85855,36.908337],[115.85397,36.916215],[115.848995,36.912656],[115.832964,36.918575],[115.83178,36.910856],[115.823251,36.913496],[115.81875,36.908577],[115.813064,36.913416],[115.791348,36.914336],[115.779819,36.904977],[115.780293,36.912216],[115.768684,36.921014]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371500,\"name\":\"聊城市\",\"center\":[115.980367,36.456013],\"centroid\":[115.887733,36.460089],\"childrenNum\":8,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":13,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.768684,36.921014],[115.780293,36.912216],[115.779819,36.904977],[115.791348,36.914336],[115.813064,36.913416],[115.81875,36.908577],[115.823251,36.913496],[115.83178,36.910856],[115.832964,36.918575],[115.848995,36.912656],[115.85397,36.916215],[115.85855,36.908337],[115.853733,36.904777],[115.868421,36.901457],[115.875844,36.916255],[115.881687,36.917575],[115.885241,36.907017],[115.894796,36.905657],[115.920461,36.892976],[115.947704,36.888576],[116.005667,36.884375],[116.050126,36.894497],[116.061892,36.888576],[116.075948,36.889496],[116.082424,36.883855],[116.098217,36.883895],[116.097349,36.891336],[116.114958,36.897697],[116.123724,36.890656],[116.146388,36.910776],[116.164392,36.916975],[116.173237,36.929692],[116.172842,36.947723],[116.18366,36.959595],[116.191478,36.963312],[116.211536,36.963112],[116.210588,36.970146],[116.219196,36.979617],[116.212089,36.982454],[116.211694,36.990085],[116.229225,36.996438],[116.235779,37.010139],[116.222276,37.010339],[116.225592,37.025396],[116.232857,37.032225],[116.250388,37.025476],[116.247624,37.019685],[116.254731,37.008262],[116.26784,37.010499],[116.290741,36.995759],[116.30535,36.994999],[116.304955,36.990245],[116.317037,36.981854],[116.324065,36.972024],[116.340175,36.971944],[116.341359,36.980256],[116.366471,36.971864],[116.370261,36.963272],[116.379343,36.966309],[116.405876,36.969067],[116.434383,36.968228],[116.442675,36.954319],[116.458074,36.955358],[116.471103,36.947043],[116.470551,36.940007],[116.461548,36.940687],[116.443149,36.932211],[116.444728,36.923694],[116.439911,36.916495],[116.449308,36.915496],[116.452467,36.906417],[116.447966,36.899977],[116.433988,36.908417],[116.421591,36.905257],[116.417958,36.894297],[116.422143,36.890536],[116.415905,36.881374],[116.419537,36.877213],[116.434146,36.876453],[116.429645,36.865208],[116.412746,36.861086],[116.415352,36.855923],[116.407218,36.846717],[116.409587,36.83759],[116.399874,36.823857],[116.408008,36.815729],[116.409193,36.807038],[116.397663,36.809441],[116.391978,36.802913],[116.376026,36.797025],[116.396242,36.792459],[116.405639,36.761208],[116.401849,36.74634],[116.393399,36.731708],[116.397584,36.715431],[116.407139,36.704804],[116.40706,36.689042],[116.411246,36.676647],[116.41322,36.643181],[116.406034,36.631983],[116.411325,36.615242],[116.410298,36.593237],[116.403507,36.564878],[116.399322,36.540126],[116.400901,36.524813],[116.412983,36.519145],[116.431304,36.500611],[116.443544,36.498319],[116.445676,36.488587],[116.459258,36.47978],[116.455705,36.46192],[116.461548,36.449971],[116.481685,36.448361],[116.489345,36.454477],[116.507271,36.447999],[116.512798,36.441239],[116.511851,36.430012],[116.527092,36.424337],[116.539647,36.427597],[116.535857,36.41842],[116.549518,36.417333],[116.546202,36.40892],[116.528592,36.387259],[116.519984,36.384158],[116.503717,36.369982],[116.484607,36.336948],[116.449071,36.337149],[116.441411,36.321755],[116.430593,36.318007],[116.406745,36.319015],[116.374526,36.3039],[116.331251,36.290677],[116.322644,36.284669],[116.310799,36.270515],[116.307166,36.259464],[116.28624,36.239174],[116.280159,36.221945],[116.255047,36.203703],[116.234911,36.180935],[116.226066,36.173748],[116.213036,36.169831],[116.169446,36.171325],[116.164392,36.168862],[116.164313,36.146084],[116.123882,36.136429],[116.114011,36.122047],[116.099323,36.112066],[116.057391,36.104913],[116.028804,36.072292],[116.016406,36.061375],[115.989794,36.045442],[115.964051,36.0416],[115.935859,36.031447],[115.919276,36.019675],[115.895981,36.026188],[115.869447,36.015346],[115.859655,36.003693],[115.846231,36.004987],[115.837465,36.011016],[115.81725,36.012756],[115.797508,36.00697],[115.779819,35.993778],[115.786689,35.991228],[115.774528,35.981878],[115.774686,35.974511],[115.764341,35.970989],[115.73307,35.96682],[115.717908,35.971394],[115.698719,35.96605],[115.686953,35.9552],[115.68411,35.944388],[115.675423,35.938435],[115.651812,35.928917],[115.642415,35.920046],[115.607353,35.925839],[115.583742,35.921707],[115.548206,35.898006],[115.513302,35.890348],[115.504932,35.8991],[115.510775,35.908014],[115.505406,35.914415],[115.490717,35.908379],[115.495377,35.896021],[115.488033,35.880784],[115.460078,35.867732],[115.433861,35.839069],[115.432834,35.833878],[115.417909,35.824996],[115.407564,35.80865],[115.370923,35.788852],[115.3635,35.779925],[115.334993,35.796723],[115.335704,35.814329],[115.344074,35.838744],[115.349602,35.860963],[115.338152,35.864692],[115.3436,35.87215],[115.354893,35.869273],[115.36429,35.894035],[115.367449,35.92033],[115.364132,35.929484],[115.354182,35.937503],[115.356472,35.954633],[115.363105,35.972002],[115.386322,35.974471],[115.395956,35.991673],[115.419646,36.004745],[115.4431,36.008872],[115.447522,36.011826],[115.448865,36.047383],[115.441599,36.055755],[115.459604,36.063357],[115.455103,36.071282],[115.459762,36.080378],[115.466395,36.079691],[115.468843,36.092222],[115.473976,36.098123],[115.484242,36.125845],[115.48519,36.139702],[115.480689,36.171729],[115.47595,36.193046],[115.479109,36.209555],[115.47595,36.218878],[115.476503,36.246516],[115.465369,36.250389],[115.467817,36.267894],[115.462684,36.27612],[115.446101,36.273782],[115.436388,36.276362],[115.428491,36.286201],[115.41704,36.292773],[115.422963,36.30261],[115.41941,36.310914],[115.422963,36.322199],[115.414987,36.326551],[115.394614,36.322602],[115.366659,36.308938],[115.359789,36.318733],[115.370449,36.332757],[115.368712,36.342629],[115.349602,36.363094],[115.348575,36.384641],[115.339968,36.39809],[115.324885,36.405095],[115.313514,36.406625],[115.297404,36.413469],[115.312092,36.433593],[115.316909,36.432587],[115.317067,36.454035],[115.300247,36.465902],[115.291403,36.460592],[115.288876,36.470006],[115.293693,36.476079],[115.28469,36.476441],[115.283506,36.486416],[115.276083,36.486938],[115.272845,36.497394],[115.289744,36.497796],[115.296536,36.508853],[115.292587,36.514401],[115.295193,36.523205],[115.288323,36.528511],[115.295035,36.533254],[115.300484,36.525938],[115.307433,36.527426],[115.331281,36.550213],[115.334282,36.582473],[115.337836,36.58898],[115.35055,36.590065],[115.351576,36.595004],[115.340363,36.595245],[115.341468,36.603478],[115.350707,36.60665],[115.345022,36.612392],[115.35513,36.627407],[115.366027,36.621947],[115.378504,36.632866],[115.38798,36.646432],[115.386322,36.656305],[115.406459,36.663246],[115.412144,36.676486],[115.420594,36.686756],[115.446653,36.694617],[115.451391,36.702197],[115.450523,36.713626],[115.459762,36.717395],[115.460947,36.731869],[115.475477,36.744215],[115.478398,36.758804],[115.491428,36.761609],[115.506511,36.770465],[115.523568,36.763853],[115.52878,36.77395],[115.536835,36.772628],[115.53873,36.784127],[115.54947,36.782885],[115.552628,36.775874],[115.561315,36.775753],[115.560525,36.783806],[115.572133,36.775353],[115.584689,36.781042],[115.63744,36.797506],[115.650469,36.807519],[115.666184,36.812485],[115.671554,36.809281],[115.684189,36.812966],[115.692243,36.829343],[115.688532,36.840312],[115.700772,36.860726],[115.699982,36.866929],[115.711275,36.882374],[115.726121,36.893616],[115.735202,36.897017],[115.740572,36.906417],[115.757787,36.903017],[115.765131,36.909096],[115.768684,36.921014]]],[[[115.495377,35.896021],[115.504932,35.8991],[115.513302,35.890348],[115.503431,35.888686],[115.488033,35.880784],[115.495377,35.896021]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371600,\"name\":\"滨州市\",\"center\":[118.016974,37.383542],\"centroid\":[117.847396,37.542717],\"childrenNum\":7,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":14,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[117.273417,37.532619],[117.277681,37.545391],[117.280682,37.56621],[117.288973,37.577112],[117.308321,37.589956],[117.314875,37.600458],[117.317797,37.615081],[117.312585,37.633701],[117.304925,37.640514],[117.312506,37.64194],[117.318428,37.662019],[117.329405,37.673343],[117.347489,37.683319],[117.344567,37.693136],[117.352543,37.707345],[117.36573,37.698361],[117.363598,37.679559],[117.358149,37.672947],[117.357596,37.658495],[117.363835,37.649624],[117.373074,37.648594],[117.392974,37.660039],[117.407188,37.678846],[117.415401,37.669582],[117.428825,37.665741],[117.444224,37.671918],[117.451963,37.669978],[117.465625,37.655564],[117.477075,37.654416],[117.488604,37.677025],[117.50345,37.680548],[117.506451,37.686803],[117.531247,37.688901],[117.543092,37.703625],[117.539775,37.713993],[117.556201,37.716683],[117.542618,37.726258],[117.547198,37.737494],[117.544119,37.747699],[117.531563,37.748213],[117.522165,37.755371],[117.526509,37.762964],[117.547356,37.767512],[117.546567,37.776368],[117.559912,37.800008],[117.568599,37.804987],[117.56623,37.812733],[117.588025,37.82273],[117.59529,37.834741],[117.605003,37.838968],[117.606582,37.845209],[117.595685,37.853504],[117.581076,37.858993],[117.580602,37.875302],[117.568835,37.882409],[117.547198,37.883198],[117.542776,37.890146],[117.539302,37.913552],[117.529036,37.932295],[117.567809,37.946772],[117.570652,37.957264],[117.563545,37.998585],[117.54933,38.010252],[117.541039,38.011237],[117.545935,38.026842],[117.560386,38.040987],[117.556517,38.057215],[117.564887,38.063674],[117.57618,38.065132],[117.58376,38.070645],[117.605082,38.073008],[117.616769,38.06903],[117.644961,38.072377],[117.666045,38.072535],[117.679469,38.079544],[117.704502,38.07604],[117.729219,38.093796],[117.730641,38.108321],[117.743197,38.123393],[117.768782,38.131893],[117.772099,38.138817],[117.766966,38.158682],[117.771704,38.166076],[117.79421,38.167846],[117.801317,38.175239],[117.789235,38.180744],[117.796105,38.1936],[117.797842,38.207712],[117.805897,38.217734],[117.808582,38.228383],[117.823586,38.235652],[117.847513,38.25392],[117.860859,38.274578],[117.895683,38.301629],[117.893393,38.287968],[117.89671,38.279605],[117.935404,38.255098],[117.997631,38.211918],[118.018794,38.202641],[118.033009,38.205904],[118.04517,38.214001],[118.112134,38.210227],[118.177915,38.186406],[118.216846,38.146921],[118.245432,38.144286],[118.236272,38.125754],[118.227664,38.119262],[118.241247,38.112138],[118.245511,38.103322],[118.235324,38.082969],[118.226638,38.079583],[118.230665,38.056743],[118.227585,38.037874],[118.2234,38.00095],[118.22956,37.986444],[118.220873,37.98258],[118.223479,37.959788],[118.213529,37.95541],[118.215503,37.949376],[118.224742,37.950559],[118.226954,37.939672],[118.225611,37.923417],[118.232718,37.922509],[118.235403,37.905343],[118.243142,37.895673],[118.236588,37.884501],[118.239115,37.868708],[118.248749,37.858164],[118.247643,37.871788],[118.258146,37.854886],[118.258304,37.844182],[118.269754,37.853109],[118.286337,37.8569],[118.301657,37.870208],[118.313265,37.861521],[118.328111,37.865272],[118.340193,37.838059],[118.334271,37.832134],[118.346116,37.832371],[118.344932,37.824627],[118.356382,37.820834],[118.352355,37.814274],[118.36191,37.792063],[118.348406,37.790719],[118.340588,37.774391],[118.340667,37.763913],[118.353065,37.75814],[118.353697,37.750151],[118.341931,37.74667],[118.337509,37.729502],[118.31753,37.728395],[118.319425,37.712924],[118.316187,37.714151],[118.3045,37.690722],[118.305132,37.683122],[118.294076,37.678529],[118.293129,37.670096],[118.2846,37.662058],[118.260989,37.654614],[118.246459,37.658376],[118.239431,37.65596],[118.22569,37.663682],[118.207449,37.661583],[118.200657,37.667404],[118.195445,37.661742],[118.177125,37.657623],[118.172545,37.644079],[118.165596,37.644633],[118.163542,37.63069],[118.154935,37.628036],[118.157462,37.62035],[118.154935,37.605491],[118.146722,37.599943],[118.148696,37.594078],[118.134877,37.590035],[118.127612,37.578103],[118.131324,37.571285],[118.13922,37.571364],[118.134166,37.558478],[118.141431,37.556297],[118.173176,37.563593],[118.176098,37.557129],[118.173255,37.546858],[118.159831,37.539164],[118.156988,37.530358],[118.150987,37.530517],[118.142537,37.518933],[118.136772,37.516791],[118.139378,37.507427],[118.134245,37.507387],[118.135035,37.496752],[118.127849,37.491831],[118.128481,37.483694],[118.120426,37.480757],[118.112766,37.463528],[118.125322,37.45912],[118.118531,37.456182],[118.114898,37.439742],[118.136141,37.441688],[118.14996,37.438351],[118.163937,37.416742],[118.165596,37.4082],[118.160147,37.399618],[118.16141,37.389961],[118.144037,37.392822],[118.135509,37.384834],[118.141668,37.376487],[118.154935,37.377401],[118.156198,37.364322],[118.161015,37.362573],[118.202,37.382409],[118.216925,37.385191],[118.217951,37.371478],[118.222768,37.367861],[118.245353,37.367781],[118.245827,37.376646],[118.258541,37.37911],[118.262015,37.364283],[118.273624,37.360029],[118.286495,37.362772],[118.291865,37.358518],[118.287285,37.352434],[118.315398,37.352514],[118.31524,37.31477],[118.319741,37.305978],[118.326058,37.306535],[118.325584,37.296866],[118.342168,37.295075],[118.342168,37.287076],[118.355197,37.286997],[118.358277,37.280669],[118.368069,37.279594],[118.36262,37.273783],[118.372096,37.273703],[118.375729,37.258497],[118.368385,37.258576],[118.36033,37.244561],[118.350459,37.243765],[118.346669,37.233252],[118.3642,37.210189],[118.375966,37.206126],[118.376598,37.196962],[118.383389,37.190587],[118.387574,37.177834],[118.380467,37.175164],[118.377545,37.154157],[118.366569,37.146781],[118.361594,37.148495],[118.356224,37.139325],[118.347616,37.139803],[118.340667,37.131748],[118.346116,37.123931],[118.338219,37.123134],[118.349354,37.101753],[118.338298,37.10311],[118.338851,37.093894],[118.332928,37.081923],[118.338535,37.072265],[118.337588,37.053904],[118.324558,37.046279],[118.3259,37.035459],[118.310186,37.028231],[118.308212,37.019885],[118.28997,37.00946],[118.288785,36.999993],[118.271412,37.006744],[118.262568,37.00271],[118.250802,37.002949],[118.247327,36.98613],[118.235087,36.98557],[118.231376,36.974822],[118.222531,36.967109],[118.209739,36.963152],[118.195209,36.967348],[118.192918,36.977739],[118.160936,36.981934],[118.161331,36.988567],[118.15146,36.988527],[118.153198,37.000512],[118.138983,37.005985],[118.139299,37.014693],[118.134008,37.025955],[118.139299,37.033103],[118.139615,37.044363],[118.15146,37.047038],[118.150829,37.054743],[118.15762,37.057776],[118.156909,37.065281],[118.13622,37.06536],[118.136062,37.077773],[118.130455,37.091101],[118.115925,37.100636],[118.111187,37.094652],[118.086075,37.091899],[118.063016,37.082841],[118.056857,37.093654],[118.045959,37.098202],[118.045485,37.105982],[118.057252,37.106141],[118.068623,37.115875],[118.079679,37.120781],[118.065069,37.139564],[118.059858,37.151087],[118.062385,37.162528],[118.074467,37.170341],[118.071545,37.177675],[118.082995,37.185605],[118.077941,37.188953],[118.074072,37.204094],[118.064122,37.21007],[118.048012,37.205568],[118.046275,37.216324],[118.036799,37.220905],[118.022348,37.2221],[118.019584,37.210309],[118.010898,37.20756],[117.994393,37.212699],[117.984364,37.210349],[117.98089,37.218674],[117.973862,37.216483],[117.981048,37.238429],[117.996446,37.246273],[117.990761,37.248981],[117.990603,37.262358],[117.963833,37.271753],[117.947013,37.262159],[117.948829,37.26829],[117.941327,37.280549],[117.909266,37.265065],[117.888497,37.262319],[117.8776,37.273027],[117.850909,37.28246],[117.83859,37.282659],[117.818848,37.276012],[117.782128,37.248702],[117.773678,37.244959],[117.760333,37.244959],[117.729851,37.249101],[117.693447,37.257661],[117.675995,37.270121],[117.659491,37.274101],[117.644329,37.265862],[117.63043,37.247269],[117.627193,37.228074],[117.615348,37.212699],[117.598212,37.203058],[117.592052,37.169624],[117.586366,37.160216],[117.574284,37.151366],[117.551305,37.146781],[117.557464,37.124211],[117.574442,37.12106],[117.576969,37.114758],[117.567888,37.11029],[117.575074,37.089185],[117.590946,37.084996],[117.608477,37.090622],[117.619375,37.090103],[117.644645,37.083878],[117.673942,37.073143],[117.703002,37.068673],[117.726692,37.068753],[117.739801,37.064921],[117.761991,37.065839],[117.771783,37.069032],[117.800369,37.070789],[117.847355,37.065959],[117.840327,37.035539],[117.841827,37.026354],[117.865992,37.023719],[117.870493,37.013375],[117.866386,37.007024],[117.866623,36.993282],[117.870493,36.985451],[117.906581,36.981695],[117.911951,36.975141],[117.910292,36.962592],[117.913372,36.953679],[117.931772,36.941886],[117.936115,36.93489],[117.935404,36.915736],[117.94338,36.930012],[117.949145,36.918375],[117.96178,36.922494],[117.960674,36.910376],[117.950645,36.902137],[117.9403,36.901177],[117.940616,36.891616],[117.929719,36.890216],[117.9189,36.880094],[117.917005,36.86973],[117.891814,36.871811],[117.891103,36.864408],[117.875152,36.861246],[117.865597,36.866529],[117.856594,36.859926],[117.832825,36.859966],[117.828008,36.855883],[117.831877,36.836629],[117.822085,36.825139],[117.820901,36.801511],[117.814662,36.797306],[117.815531,36.788573],[117.824297,36.787933],[117.825639,36.775834],[117.840327,36.777516],[117.850672,36.764735],[117.852488,36.750708],[117.832983,36.744816],[117.834404,36.751871],[117.826429,36.763011],[117.820743,36.756359],[117.810161,36.734394],[117.795157,36.719761],[117.793025,36.707451],[117.78197,36.70304],[117.777942,36.695219],[117.754173,36.696944],[117.725666,36.695219],[117.718006,36.697826],[117.71848,36.704724],[117.739959,36.721004],[117.736642,36.729423],[117.747303,36.748584],[117.724165,36.755998],[117.695974,36.754115],[117.687603,36.763853],[117.677811,36.783245],[117.648119,36.805436],[117.608556,36.821815],[117.580523,36.85136],[117.577364,36.862847],[117.579891,36.878093],[117.585024,36.886815],[117.58376,36.894176],[117.56923,36.915736],[117.534248,36.931611],[117.539538,36.941486],[117.551305,36.93385],[117.553674,36.940727],[117.56465,36.945084],[117.56544,36.959954],[117.54933,36.96507],[117.555253,36.970785],[117.549094,36.979817],[117.536854,36.978498],[117.519875,36.957117],[117.509847,36.969267],[117.494527,36.972344],[117.476522,36.968348],[117.477628,36.961154],[117.458754,36.957676],[117.444461,36.958116],[117.432853,36.954878],[117.415322,36.964311],[117.40403,36.955038],[117.391632,36.952],[117.378286,36.956997],[117.365335,36.99496],[117.35349,37.003349],[117.328457,37.011218],[117.317323,37.020923],[117.315349,37.030547],[117.326088,37.036178],[117.33667,37.046838],[117.339434,37.056419],[117.336433,37.073941],[117.365256,37.069272],[117.391158,37.083479],[117.409241,37.089425],[117.442092,37.093574],[117.459781,37.109931],[117.455596,37.11767],[117.4507,37.143711],[117.4507,37.153957],[117.444066,37.156868],[117.442724,37.170859],[117.436091,37.184251],[117.417928,37.20003],[117.404977,37.21716],[117.402371,37.224808],[117.408768,37.239703],[117.429141,37.239783],[117.424403,37.243367],[117.431037,37.254396],[117.443908,37.250056],[117.438302,37.25786],[117.43688,37.27235],[117.432379,37.272032],[117.430168,37.285166],[117.417612,37.296587],[117.411611,37.308604],[117.409163,37.329488],[117.41319,37.342255],[117.415401,37.364203],[117.401029,37.379071],[117.368652,37.396399],[117.360202,37.405697],[117.368257,37.419563],[117.369758,37.436048],[117.353332,37.450901],[117.309189,37.447486],[117.295449,37.4538],[117.307768,37.46194],[117.304609,37.466069],[117.283998,37.471587],[117.285894,37.479328],[117.312585,37.487068],[117.317718,37.499371],[117.307215,37.507744],[117.286525,37.510046],[117.284393,37.522266],[117.275549,37.526193],[117.273417,37.532619]]],[[[118.40779,38.026212],[118.410001,38.053277],[118.419319,38.053119],[118.419951,38.025503],[118.40779,38.026212]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":371700,\"name\":\"菏泽市\",\"center\":[115.469381,35.246531],\"centroid\":[115.698013,35.152536],\"childrenNum\":9,\"level\":\"city\",\"parent\":{\"adcode\":370000},\"subFeatureIndex\":15,\"acroutes\":[100000,370000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.409745,34.852944],[116.40635,34.82014],[116.403191,34.756301],[116.371525,34.750136],[116.365681,34.742779],[116.36197,34.723705],[116.382896,34.716264],[116.39182,34.710343],[116.392688,34.703887],[116.385502,34.694716],[116.385186,34.686696],[116.378079,34.684146],[116.378237,34.66802],[116.364418,34.651851],[116.37421,34.639958],[116.356521,34.629504],[116.331014,34.624977],[116.325171,34.620572],[116.323591,34.607687],[116.318064,34.601017],[116.301086,34.607769],[116.286082,34.608799],[116.278659,34.602129],[116.277079,34.586029],[116.256627,34.580634],[116.249204,34.571614],[116.240754,34.552377],[116.23341,34.555137],[116.216906,34.575115],[116.199059,34.577463],[116.190136,34.570502],[116.156653,34.553737],[116.146861,34.553201],[116.134542,34.55971],[116.124829,34.572314],[116.11788,34.589776],[116.101297,34.605793],[116.082661,34.608305],[116.055101,34.595417],[116.03757,34.593029],[116.023908,34.601964],[116.010168,34.615838],[116.001561,34.619049],[115.991374,34.615344],[115.98474,34.607234],[115.98403,34.589282],[115.969973,34.582611],[115.946204,34.581622],[115.858313,34.569967],[115.849705,34.565601],[115.838097,34.567784],[115.838808,34.560575],[115.827436,34.558268],[115.802404,34.572479],[115.795928,34.578492],[115.762051,34.587717],[115.718224,34.591094],[115.711433,34.59867],[115.699114,34.598876],[115.697297,34.569019],[115.684426,34.555591],[115.669422,34.55695],[115.643599,34.567701],[115.639493,34.571532],[115.621883,34.574744],[115.610354,34.572067],[115.593771,34.573179],[115.576792,34.570667],[115.561157,34.572232],[115.55476,34.56906],[115.52112,34.578739],[115.494982,34.604723],[115.486295,34.616867],[115.479583,34.632673],[115.46142,34.637283],[115.458183,34.656171],[115.444758,34.674479],[115.447048,34.698623],[115.444916,34.710302],[115.433861,34.725103],[115.445548,34.752561],[115.436546,34.776805],[115.43465,34.790322],[115.426754,34.805396],[115.413882,34.80782],[115.416172,34.813323],[115.408512,34.82593],[115.393982,34.831801],[115.379215,34.828763],[115.356946,34.837303],[115.345969,34.846212],[115.329623,34.851466],[115.317146,34.859183],[115.302379,34.858813],[115.289586,34.851589],[115.274661,34.85475],[115.256104,34.845308],[115.243469,34.850152],[115.239363,34.874655],[115.240784,34.883847],[115.249234,34.894515],[115.252156,34.906576],[115.239363,34.911868],[115.204933,34.914247],[115.202722,34.925608],[115.211724,34.943364],[115.222148,34.945578],[115.219147,34.960624],[115.208249,34.958329],[115.201616,34.95099],[115.175004,34.962469],[115.15692,34.958001],[115.157236,34.966978],[115.146576,34.980135],[115.131177,34.983578],[115.132993,34.999683],[115.128097,35.004354],[115.106144,35.000789],[115.074952,35.000379],[115.051656,34.985996],[115.0376,34.981611],[115.028835,34.971815],[115.016042,34.977348],[115.008066,34.988496],[114.970319,34.990504],[114.946787,34.988701],[114.934784,34.980709],[114.923807,34.968741],[114.913936,34.977881],[114.907935,34.989356],[114.889693,34.993987],[114.880296,35.003493],[114.884402,35.021929],[114.869951,35.024468],[114.859291,35.002674],[114.827072,35.01013],[114.846972,35.023444],[114.855263,35.036183],[114.85092,35.041917],[114.834021,35.042162],[114.819254,35.051786],[114.83181,35.074182],[114.861186,35.082983],[114.876269,35.091128],[114.882902,35.098781],[114.883613,35.109667],[114.872557,35.125992],[114.860633,35.137405],[114.841681,35.151189],[114.841049,35.159246],[114.850288,35.172617],[114.86166,35.182389],[114.876584,35.189012],[114.909356,35.19449],[114.928308,35.194776],[114.932494,35.198659],[114.92973,35.248225],[114.954605,35.255455],[114.957684,35.261132],[114.975531,35.261541],[114.975768,35.270281],[114.963607,35.273752],[114.987613,35.30221],[115.004749,35.317273],[115.014541,35.318089],[115.0177,35.340575],[115.02536,35.346328],[115.035152,35.368316],[115.043286,35.376963],[115.057737,35.378472],[115.075426,35.375168],[115.088613,35.39299],[115.084823,35.410074],[115.091614,35.416066],[115.105907,35.403958],[115.114831,35.404121],[115.117989,35.41839],[115.117831,35.400125],[115.126597,35.408728],[115.126439,35.418023],[115.136863,35.421529],[115.16766,35.426094],[115.189534,35.425116],[115.197905,35.420673],[115.209829,35.423118],[115.23731,35.423118],[115.257446,35.43559],[115.272608,35.448305],[115.270792,35.456821],[115.286665,35.464481],[115.307117,35.480001],[115.357973,35.498451],[115.357973,35.506555],[115.350313,35.529476],[115.35355,35.540548],[115.360499,35.543275],[115.345969,35.546979],[115.345101,35.553612],[115.357973,35.554711],[115.359236,35.565454],[115.369502,35.559757],[115.370765,35.571028],[115.383242,35.568912],[115.383716,35.57766],[115.389718,35.577334],[115.394456,35.586894],[115.411908,35.603571],[115.416251,35.623985],[115.439388,35.643458],[115.452418,35.660732],[115.461499,35.680847],[115.485979,35.710137],[115.511486,35.727153],[115.524121,35.726341],[115.533202,35.734137],[115.552786,35.73032],[115.562499,35.738644],[115.583031,35.730564],[115.588875,35.738522],[115.619514,35.739212],[115.643046,35.743841],[115.665079,35.751067],[115.693586,35.754071],[115.698245,35.768399],[115.696271,35.788892],[115.704404,35.788933],[115.706379,35.805608],[115.717434,35.802727],[115.720277,35.817087],[115.727937,35.815627],[115.734886,35.832945],[115.753128,35.832945],[115.752891,35.838379],[115.763709,35.838379],[115.773343,35.854192],[115.816776,35.844259],[115.821356,35.852652],[115.841335,35.850016],[115.840861,35.857192],[115.859971,35.857882],[115.865499,35.868624],[115.872606,35.872799],[115.871422,35.858327],[115.876002,35.867124],[115.875212,35.835095],[115.877107,35.820657],[115.883583,35.808163],[115.898192,35.805202],[115.911932,35.811733],[115.925988,35.804756],[115.922119,35.799157],[115.945493,35.791976],[115.970289,35.782156],[116.017591,35.756263],[116.026909,35.749687],[116.041518,35.733893],[116.071052,35.719072],[116.079897,35.712452],[116.089847,35.699373],[116.103034,35.687348],[116.121829,35.67459],[116.127514,35.649433],[116.134384,35.638539],[116.115906,35.618414],[116.116222,35.606621],[116.125145,35.59385],[116.125145,35.587871],[116.114327,35.577456],[116.115274,35.566471],[116.123408,35.540589],[116.12554,35.516042],[116.121276,35.497881],[116.128778,35.489614],[116.129567,35.475235],[116.15002,35.469573],[116.160918,35.471569],[116.15689,35.446838],[116.167946,35.452217],[116.178685,35.450342],[116.177817,35.466151],[116.188319,35.477313],[116.188319,35.467781],[116.19669,35.46334],[116.206798,35.465703],[116.20206,35.458247],[116.204429,35.436079],[116.215484,35.435957],[116.215958,35.419857],[116.212642,35.409054],[116.215879,35.393438],[116.223855,35.371702],[116.22117,35.358608],[116.215169,35.350734],[116.201744,35.345185],[116.193452,35.337555],[116.199612,35.304986],[116.215642,35.29131],[116.223539,35.260438],[116.237201,35.261745],[116.265866,35.271547],[116.269656,35.269872],[116.285608,35.242669],[116.284265,35.22506],[116.269104,35.191178],[116.248256,35.195634],[116.234437,35.208264],[116.234516,35.200008],[116.228356,35.194367],[116.213115,35.196697],[116.221881,35.181817],[116.223618,35.173231],[116.214537,35.155606],[116.204903,35.145668],[116.181765,35.11204],[116.154284,35.113513],[116.141018,35.09076],[116.15389,35.088467],[116.140228,35.06018],[116.141413,35.055062],[116.119381,35.053383],[116.114564,35.039828],[116.115748,35.025574],[116.139754,34.995421],[116.170789,34.974684],[116.171499,34.964683],[116.162023,34.957632],[116.155153,34.947259],[116.162181,34.94361],[116.192505,34.939182],[116.201586,34.919702],[116.213826,34.913098],[116.226935,34.911786],[116.266261,34.89751],[116.286713,34.88159],[116.299032,34.877733],[116.325803,34.874943],[116.339543,34.867022],[116.373815,34.86538],[116.409745,34.852944]]]]}}]}', 'admin', '2020-12-07 19:27:59', NULL, '2020-12-07 19:27:59', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1335896227857940481', '杭州', 'hangzhou', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":330102,\"name\":\"上城区\",\"center\":[120.171465,30.250236],\"centroid\":[120.173932,30.226977],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":0,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.188063,30.257783],[120.187445,30.250124],[120.186613,30.246239],[120.19132,30.245676],[120.197999,30.242341],[120.19983,30.240158],[120.213307,30.230548],[120.196573,30.216571],[120.182858,30.207933],[120.177628,30.205626],[120.140166,30.19284],[120.138169,30.19512],[120.1371,30.1981],[120.137551,30.201012],[120.141545,30.204061],[120.141069,30.206464],[120.138431,30.207947],[120.139405,30.210474],[120.145253,30.209581],[120.147368,30.210268],[120.150173,30.212849],[120.160347,30.227486],[120.15923,30.231578],[120.154381,30.23442],[120.154666,30.241119],[120.160442,30.246843],[120.15797,30.24672],[120.159848,30.249493],[120.16251,30.251565],[120.15923,30.256397],[120.156948,30.258058],[120.164079,30.25836],[120.171804,30.258003],[120.188063,30.257783]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330103,\"name\":\"下城区\",\"center\":[120.172763,30.276271],\"centroid\":[120.180095,30.303745],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":1,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.199853,30.35099],[120.201042,30.348124],[120.20437,30.345738],[120.212285,30.34534],[120.212095,30.334149],[120.211168,30.332119],[120.205939,30.332202],[120.203157,30.329733],[120.202349,30.326236],[120.204417,30.325961],[120.202421,30.322176],[120.197833,30.322244],[120.196906,30.320118],[120.204322,30.320488],[120.207198,30.320118],[120.200186,30.312148],[120.197952,30.314329],[120.194838,30.312093],[120.190607,30.312642],[120.18987,30.308856],[120.188301,30.30876],[120.188253,30.304507],[120.193007,30.30474],[120.190892,30.300295],[120.186494,30.29714],[120.183975,30.285367],[120.184926,30.28121],[120.18899,30.274321],[120.188182,30.270849],[120.188658,30.267294],[120.188063,30.257783],[120.171804,30.258003],[120.164079,30.25836],[120.156948,30.258058],[120.156472,30.260295],[120.158469,30.259142],[120.154666,30.272688],[120.161892,30.273305],[120.160822,30.279096],[120.159681,30.280524],[120.154547,30.282637],[120.153073,30.284983],[120.154024,30.289895],[120.165553,30.293463],[120.166266,30.294807],[120.164816,30.30009],[120.157162,30.308197],[120.156972,30.309213],[120.169522,30.325399],[120.174348,30.331146],[120.17827,30.336604],[120.187041,30.347561],[120.195789,30.348892],[120.199853,30.35099]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330104,\"name\":\"江干区\",\"center\":[120.202633,30.266603],\"centroid\":[120.296023,30.310268],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":2,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.188063,30.257783],[120.188658,30.267294],[120.188182,30.270849],[120.18899,30.274321],[120.184926,30.28121],[120.183975,30.285367],[120.186494,30.29714],[120.190892,30.300295],[120.193007,30.30474],[120.188253,30.304507],[120.188301,30.30876],[120.18987,30.308856],[120.190607,30.312642],[120.194838,30.312093],[120.197952,30.314329],[120.200186,30.312148],[120.207198,30.320118],[120.204322,30.320488],[120.196906,30.320118],[120.197833,30.322244],[120.202421,30.322176],[120.204417,30.325961],[120.202349,30.326236],[120.203157,30.329733],[120.205939,30.332202],[120.211168,30.332119],[120.212095,30.334149],[120.212285,30.34534],[120.20437,30.345738],[120.201042,30.348124],[120.199853,30.35099],[120.204251,30.352662],[120.210407,30.357736],[120.211739,30.359971],[120.213093,30.36503],[120.211881,30.369198],[120.208957,30.374243],[120.208815,30.376478],[120.210502,30.37911],[120.221294,30.387156],[120.228592,30.393544],[120.232395,30.392529],[120.237577,30.390062],[120.240334,30.387622],[120.23791,30.380028],[120.23482,30.376683],[120.239978,30.372146],[120.2468,30.363947],[120.247109,30.362343],[120.244233,30.359902],[120.243567,30.358188],[120.243947,30.354116],[120.242236,30.348261],[120.239883,30.344997],[120.234772,30.340691],[120.236056,30.339786],[120.243543,30.344174],[120.246015,30.342871],[120.248012,30.338853],[120.252552,30.337043],[120.261466,30.337523],[120.260872,30.335452],[120.258471,30.334355],[120.264437,30.326578],[120.268051,30.328663],[120.266553,30.331338],[120.277868,30.337948],[120.279318,30.336686],[120.281885,30.328499],[120.276251,30.3233],[120.272591,30.320516],[120.275562,30.319857],[120.291964,30.317814],[120.291631,30.315331],[120.295767,30.314851],[120.299475,30.315605],[120.300212,30.32127],[120.300117,30.324987],[120.29358,30.325001],[120.296623,30.33596],[120.299618,30.341816],[120.301567,30.343927],[120.300759,30.347575],[120.307224,30.350619],[120.310766,30.350839],[120.316281,30.352539],[120.325717,30.353389],[120.328261,30.358655],[120.335986,30.361068],[120.341192,30.36588],[120.34433,30.368087],[120.347206,30.36928],[120.350629,30.372173],[120.355953,30.374065],[120.362847,30.374682],[120.371143,30.377286],[120.379486,30.380714],[120.383194,30.381235],[120.398312,30.384799],[120.400095,30.384264],[120.400903,30.377026],[120.399596,30.37327],[120.396197,30.370624],[120.388543,30.370117],[120.380817,30.356378],[120.38241,30.355761],[120.378084,30.344929],[120.384169,30.340005],[120.383955,30.339155],[120.395198,30.332215],[120.40309,30.325248],[120.406584,30.324878],[120.413739,30.318307],[120.408866,30.305413],[120.403423,30.293188],[120.396149,30.281141],[120.389779,30.272756],[120.37642,30.259773],[120.369027,30.254763],[120.364154,30.252801],[120.355098,30.250522],[120.350676,30.25011],[120.340859,30.252595],[120.336058,30.255697],[120.324149,30.267239],[120.320535,30.270218],[120.317731,30.27395],[120.311004,30.280359],[120.3043,30.28604],[120.298952,30.287878],[120.288136,30.288235],[120.278961,30.286822],[120.270594,30.284722],[120.269786,30.284105],[120.252838,30.276091],[120.248036,30.272468],[120.241665,30.26514],[120.221057,30.23766],[120.213307,30.230548],[120.19983,30.240158],[120.197999,30.242341],[120.19132,30.245676],[120.186613,30.246239],[120.187445,30.250124],[120.188063,30.257783]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330105,\"name\":\"拱墅区\",\"center\":[120.150053,30.314697],\"centroid\":[120.152502,30.339314],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":3,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.085779,30.331187],[120.090011,30.334931],[120.091746,30.333395],[120.096405,30.335685],[120.099019,30.338305],[120.097641,30.340581],[120.103702,30.3415],[120.106127,30.343283],[120.1081,30.342803],[120.108409,30.339978],[120.111737,30.33969],[120.114137,30.337262],[120.121387,30.337948],[120.123265,30.339224],[120.123764,30.33644],[120.124953,30.339498],[120.129446,30.342515],[120.129446,30.341144],[120.136957,30.343379],[120.133843,30.354568],[120.131537,30.357708],[120.130182,30.362754],[120.129279,30.371666],[120.129208,30.38203],[120.130943,30.383222],[120.1342,30.380947],[120.139073,30.380316],[120.138526,30.378095],[120.140736,30.376176],[120.146132,30.375683],[120.146204,30.377835],[120.149175,30.38033],[120.152741,30.380686],[120.153002,30.375861],[120.159254,30.375559],[120.159016,30.372543],[120.167882,30.371035],[120.170782,30.372475],[120.171044,30.37401],[120.168595,30.3746],[120.171828,30.37582],[120.173444,30.374942],[120.174348,30.371954],[120.177699,30.376807],[120.183832,30.381618],[120.186162,30.38802],[120.192485,30.396148],[120.19838,30.394174],[120.209908,30.392557],[120.212998,30.39109],[120.216778,30.387896],[120.221294,30.387156],[120.210502,30.37911],[120.208815,30.376478],[120.208957,30.374243],[120.211881,30.369198],[120.213093,30.36503],[120.211739,30.359971],[120.210407,30.357736],[120.204251,30.352662],[120.199853,30.35099],[120.195789,30.348892],[120.187041,30.347561],[120.17827,30.336604],[120.174348,30.331146],[120.169522,30.325399],[120.156972,30.309213],[120.157162,30.308197],[120.164816,30.30009],[120.166266,30.294807],[120.165553,30.293463],[120.154024,30.289895],[120.153073,30.284983],[120.154547,30.282637],[120.159681,30.280524],[120.160822,30.279096],[120.161892,30.273305],[120.154666,30.272688],[120.154024,30.27535],[120.150934,30.278506],[120.149294,30.28206],[120.146132,30.286589],[120.144112,30.291144],[120.141188,30.293902],[120.135198,30.292626],[120.132512,30.292791],[120.128709,30.294286],[120.118012,30.29264],[120.109241,30.291995],[120.104677,30.292461],[120.102205,30.298292],[120.102823,30.304672],[120.102038,30.312697],[120.095597,30.325481],[120.092007,30.326071],[120.088489,30.330529],[120.085779,30.331187]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330106,\"name\":\"西湖区\",\"center\":[120.147376,30.272934],\"centroid\":[120.083604,30.200677],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":4,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.140166,30.19284],[120.134128,30.190588],[120.129659,30.186852],[120.126664,30.182827],[120.12462,30.177346],[120.124596,30.167263],[120.125999,30.15946],[120.130373,30.151161],[120.138597,30.142078],[120.146132,30.137172],[120.160014,30.12637],[120.16831,30.121793],[120.177723,30.11712],[120.181835,30.111457],[120.182953,30.10846],[120.182168,30.104818],[120.177295,30.102604],[120.170354,30.101546],[120.162011,30.097985],[120.150459,30.091455],[120.146869,30.088664],[120.134818,30.097669],[120.130349,30.099305],[120.124739,30.092953],[120.123812,30.089461],[120.118131,30.083796],[120.115088,30.082229],[120.108955,30.08062],[120.09795,30.079603],[120.091579,30.078475],[120.084615,30.078269],[120.076747,30.080868],[120.067928,30.086794],[120.061748,30.091853],[120.059513,30.092788],[120.054902,30.09272],[120.052953,30.091661],[120.049125,30.086849],[120.044894,30.086368],[120.043635,30.092156],[120.041258,30.093091],[120.036361,30.092555],[120.030846,30.094768],[120.030442,30.098837],[120.025213,30.105519],[120.02324,30.10633],[120.019151,30.10567],[120.016465,30.108323],[120.017725,30.113189],[120.016417,30.115718],[120.01095,30.116254],[120.001822,30.114357],[120.000468,30.116034],[120.001941,30.119567],[120.003819,30.12659],[120.007004,30.130026],[120.008787,30.134204],[120.008858,30.136719],[120.011663,30.142779],[120.016417,30.148935],[120.017178,30.153167],[120.014825,30.15891],[120.018438,30.162963],[120.018913,30.165202],[120.017772,30.168417],[120.014397,30.173816],[120.016156,30.177072],[120.013494,30.181042],[120.011449,30.181852],[120.005459,30.182346],[119.998994,30.182305],[119.996332,30.181536],[120.0013,30.188006],[120.003439,30.191865],[120.009096,30.195615],[120.009263,30.200202],[120.006529,30.205379],[120.007171,30.208757],[120.013351,30.210254],[120.017487,30.211792],[120.018034,30.214319],[120.015704,30.213426],[120.009999,30.215637],[120.007123,30.2208],[120.010356,30.221184],[120.013755,30.2162],[120.015443,30.218067],[120.018367,30.216447],[120.020268,30.217985],[120.01889,30.219742],[120.016845,30.224823],[120.025046,30.228461],[120.030894,30.230479],[120.032153,30.229697],[120.038571,30.233019],[120.040639,30.232841],[120.041162,30.236122],[120.044538,30.238058],[120.0443,30.240474],[120.046178,30.242725],[120.052216,30.243494],[120.052691,30.245333],[120.055234,30.245388],[120.055306,30.251483],[120.058515,30.252801],[120.05773,30.257289],[120.057255,30.268351],[120.056494,30.273374],[120.052382,30.273237],[120.049815,30.274266],[120.049815,30.27594],[120.05281,30.282897],[120.056732,30.2884],[120.052263,30.289319],[120.051621,30.29054],[120.052953,30.293847],[120.054807,30.295246],[120.053784,30.298772],[120.051907,30.299513],[120.048008,30.30319],[120.042089,30.304096],[120.030799,30.299843],[120.028493,30.303835],[120.026116,30.305948],[120.026686,30.310996],[120.02179,30.311874],[120.020554,30.315674],[120.023881,30.316195],[120.023406,30.319967],[120.023572,30.326743],[120.021362,30.329088],[120.01782,30.329733],[120.01763,30.33238],[120.026425,30.333272],[120.027185,30.335905],[120.025545,30.342474],[120.025973,30.34523],[120.023881,30.348357],[120.029444,30.350016],[120.032795,30.351634],[120.038595,30.350948],[120.046511,30.35221],[120.046463,30.353759],[120.048674,30.353526],[120.050195,30.349865],[120.053951,30.351401],[120.060607,30.351497],[120.060868,30.353348],[120.063673,30.352128],[120.065361,30.352813],[120.06517,30.355309],[120.067334,30.355446],[120.069449,30.350702],[120.074655,30.34774],[120.0762,30.345285],[120.079742,30.341816],[120.081881,30.33563],[120.085779,30.331187],[120.088489,30.330529],[120.092007,30.326071],[120.095597,30.325481],[120.102038,30.312697],[120.102823,30.304672],[120.102205,30.298292],[120.104677,30.292461],[120.109241,30.291995],[120.118012,30.29264],[120.128709,30.294286],[120.132512,30.292791],[120.135198,30.292626],[120.141188,30.293902],[120.144112,30.291144],[120.146132,30.286589],[120.149294,30.28206],[120.150934,30.278506],[120.154024,30.27535],[120.154666,30.272688],[120.158469,30.259142],[120.156472,30.260295],[120.156948,30.258058],[120.15923,30.256397],[120.16251,30.251565],[120.159848,30.249493],[120.15797,30.24672],[120.160442,30.246843],[120.154666,30.241119],[120.154381,30.23442],[120.15923,30.231578],[120.160347,30.227486],[120.150173,30.212849],[120.147368,30.210268],[120.145253,30.209581],[120.139405,30.210474],[120.138431,30.207947],[120.141069,30.206464],[120.141545,30.204061],[120.137551,30.201012],[120.1371,30.1981],[120.138169,30.19512],[120.140166,30.19284]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330108,\"name\":\"滨江区\",\"center\":[120.21062,30.206615],\"centroid\":[120.185259,30.180456],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":5,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.221057,30.23766],[120.223957,30.2363],[120.226524,30.232896],[120.231896,30.230177],[120.234439,30.229793],[120.235224,30.228132],[120.234962,30.21366],[120.234463,30.21355],[120.234202,30.188788],[120.233488,30.182044],[120.224575,30.181879],[120.224646,30.179173],[120.222055,30.178885],[120.222293,30.173637],[120.224384,30.171247],[120.220557,30.170519],[120.219963,30.16703],[120.217943,30.164749],[120.216849,30.161314],[120.220534,30.162578],[120.224979,30.162716],[120.226167,30.16016],[120.223148,30.156684],[120.224598,30.153868],[120.221651,30.153758],[120.219892,30.150515],[120.216944,30.143081],[120.219464,30.139948],[120.214543,30.136911],[120.213307,30.137887],[120.211572,30.136375],[120.208743,30.137131],[120.208054,30.139302],[120.205273,30.143026],[120.204084,30.141061],[120.201375,30.139563],[120.197167,30.140759],[120.19189,30.147121],[120.186185,30.144428],[120.186661,30.146599],[120.184141,30.145362],[120.181717,30.147245],[120.180338,30.149814],[120.178864,30.149416],[120.175203,30.153881],[120.170473,30.15112],[120.168286,30.148646],[120.164816,30.150062],[120.16232,30.147382],[120.159087,30.148894],[120.154737,30.145953],[120.155902,30.144332],[120.152764,30.142751],[120.146132,30.137172],[120.138597,30.142078],[120.130373,30.151161],[120.125999,30.15946],[120.124596,30.167263],[120.12462,30.177346],[120.126664,30.182827],[120.129659,30.186852],[120.134128,30.190588],[120.140166,30.19284],[120.177628,30.205626],[120.182858,30.207933],[120.196573,30.216571],[120.213307,30.230548],[120.221057,30.23766]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330109,\"name\":\"萧山区\",\"center\":[120.27069,30.162932],\"centroid\":[120.388786,30.16844],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":6,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.146132,30.137172],[120.152764,30.142751],[120.155902,30.144332],[120.154737,30.145953],[120.159087,30.148894],[120.16232,30.147382],[120.164816,30.150062],[120.168286,30.148646],[120.170473,30.15112],[120.175203,30.153881],[120.178864,30.149416],[120.180338,30.149814],[120.181717,30.147245],[120.184141,30.145362],[120.186661,30.146599],[120.186185,30.144428],[120.19189,30.147121],[120.197167,30.140759],[120.201375,30.139563],[120.204084,30.141061],[120.205273,30.143026],[120.208054,30.139302],[120.208743,30.137131],[120.211572,30.136375],[120.213307,30.137887],[120.214543,30.136911],[120.219464,30.139948],[120.216944,30.143081],[120.219892,30.150515],[120.221651,30.153758],[120.224598,30.153868],[120.223148,30.156684],[120.226167,30.16016],[120.224979,30.162716],[120.220534,30.162578],[120.216849,30.161314],[120.217943,30.164749],[120.219963,30.16703],[120.220557,30.170519],[120.224384,30.171247],[120.222293,30.173637],[120.222055,30.178885],[120.224646,30.179173],[120.224575,30.181879],[120.233488,30.182044],[120.234202,30.188788],[120.234463,30.21355],[120.234962,30.21366],[120.235224,30.228132],[120.234439,30.229793],[120.231896,30.230177],[120.226524,30.232896],[120.223957,30.2363],[120.221057,30.23766],[120.241665,30.26514],[120.248036,30.272468],[120.252838,30.276091],[120.269786,30.284105],[120.270594,30.284722],[120.278961,30.286822],[120.288136,30.288235],[120.298952,30.287878],[120.3043,30.28604],[120.311004,30.280359],[120.317731,30.27395],[120.320535,30.270218],[120.324149,30.267239],[120.336058,30.255697],[120.340859,30.252595],[120.350676,30.25011],[120.355098,30.250522],[120.364154,30.252801],[120.369027,30.254763],[120.37642,30.259773],[120.389779,30.272756],[120.396149,30.281141],[120.403423,30.293188],[120.408866,30.305413],[120.413739,30.318307],[120.418945,30.326441],[120.419159,30.331077],[120.421108,30.334643],[120.433492,30.36141],[120.438436,30.37268],[120.443262,30.376903],[120.450227,30.380042],[120.460234,30.382688],[120.47616,30.385457],[120.497791,30.388924],[120.510152,30.389144],[120.567866,30.387869],[120.589188,30.388527],[120.619543,30.389007],[120.6339,30.389459],[120.642719,30.388582],[120.659002,30.385594],[120.662686,30.384661],[120.684935,30.379973],[120.69354,30.377835],[120.698199,30.375038],[120.702478,30.369431],[120.70388,30.365853],[120.704546,30.344462],[120.704142,30.330803],[120.705045,30.315605],[120.706043,30.30946],[120.710845,30.297538],[120.71403,30.293353],[120.71926,30.28818],[120.721946,30.286314],[120.705663,30.271412],[120.700529,30.267761],[120.693944,30.262052],[120.679088,30.244249],[120.669033,30.233129],[120.646831,30.21955],[120.642695,30.217257],[120.641911,30.214758],[120.624606,30.187868],[120.612768,30.166288],[120.609179,30.152851],[120.608181,30.15182],[120.601953,30.150735],[120.593491,30.146764],[120.590852,30.146283],[120.585932,30.147272],[120.583864,30.150405],[120.568342,30.151312],[120.563421,30.147946],[120.559808,30.148179],[120.558144,30.151463],[120.550918,30.15564],[120.540411,30.156547],[120.533779,30.157454],[120.529382,30.157522],[120.524889,30.155695],[120.518495,30.155393],[120.51058,30.157536],[120.506158,30.159776],[120.50245,30.165917],[120.4981,30.169187],[120.494891,30.170148],[120.484076,30.172209],[120.483719,30.170423],[120.480867,30.170134],[120.479203,30.168664],[120.47509,30.169818],[120.466153,30.169557],[120.463728,30.162207],[120.465012,30.155489],[120.464394,30.154115],[120.461042,30.153991],[120.459545,30.151546],[120.451177,30.150982],[120.45006,30.145665],[120.447636,30.143576],[120.446923,30.135454],[120.438484,30.133792],[120.429594,30.132445],[120.424008,30.133187],[120.422891,30.13588],[120.424127,30.1408],[120.426076,30.144277],[120.422201,30.146846],[120.423152,30.151065],[120.42194,30.151037],[120.421678,30.148193],[120.419396,30.152851],[120.417923,30.148509],[120.414476,30.148042],[120.414214,30.149114],[120.410887,30.149526],[120.41072,30.146118],[120.411362,30.132623],[120.40927,30.12938],[120.404944,30.129476],[120.405562,30.1361],[120.404231,30.137296],[120.399001,30.136348],[120.397433,30.137832],[120.397813,30.143191],[120.392631,30.146091],[120.390492,30.149347],[120.387806,30.156176],[120.384763,30.157303],[120.381958,30.155352],[120.379201,30.154981],[120.373163,30.155503],[120.36646,30.153881],[120.361872,30.152068],[120.358758,30.147836],[120.355074,30.151133],[120.352031,30.150694],[120.352055,30.146736],[120.353957,30.144222],[120.35341,30.142188],[120.339623,30.142119],[120.339124,30.138464],[120.334299,30.134616],[120.331351,30.129298],[120.327999,30.125202],[120.326217,30.1249],[120.323198,30.126755],[120.318016,30.125999],[120.316542,30.132376],[120.314688,30.136471],[120.31224,30.13742],[120.303397,30.133008],[120.298904,30.129545],[120.29831,30.126549],[120.303754,30.126686],[120.300307,30.118357],[120.295624,30.115457],[120.293651,30.111911],[120.286853,30.10677],[120.28885,30.101161],[120.294483,30.098274],[120.299285,30.097366],[120.304681,30.09969],[120.309482,30.106013],[120.313333,30.107072],[120.31823,30.102893],[120.325408,30.097793],[120.33128,30.09705],[120.333704,30.095483],[120.335677,30.090877],[120.335796,30.081363],[120.333776,30.074845],[120.337579,30.071998],[120.338601,30.070211],[120.337508,30.059333],[120.33437,30.056912],[120.332088,30.053487],[120.327096,30.05108],[120.324957,30.048632],[120.325551,30.044946],[120.33185,30.037903],[120.335582,30.036885],[120.340479,30.0376],[120.343617,30.034918],[120.346279,30.023609],[120.344805,30.021381],[120.345827,30.019716],[120.351271,30.017886],[120.353291,30.016317],[120.356904,30.011694],[120.357284,30.004718],[120.358164,30.00286],[120.362847,29.997741],[120.36085,29.99214],[120.36047,29.988589],[120.362657,29.985506],[120.362276,29.982726],[120.364297,29.978528],[120.362276,29.97433],[120.357213,29.973449],[120.346469,29.973779],[120.342095,29.963758],[120.342333,29.960412],[120.340526,29.956048],[120.333681,29.95189],[120.331517,29.949302],[120.326074,29.946231],[120.325194,29.938548],[120.321676,29.937033],[120.315258,29.928867],[120.313547,29.9276],[120.307058,29.929336],[120.299309,29.932544],[120.297122,29.932654],[120.291345,29.935684],[120.288968,29.932131],[120.287233,29.926815],[120.284167,29.922161],[120.282123,29.921059],[120.277844,29.920742],[120.274373,29.91953],[120.265269,29.924516],[120.264746,29.930961],[120.262298,29.934748],[120.260753,29.938865],[120.258899,29.941206],[120.255215,29.943643],[120.25279,29.941577],[120.250722,29.936703],[120.24573,29.935808],[120.241689,29.939044],[120.239788,29.939567],[120.232038,29.939732],[120.226524,29.940545],[120.224004,29.942073],[120.221009,29.942238],[120.214567,29.939484],[120.207246,29.93377],[120.20185,29.931856],[120.200424,29.92946],[120.204798,29.924061],[120.203157,29.921541],[120.197643,29.917354],[120.190155,29.906914],[120.187184,29.904724],[120.185092,29.904503],[120.180623,29.907368],[120.175822,29.90909],[120.176273,29.91358],[120.172993,29.916238],[120.166313,29.917271],[120.160276,29.909145],[120.159729,29.906211],[120.155046,29.906101],[120.151742,29.908084],[120.150031,29.905054],[120.14946,29.899324],[120.149888,29.895191],[120.148723,29.891637],[120.150268,29.887587],[120.148486,29.881277],[120.144754,29.874112],[120.141188,29.870199],[120.136719,29.866327],[120.133748,29.86284],[120.1313,29.858816],[120.122101,29.852876],[120.118369,29.852229],[120.11226,29.847171],[120.10993,29.845972],[120.104796,29.845531],[120.102466,29.846812],[120.102442,29.849445],[120.104059,29.8534],[120.099566,29.856694],[120.096666,29.862399],[120.088156,29.871232],[120.082095,29.876688],[120.078149,29.884115],[120.077222,29.88822],[120.078268,29.88975],[120.082523,29.891788],[120.084805,29.894585],[120.085827,29.897437],[120.085542,29.906859],[120.081097,29.912933],[120.084448,29.91734],[120.089606,29.916514],[120.092126,29.916955],[120.096975,29.920866],[120.098449,29.924309],[120.097546,29.931126],[120.101325,29.936896],[120.100826,29.938039],[120.091151,29.946851],[120.090676,29.949123],[120.096001,29.952703],[120.101801,29.958499],[120.102965,29.967282],[120.104962,29.973614],[120.104463,29.981377],[120.110239,29.983524],[120.114137,29.987667],[120.118535,29.988272],[120.120294,29.990791],[120.124858,29.993337],[120.126926,29.997768],[120.134105,30.01058],[120.135555,30.021271],[120.136981,30.024806],[120.137171,30.029278],[120.134532,30.043983],[120.131133,30.044327],[120.129873,30.045757],[120.126474,30.045936],[120.124478,30.04833],[120.12569,30.050241],[120.12897,30.052208],[120.130349,30.055509],[120.136386,30.058934],[120.136886,30.061547],[120.134081,30.064999],[120.1371,30.069674],[120.137718,30.072177],[120.135079,30.080689],[120.140808,30.083769],[120.146869,30.088664],[120.150459,30.091455],[120.162011,30.097985],[120.170354,30.101546],[120.177295,30.102604],[120.182168,30.104818],[120.182953,30.10846],[120.181835,30.111457],[120.177723,30.11712],[120.16831,30.121793],[120.160014,30.12637],[120.146132,30.137172]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330110,\"name\":\"余杭区\",\"center\":[120.301737,30.421187],\"centroid\":[119.990852,30.381676],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":7,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.221294,30.387156],[120.216778,30.387896],[120.212998,30.39109],[120.209908,30.392557],[120.19838,30.394174],[120.192485,30.396148],[120.186162,30.38802],[120.183832,30.381618],[120.177699,30.376807],[120.174348,30.371954],[120.173444,30.374942],[120.171828,30.37582],[120.168595,30.3746],[120.171044,30.37401],[120.170782,30.372475],[120.167882,30.371035],[120.159016,30.372543],[120.159254,30.375559],[120.153002,30.375861],[120.152741,30.380686],[120.149175,30.38033],[120.146204,30.377835],[120.146132,30.375683],[120.140736,30.376176],[120.138526,30.378095],[120.139073,30.380316],[120.1342,30.380947],[120.130943,30.383222],[120.129208,30.38203],[120.129279,30.371666],[120.130182,30.362754],[120.131537,30.357708],[120.133843,30.354568],[120.136957,30.343379],[120.129446,30.341144],[120.129446,30.342515],[120.124953,30.339498],[120.123764,30.33644],[120.123265,30.339224],[120.121387,30.337948],[120.114137,30.337262],[120.111737,30.33969],[120.108409,30.339978],[120.1081,30.342803],[120.106127,30.343283],[120.103702,30.3415],[120.097641,30.340581],[120.099019,30.338305],[120.096405,30.335685],[120.091746,30.333395],[120.090011,30.334931],[120.085779,30.331187],[120.081881,30.33563],[120.079742,30.341816],[120.0762,30.345285],[120.074655,30.34774],[120.069449,30.350702],[120.067334,30.355446],[120.06517,30.355309],[120.065361,30.352813],[120.063673,30.352128],[120.060868,30.353348],[120.060607,30.351497],[120.053951,30.351401],[120.050195,30.349865],[120.048674,30.353526],[120.046463,30.353759],[120.046511,30.35221],[120.038595,30.350948],[120.032795,30.351634],[120.029444,30.350016],[120.023881,30.348357],[120.025973,30.34523],[120.025545,30.342474],[120.027185,30.335905],[120.026425,30.333272],[120.01763,30.33238],[120.01782,30.329733],[120.021362,30.329088],[120.023572,30.326743],[120.023406,30.319967],[120.023881,30.316195],[120.020554,30.315674],[120.02179,30.311874],[120.026686,30.310996],[120.026116,30.305948],[120.028493,30.303835],[120.030799,30.299843],[120.042089,30.304096],[120.048008,30.30319],[120.051907,30.299513],[120.053784,30.298772],[120.054807,30.295246],[120.052953,30.293847],[120.051621,30.29054],[120.052263,30.289319],[120.056732,30.2884],[120.05281,30.282897],[120.049815,30.27594],[120.049815,30.274266],[120.052382,30.273237],[120.056494,30.273374],[120.057255,30.268351],[120.05773,30.257289],[120.058515,30.252801],[120.055306,30.251483],[120.055234,30.245388],[120.052691,30.245333],[120.052216,30.243494],[120.046178,30.242725],[120.0443,30.240474],[120.044538,30.238058],[120.041162,30.236122],[120.040639,30.232841],[120.038571,30.233019],[120.032153,30.229697],[120.030894,30.230479],[120.025046,30.228461],[120.016845,30.224823],[120.01889,30.219742],[120.020268,30.217985],[120.018367,30.216447],[120.015443,30.218067],[120.013755,30.2162],[120.010356,30.221184],[120.007123,30.2208],[120.009999,30.215637],[120.015704,30.213426],[120.018034,30.214319],[120.017487,30.211792],[120.013351,30.210254],[120.007171,30.208757],[120.006529,30.205379],[120.009263,30.200202],[120.009096,30.195615],[120.003439,30.191865],[120.0013,30.188006],[119.996332,30.181536],[119.987988,30.174901],[119.980168,30.17405],[119.974296,30.175107],[119.964669,30.172854],[119.963101,30.170464],[119.959274,30.168005],[119.955993,30.168733],[119.951168,30.168307],[119.945392,30.16501],[119.942016,30.160476],[119.938736,30.158704],[119.934338,30.160202],[119.933102,30.163952],[119.932841,30.169626],[119.935265,30.177896],[119.935028,30.178981],[119.929751,30.188129],[119.926613,30.189681],[119.92155,30.190904],[119.914514,30.191824],[119.909166,30.19089],[119.903936,30.187648],[119.901393,30.188843],[119.894975,30.193417],[119.887677,30.18975],[119.880499,30.187703],[119.871656,30.182662],[119.861981,30.180726],[119.85718,30.177951],[119.853472,30.174929],[119.850168,30.181357],[119.84905,30.188074],[119.845413,30.190437],[119.842656,30.191123],[119.839495,30.19387],[119.836095,30.197949],[119.836452,30.199378],[119.84161,30.20667],[119.843132,30.214442],[119.845057,30.217189],[119.844914,30.221047],[119.846412,30.222502],[119.849787,30.223093],[119.853876,30.225276],[119.856657,30.227843],[119.86298,30.237852],[119.86752,30.249795],[119.868304,30.252718],[119.864477,30.256232],[119.865,30.258922],[119.862837,30.260501],[119.863479,30.263218],[119.86569,30.265236],[119.86588,30.268392],[119.867282,30.26938],[119.864976,30.271068],[119.864715,30.273264],[119.859985,30.272825],[119.853686,30.273841],[119.846816,30.270245],[119.844225,30.272194],[119.839471,30.27148],[119.829083,30.268516],[119.828513,30.269216],[119.829273,30.278548],[119.827657,30.282074],[119.827871,30.283789],[119.830438,30.286328],[119.836761,30.289525],[119.837118,30.29382],[119.836286,30.29928],[119.833433,30.307127],[119.83108,30.307745],[119.826302,30.306743],[119.821001,30.304096],[119.808023,30.295342],[119.799893,30.297483],[119.799085,30.30175],[119.802365,30.307868],[119.803554,30.311462],[119.803839,30.316099],[119.80227,30.322614],[119.806549,30.325851],[119.807666,30.328992],[119.807262,30.334437],[119.804647,30.342392],[119.798895,30.344215],[119.795163,30.348988],[119.791764,30.356899],[119.788602,30.35971],[119.78033,30.365647],[119.774578,30.367471],[119.772771,30.3739],[119.771107,30.375998],[119.768825,30.376752],[119.757534,30.378561],[119.749904,30.381399],[119.749262,30.383757],[119.750237,30.385292],[119.753303,30.386553],[119.755585,30.388815],[119.749048,30.392543],[119.744722,30.393804],[119.742321,30.393338],[119.735571,30.395682],[119.726253,30.389624],[119.723258,30.388472],[119.718385,30.390199],[119.704027,30.399684],[119.696445,30.401918],[119.685011,30.406605],[119.681089,30.408729],[119.686033,30.417541],[119.693521,30.424488],[119.696397,30.42668],[119.707284,30.430023],[119.709209,30.434065],[119.707617,30.437422],[119.704764,30.440326],[119.704146,30.443203],[119.699749,30.448587],[119.694923,30.452738],[119.69528,30.4596],[119.694282,30.462942],[119.695375,30.464476],[119.699368,30.465339],[119.701722,30.467996],[119.702577,30.473255],[119.704408,30.476446],[119.708235,30.485156],[119.708877,30.487963],[119.704717,30.494563],[119.708568,30.498287],[119.709186,30.508829],[119.706785,30.515852],[119.706381,30.521423],[119.704883,30.525981],[119.700272,30.531142],[119.694995,30.542351],[119.692404,30.556145],[119.693735,30.558868],[119.701341,30.558307],[119.707118,30.561057],[119.711729,30.566516],[119.716911,30.564806],[119.721617,30.560934],[119.729058,30.551766],[119.743248,30.550165],[119.74843,30.550206],[119.752091,30.551232],[119.768944,30.551355],[119.770846,30.549658],[119.772034,30.546429],[119.770727,30.544048],[119.768588,30.537259],[119.767684,30.524722],[119.766876,30.520835],[119.761813,30.51885],[119.761837,30.517125],[119.766401,30.514072],[119.784062,30.511019],[119.790433,30.506899],[119.794188,30.505625],[119.798277,30.505927],[119.806905,30.507802],[119.815891,30.510663],[119.818363,30.510102],[119.823711,30.507145],[119.829582,30.502969],[119.832459,30.49878],[119.836024,30.496589],[119.841325,30.496384],[119.846032,30.498424],[119.847149,30.50197],[119.848765,30.503188],[119.851118,30.502025],[119.854113,30.493974],[119.860175,30.48621],[119.864763,30.482526],[119.867116,30.477775],[119.869612,30.47698],[119.874128,30.478281],[119.877812,30.477925],[119.880808,30.476213],[119.88038,30.474214],[119.874366,30.471174],[119.872821,30.467065],[119.872607,30.46249],[119.873676,30.460915],[119.877622,30.460038],[119.882115,30.460367],[119.888034,30.458313],[119.891005,30.456135],[119.894571,30.455327],[119.897613,30.456011],[119.90106,30.458874],[119.903033,30.459408],[119.907407,30.456696],[119.909308,30.456326],[119.91487,30.458984],[119.918816,30.4616],[119.92155,30.462531],[119.924925,30.462189],[119.929299,30.459367],[119.931415,30.456463],[119.93151,30.449299],[119.93498,30.446779],[119.939188,30.44619],[119.944179,30.447149],[119.95074,30.444231],[119.952333,30.441861],[119.952737,30.438751],[119.955874,30.433668],[119.959606,30.432339],[119.965026,30.431572],[119.970612,30.432914],[119.973369,30.437751],[119.982973,30.445286],[119.987109,30.446135],[119.990793,30.445272],[120.0037,30.444285],[120.005459,30.443505],[120.008407,30.438669],[120.011901,30.436011],[120.013827,30.4356],[120.027732,30.434832],[120.031108,30.435161],[120.041543,30.43338],[120.044134,30.431969],[120.046107,30.427434],[120.049815,30.427338],[120.057089,30.429242],[120.061938,30.429325],[120.064743,30.430092],[120.062342,30.435572],[120.065907,30.437353],[120.067952,30.441135],[120.068118,30.445943],[120.065075,30.449546],[120.062413,30.451587],[120.059252,30.459011],[120.06025,30.464956],[120.059489,30.473433],[120.060416,30.476145],[120.063839,30.479418],[120.06586,30.483581],[120.066454,30.489496],[120.068284,30.496603],[120.076081,30.495357],[120.08074,30.497151],[120.090034,30.495987],[120.093766,30.496589],[120.099233,30.495795],[120.099804,30.494125],[120.097047,30.489852],[120.096761,30.486758],[120.099542,30.483293],[120.107315,30.481226],[120.111237,30.476186],[120.115136,30.475871],[120.122623,30.479117],[120.129707,30.479897],[120.146013,30.482705],[120.147796,30.48087],[120.146655,30.474666],[120.147083,30.471283],[120.149817,30.467503],[120.160371,30.469914],[120.162463,30.473146],[120.165624,30.474159],[120.169784,30.473981],[120.172945,30.475022],[120.175061,30.47683],[120.173159,30.483266],[120.174419,30.484129],[120.178246,30.481499],[120.180219,30.481787],[120.180005,30.483964],[120.177699,30.486018],[120.177747,30.488606],[120.173801,30.49203],[120.177058,30.493782],[120.179149,30.491947],[120.1859,30.494631],[120.182287,30.496233],[120.182216,30.499629],[120.185092,30.502627],[120.194553,30.503668],[120.197001,30.505092],[120.195812,30.509459],[120.196573,30.512032],[120.200234,30.514921],[120.201755,30.514428],[120.2033,30.507816],[120.205416,30.505858],[120.208268,30.507939],[120.212523,30.509774],[120.220724,30.510253],[120.224598,30.50976],[120.233869,30.506392],[120.239288,30.505242],[120.251934,30.506543],[120.261228,30.505242],[120.2671,30.505817],[120.27744,30.504831],[120.282123,30.508692],[120.285831,30.507802],[120.286853,30.510992],[120.289277,30.513032],[120.296527,30.514798],[120.299808,30.517809],[120.299903,30.519822],[120.311598,30.520739],[120.314593,30.521861],[120.317707,30.521601],[120.319894,30.518494],[120.322295,30.509979],[120.322651,30.506488],[120.326145,30.500437],[120.325765,30.496945],[120.327667,30.491071],[120.327904,30.484197],[120.325789,30.480774],[120.326026,30.478596],[120.328332,30.473584],[120.329188,30.468421],[120.331327,30.468407],[120.335059,30.471352],[120.341382,30.472269],[120.340645,30.466038],[120.337246,30.464312],[120.336866,30.458121],[120.337864,30.451916],[120.339813,30.450149],[120.340978,30.441614],[120.339433,30.440011],[120.340336,30.433887],[120.335939,30.431243],[120.330757,30.427269],[120.332682,30.424666],[120.332967,30.417308],[120.324838,30.411963],[120.32151,30.407715],[120.322057,30.404741],[120.320512,30.40433],[120.31533,30.400657],[120.310481,30.400205],[120.306273,30.39745],[120.306677,30.395092],[120.308936,30.393338],[120.31571,30.394325],[120.318824,30.388801],[120.318372,30.38547],[120.319276,30.379329],[120.324386,30.378493],[120.332635,30.375271],[120.339409,30.373325],[120.342927,30.371611],[120.34433,30.368087],[120.341192,30.36588],[120.335986,30.361068],[120.328261,30.358655],[120.325717,30.353389],[120.316281,30.352539],[120.310766,30.350839],[120.307224,30.350619],[120.300759,30.347575],[120.301567,30.343927],[120.299618,30.341816],[120.296623,30.33596],[120.29358,30.325001],[120.300117,30.324987],[120.300212,30.32127],[120.299475,30.315605],[120.295767,30.314851],[120.291631,30.315331],[120.291964,30.317814],[120.275562,30.319857],[120.272591,30.320516],[120.276251,30.3233],[120.281885,30.328499],[120.279318,30.336686],[120.277868,30.337948],[120.266553,30.331338],[120.268051,30.328663],[120.264437,30.326578],[120.258471,30.334355],[120.260872,30.335452],[120.261466,30.337523],[120.252552,30.337043],[120.248012,30.338853],[120.246015,30.342871],[120.243543,30.344174],[120.236056,30.339786],[120.234772,30.340691],[120.239883,30.344997],[120.242236,30.348261],[120.243947,30.354116],[120.243567,30.358188],[120.244233,30.359902],[120.247109,30.362343],[120.2468,30.363947],[120.239978,30.372146],[120.23482,30.376683],[120.23791,30.380028],[120.240334,30.387622],[120.237577,30.390062],[120.232395,30.392529],[120.228592,30.393544],[120.221294,30.387156]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330111,\"name\":\"富阳区\",\"center\":[119.949869,30.049871],\"centroid\":[119.839625,29.995216],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":8,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.996332,30.181536],[119.998994,30.182305],[120.005459,30.182346],[120.011449,30.181852],[120.013494,30.181042],[120.016156,30.177072],[120.014397,30.173816],[120.017772,30.168417],[120.018913,30.165202],[120.018438,30.162963],[120.014825,30.15891],[120.017178,30.153167],[120.016417,30.148935],[120.011663,30.142779],[120.008858,30.136719],[120.008787,30.134204],[120.007004,30.130026],[120.003819,30.12659],[120.001941,30.119567],[120.000468,30.116034],[120.001822,30.114357],[120.01095,30.116254],[120.016417,30.115718],[120.017725,30.113189],[120.016465,30.108323],[120.019151,30.10567],[120.02324,30.10633],[120.025213,30.105519],[120.030442,30.098837],[120.030846,30.094768],[120.036361,30.092555],[120.041258,30.093091],[120.043635,30.092156],[120.044894,30.086368],[120.049125,30.086849],[120.052953,30.091661],[120.054902,30.09272],[120.059513,30.092788],[120.061748,30.091853],[120.067928,30.086794],[120.076747,30.080868],[120.084615,30.078269],[120.091579,30.078475],[120.09795,30.079603],[120.108955,30.08062],[120.115088,30.082229],[120.118131,30.083796],[120.123812,30.089461],[120.124739,30.092953],[120.130349,30.099305],[120.134818,30.097669],[120.146869,30.088664],[120.140808,30.083769],[120.135079,30.080689],[120.137718,30.072177],[120.1371,30.069674],[120.134081,30.064999],[120.136886,30.061547],[120.136386,30.058934],[120.130349,30.055509],[120.12897,30.052208],[120.12569,30.050241],[120.124478,30.04833],[120.126474,30.045936],[120.129873,30.045757],[120.131133,30.044327],[120.134532,30.043983],[120.137171,30.029278],[120.136981,30.024806],[120.135555,30.021271],[120.134105,30.01058],[120.126926,29.997768],[120.124858,29.993337],[120.120294,29.990791],[120.118535,29.988272],[120.114137,29.987667],[120.110239,29.983524],[120.104463,29.981377],[120.104962,29.973614],[120.102965,29.967282],[120.101801,29.958499],[120.096001,29.952703],[120.090676,29.949123],[120.091151,29.946851],[120.100826,29.938039],[120.101325,29.936896],[120.097546,29.931126],[120.098449,29.924309],[120.096975,29.920866],[120.092126,29.916955],[120.089606,29.916514],[120.084448,29.91734],[120.081097,29.912933],[120.085542,29.906859],[120.085827,29.897437],[120.084805,29.894585],[120.082523,29.891788],[120.078268,29.88975],[120.077222,29.88822],[120.078149,29.884115],[120.082095,29.876688],[120.088156,29.871232],[120.096666,29.862399],[120.099566,29.856694],[120.104059,29.8534],[120.102442,29.849445],[120.102466,29.846812],[120.104796,29.845531],[120.10993,29.845972],[120.102015,29.832905],[120.101111,29.830258],[120.102728,29.823972],[120.09871,29.819023],[120.095834,29.816596],[120.091888,29.816679],[120.085328,29.820967],[120.080384,29.826522],[120.077198,29.828149],[120.074275,29.827336],[120.065646,29.822042],[120.061961,29.821628],[120.054355,29.823559],[120.049553,29.823917],[120.038453,29.822828],[120.036076,29.816596],[120.03106,29.810254],[120.030038,29.806283],[120.032296,29.803898],[120.034649,29.799568],[120.036218,29.79346],[120.036622,29.78884],[120.035481,29.787213],[120.030062,29.782758],[120.029776,29.779324],[120.030038,29.770552],[120.02835,29.768938],[120.025522,29.769311],[120.021718,29.767049],[120.020292,29.764855],[120.015229,29.764235],[120.011497,29.761503],[120.011212,29.757324],[120.008977,29.75713],[120.003439,29.75513],[120.000087,29.754909],[119.991958,29.753157],[119.987845,29.754909],[119.986871,29.75673],[119.981214,29.757972],[119.979859,29.759641],[119.978718,29.76589],[119.977078,29.766469],[119.973132,29.765793],[119.968639,29.762897],[119.967165,29.759986],[119.962316,29.75571],[119.960272,29.755144],[119.94765,29.756179],[119.94456,29.755503],[119.93933,29.752675],[119.937024,29.750564],[119.933079,29.749046],[119.927184,29.744438],[119.924949,29.745252],[119.924331,29.748867],[119.923166,29.750357],[119.916416,29.752344],[119.913539,29.755861],[119.907692,29.754523],[119.904364,29.754606],[119.896448,29.761159],[119.892574,29.763117],[119.89053,29.763241],[119.883921,29.763421],[119.878003,29.764966],[119.872654,29.767255],[119.870301,29.769324],[119.866403,29.776552],[119.863313,29.778772],[119.860793,29.781862],[119.860222,29.786564],[119.865761,29.797404],[119.867021,29.801389],[119.868304,29.80245],[119.871822,29.801816],[119.875364,29.802423],[119.881568,29.80587],[119.884896,29.812088],[119.882971,29.819726],[119.882329,29.826729],[119.885371,29.830934],[119.886061,29.83489],[119.889103,29.838639],[119.888889,29.842622],[119.887059,29.845668],[119.885015,29.846137],[119.865642,29.837757],[119.859937,29.837591],[119.852568,29.841216],[119.843892,29.85103],[119.840659,29.855853],[119.836618,29.85945],[119.828537,29.864563],[119.827039,29.867277],[119.82528,29.874691],[119.821786,29.879458],[119.817792,29.880629],[119.813942,29.880229],[119.802841,29.876275],[119.794307,29.874677],[119.787295,29.875131],[119.777502,29.874222],[119.763952,29.871328],[119.756607,29.871949],[119.752186,29.870019],[119.744889,29.868393],[119.74042,29.868931],[119.736688,29.870901],[119.72718,29.8655],[119.712157,29.860291],[119.710731,29.860938],[119.705549,29.867897],[119.702863,29.870419],[119.699915,29.875421],[119.692261,29.880905],[119.685748,29.881993],[119.679045,29.885437],[119.675479,29.888702],[119.675384,29.893607],[119.676311,29.899035],[119.674243,29.905109],[119.675503,29.908842],[119.675146,29.912671],[119.676121,29.916665],[119.675432,29.920012],[119.673744,29.92205],[119.668087,29.92256],[119.66628,29.927876],[119.654228,29.930616],[119.643413,29.92789],[119.637874,29.925342],[119.635426,29.924943],[119.630957,29.926568],[119.626726,29.933054],[119.627677,29.938837],[119.626061,29.942968],[119.619619,29.946039],[119.617432,29.953831],[119.611632,29.95631],[119.611466,29.962587],[119.604192,29.962298],[119.60065,29.964955],[119.599081,29.970874],[119.596324,29.972141],[119.593115,29.972279],[119.587315,29.974068],[119.58218,29.973311],[119.575121,29.977179],[119.568322,29.98157],[119.565375,29.982492],[119.560526,29.981707],[119.557958,29.980427],[119.553395,29.976683],[119.547951,29.975293],[119.540392,29.980124],[119.539204,29.982547],[119.539441,29.985988],[119.541438,29.989649],[119.53937,29.993956],[119.542769,30.002874],[119.542508,30.006727],[119.535258,30.008736],[119.530932,30.012423],[119.52449,30.014831],[119.522541,30.0164],[119.514055,30.015464],[119.508873,30.011777],[119.507161,30.011447],[119.502407,30.017432],[119.500719,30.022454],[119.501385,30.025893],[119.504047,30.031974],[119.506805,30.036335],[119.509063,30.037958],[119.511369,30.041301],[119.510798,30.043845],[119.506424,30.051246],[119.50602,30.054863],[119.50892,30.06416],[119.508635,30.066457],[119.505212,30.070128],[119.502669,30.070967],[119.499816,30.073374],[119.494706,30.072947],[119.490902,30.073924],[119.485459,30.077403],[119.481679,30.079011],[119.47519,30.080043],[119.473217,30.079671],[119.467013,30.074034],[119.465634,30.074061],[119.463043,30.077306],[119.461118,30.083535],[119.459407,30.086945],[119.4576,30.088403],[119.454106,30.088801],[119.446975,30.086629],[119.440081,30.087193],[119.437229,30.089874],[119.436373,30.094411],[119.436944,30.097037],[119.440676,30.0998],[119.446523,30.10314],[119.454201,30.105725],[119.457077,30.107264],[119.459502,30.109794],[119.460785,30.112845],[119.461332,30.118343],[119.460738,30.120185],[119.458028,30.122426],[119.452466,30.123168],[119.447307,30.125655],[119.442577,30.13015],[119.441341,30.135784],[119.443766,30.139082],[119.445834,30.140072],[119.452062,30.139288],[119.455152,30.142215],[119.459502,30.143177],[119.463828,30.145527],[119.468368,30.143205],[119.479754,30.146805],[119.483676,30.141927],[119.486695,30.141982],[119.489785,30.144923],[119.492828,30.142628],[119.498651,30.141212],[119.499412,30.14337],[119.497819,30.146091],[119.503643,30.149086],[119.503429,30.156025],[119.505664,30.158567],[119.520449,30.158938],[119.526201,30.157412],[119.529434,30.158443],[119.530195,30.160147],[119.529315,30.166411],[119.535424,30.183967],[119.539774,30.185698],[119.546549,30.186275],[119.550518,30.189228],[119.556413,30.192346],[119.561595,30.194241],[119.571246,30.196947],[119.574907,30.19615],[119.577521,30.194557],[119.580231,30.191412],[119.582513,30.186852],[119.583226,30.182429],[119.580707,30.167332],[119.582109,30.1649],[119.586126,30.164103],[119.594589,30.159212],[119.605166,30.156698],[119.607948,30.153222],[119.610063,30.146544],[119.610301,30.138505],[119.611727,30.137461],[119.615673,30.137516],[119.61679,30.136238],[119.615934,30.132926],[119.616148,30.126961],[119.619191,30.123195],[119.623375,30.122055],[119.632954,30.122659],[119.64491,30.126961],[119.651733,30.130713],[119.655797,30.130081],[119.65991,30.123498],[119.662239,30.120927],[119.672246,30.116502],[119.673221,30.115581],[119.67498,30.110041],[119.67971,30.105106],[119.687578,30.099896],[119.691049,30.098356],[119.70039,30.09617],[119.701413,30.092087],[119.736165,30.084814],[119.73916,30.085625],[119.741228,30.089901],[119.744698,30.092073],[119.747432,30.091455],[119.751116,30.08733],[119.7553,30.085199],[119.76747,30.082133],[119.770822,30.082091],[119.777573,30.083054],[119.779237,30.08458],[119.780188,30.096363],[119.782113,30.099484],[119.783824,30.100034],[119.78827,30.098521],[119.790005,30.099346],[119.789791,30.105189],[119.791003,30.107361],[119.797136,30.110344],[119.80208,30.111691],[119.802532,30.117807],[119.804671,30.122302],[119.807809,30.124762],[119.81059,30.125807],[119.814512,30.130479],[119.821762,30.132582],[119.826136,30.133365],[119.828584,30.140608],[119.831199,30.14359],[119.829582,30.156464],[119.834455,30.160545],[119.840564,30.166453],[119.853472,30.174929],[119.85718,30.177951],[119.861981,30.180726],[119.871656,30.182662],[119.880499,30.187703],[119.887677,30.18975],[119.894975,30.193417],[119.901393,30.188843],[119.903936,30.187648],[119.909166,30.19089],[119.914514,30.191824],[119.92155,30.190904],[119.926613,30.189681],[119.929751,30.188129],[119.935028,30.178981],[119.935265,30.177896],[119.932841,30.169626],[119.933102,30.163952],[119.934338,30.160202],[119.938736,30.158704],[119.942016,30.160476],[119.945392,30.16501],[119.951168,30.168307],[119.955993,30.168733],[119.959274,30.168005],[119.963101,30.170464],[119.964669,30.172854],[119.974296,30.175107],[119.980168,30.17405],[119.987988,30.174901],[119.996332,30.181536]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330112,\"name\":\"临安区\",\"center\":[119.715101,30.231153],\"centroid\":[119.343878,30.201776],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":9,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.236369,29.950968],[119.235537,29.955332],[119.233184,29.957618],[119.228121,29.959614],[119.224769,29.959476],[119.217662,29.956282],[119.210673,29.958127],[119.208534,29.957989],[119.204279,29.961624],[119.197006,29.962436],[119.19363,29.963744],[119.184431,29.965588],[119.178251,29.964859],[119.173734,29.962766],[119.169741,29.964749],[119.161588,29.966318],[119.158616,29.970227],[119.153553,29.969291],[119.14937,29.970737],[119.14956,29.973366],[119.14811,29.974687],[119.142001,29.975637],[119.135512,29.980909],[119.132089,29.981721],[119.12182,29.978652],[119.12037,29.978872],[119.115901,29.98691],[119.113334,29.993447],[119.110196,29.997768],[119.11312,30.001498],[119.114546,30.009506],[119.11205,30.010965],[119.107986,30.011873],[119.097764,30.012616],[119.089896,30.013854],[119.085332,30.012754],[119.081458,30.009933],[119.077013,30.008763],[119.064414,30.008364],[119.058805,30.009217],[119.054051,30.008282],[119.051911,30.007098],[119.046824,30.011158],[119.039883,30.01058],[119.034963,30.013373],[119.031112,30.01845],[119.025122,30.021078],[119.024243,30.022454],[119.031683,30.031066],[119.032015,30.032662],[119.030138,30.035083],[119.026952,30.035],[119.021247,30.032744],[119.016161,30.032662],[119.004751,30.024311],[118.999355,30.021614],[118.988326,30.017996],[118.9864,30.025329],[118.987113,30.027283],[118.9864,30.031424],[118.982454,30.034643],[118.979721,30.032442],[118.975894,30.027943],[118.970664,30.026375],[118.969381,30.023458],[118.966457,30.022137],[118.96263,30.023444],[118.956093,30.021449],[118.95412,30.018766],[118.949199,30.016813],[118.940286,30.010249],[118.93634,30.010951],[118.932703,30.009575],[118.932109,30.008158],[118.927973,30.011584],[118.923789,30.009795],[118.917086,30.013056],[118.913211,30.012382],[118.909313,30.01391],[118.90501,30.012836],[118.898355,30.015547],[118.897404,30.01673],[118.89883,30.018766],[118.902586,30.029057],[118.901516,30.031314],[118.895597,30.032455],[118.892269,30.039017],[118.890582,30.041273],[118.891342,30.043034],[118.897333,30.049623],[118.897356,30.051864],[118.89391,30.054932],[118.88811,30.062372],[118.885067,30.064036],[118.878815,30.064655],[118.875464,30.07204],[118.87506,30.079039],[118.873729,30.081748],[118.872992,30.087028],[118.872611,30.095401],[118.868856,30.101463],[118.869117,30.107402],[118.871637,30.11301],[118.873895,30.115058],[118.878055,30.116735],[118.883855,30.116392],[118.88723,30.11745],[118.888609,30.122357],[118.888656,30.128432],[118.893387,30.133091],[118.895978,30.138794],[118.896952,30.1444],[118.896786,30.148083],[118.895098,30.148495],[118.890938,30.147451],[118.881026,30.146805],[118.874988,30.148193],[118.870543,30.151161],[118.865718,30.151491],[118.862081,30.148894],[118.8564,30.14822],[118.852145,30.149924],[118.846987,30.153881],[118.845703,30.156135],[118.846797,30.161053],[118.84808,30.163046],[118.852858,30.166549],[118.858349,30.168087],[118.864411,30.168994],[118.870282,30.171055],[118.873681,30.172923],[118.884259,30.176811],[118.891628,30.18041],[118.9028,30.183226],[118.904796,30.18655],[118.91081,30.187484],[118.912165,30.1885],[118.915707,30.194392],[118.920651,30.199021],[118.929232,30.201918],[118.92909,30.20667],[118.926142,30.212643],[118.923385,30.214511],[118.919368,30.215225],[118.911452,30.215321],[118.905201,30.216571],[118.90318,30.21793],[118.899876,30.223422],[118.896168,30.234557],[118.893529,30.23976],[118.892531,30.243247],[118.889726,30.24499],[118.882429,30.247475],[118.881549,30.251153],[118.882357,30.252348],[118.888965,30.253775],[118.889441,30.255724],[118.886541,30.260734],[118.885043,30.268379],[118.879861,30.278355],[118.878079,30.282719],[118.877199,30.288071],[118.877508,30.290815],[118.880574,30.294519],[118.881811,30.298512],[118.881549,30.304603],[118.879196,30.312189],[118.879885,30.314878],[118.889607,30.317018],[118.894124,30.319089],[118.899781,30.322587],[118.90841,30.330871],[118.911143,30.332229],[118.917894,30.332449],[118.9226,30.334753],[118.928282,30.339978],[118.933559,30.342131],[118.93634,30.345066],[118.937362,30.348713],[118.936435,30.350811],[118.94977,30.358778],[118.954191,30.360341],[118.955404,30.359189],[118.956592,30.352059],[118.959373,30.347287],[118.964056,30.350578],[118.969048,30.351332],[118.972708,30.347534],[118.975751,30.347164],[118.985735,30.34955],[118.988112,30.348672],[118.988539,30.346547],[118.987755,30.340705],[118.98804,30.333477],[118.989157,30.33238],[118.996312,30.330501],[119.004442,30.328938],[119.007152,30.327717],[119.010598,30.323561],[119.01376,30.321531],[119.018538,30.32042],[119.02158,30.315509],[119.024742,30.313657],[119.028783,30.312587],[119.037197,30.312066],[119.046872,30.313191],[119.048322,30.31267],[119.050414,30.309268],[119.050842,30.30673],[119.052672,30.305221],[119.05676,30.303876],[119.059874,30.303849],[119.062988,30.30496],[119.067077,30.308197],[119.069858,30.312135],[119.0734,30.31588],[119.08267,30.321627],[119.090253,30.324014],[119.0932,30.322957],[119.094959,30.320653],[119.102328,30.31758],[119.105466,30.314631],[119.111028,30.311298],[119.119467,30.310104],[119.125671,30.305371],[119.128499,30.304727],[119.151271,30.304603],[119.154599,30.302833],[119.156739,30.299541],[119.160875,30.298114],[119.163584,30.299664],[119.166294,30.298827],[119.170525,30.295342],[119.173996,30.294711],[119.179629,30.295384],[119.18821,30.291652],[119.19092,30.291954],[119.201046,30.291021],[119.203709,30.296262],[119.204065,30.299349],[119.205682,30.301558],[119.210602,30.299431],[119.212908,30.299239],[119.218019,30.301338],[119.222606,30.299623],[119.224032,30.296564],[119.223747,30.291281],[119.225482,30.288798],[119.229191,30.289662],[119.233731,30.293394],[119.238152,30.301365],[119.243072,30.313287],[119.245925,30.321613],[119.244095,30.324452],[119.239982,30.327031],[119.241575,30.33153],[119.247137,30.340814],[119.248849,30.341541],[119.252747,30.340334],[119.257121,30.337756],[119.261209,30.337249],[119.26506,30.338058],[119.270599,30.342062],[119.272334,30.34257],[119.275757,30.34091],[119.278158,30.341582],[119.289448,30.349646],[119.297507,30.35764],[119.300668,30.363686],[119.31077,30.366387],[119.326554,30.371762],[119.329074,30.371515],[119.336347,30.366264],[119.342647,30.363152],[119.343788,30.360684],[119.344881,30.354143],[119.349445,30.349152],[119.356077,30.349426],[119.368247,30.35295],[119.375616,30.354815],[119.381083,30.35812],[119.386146,30.363906],[119.391875,30.366305],[119.395845,30.36625],[119.399981,30.3678],[119.403047,30.373325],[119.407136,30.373325],[119.418141,30.376108],[119.421113,30.379727],[119.426556,30.383949],[119.430502,30.384058],[119.432784,30.386485],[119.434186,30.390254],[119.435708,30.391501],[119.441032,30.392461],[119.445739,30.399191],[119.448425,30.405235],[119.450231,30.410826],[119.451848,30.412169],[119.455865,30.411991],[119.467013,30.40814],[119.477329,30.40729],[119.483819,30.408318],[119.490403,30.408208],[119.498889,30.406865],[119.506092,30.404673],[119.513151,30.401671],[119.516907,30.402535],[119.522232,30.404673],[119.528626,30.408524],[119.533451,30.409414],[119.535733,30.411662],[119.536446,30.414403],[119.53483,30.420788],[119.535305,30.424049],[119.544386,30.431065],[119.54662,30.434805],[119.551731,30.439765],[119.565922,30.443381],[119.569107,30.44097],[119.571864,30.436915],[119.572839,30.431325],[119.579708,30.424748],[119.5818,30.423625],[119.591665,30.421638],[119.597893,30.422446],[119.602789,30.425886],[119.606569,30.427146],[119.613011,30.426023],[119.618026,30.427324],[119.623018,30.429763],[119.627653,30.433024],[119.633881,30.440217],[119.63709,30.441833],[119.642296,30.440217],[119.645101,30.437764],[119.645671,30.429845],[119.637161,30.428708],[119.632193,30.42716],[119.631052,30.423282],[119.634071,30.414992],[119.635878,30.406249],[119.635973,30.403617],[119.632383,30.399766],[119.640014,30.39793],[119.644411,30.395764],[119.649783,30.395449],[119.658151,30.397464],[119.661859,30.397409],[119.667397,30.399108],[119.677856,30.40618],[119.681089,30.408729],[119.685011,30.406605],[119.696445,30.401918],[119.704027,30.399684],[119.718385,30.390199],[119.723258,30.388472],[119.726253,30.389624],[119.735571,30.395682],[119.742321,30.393338],[119.744722,30.393804],[119.749048,30.392543],[119.755585,30.388815],[119.753303,30.386553],[119.750237,30.385292],[119.749262,30.383757],[119.749904,30.381399],[119.757534,30.378561],[119.768825,30.376752],[119.771107,30.375998],[119.772771,30.3739],[119.774578,30.367471],[119.78033,30.365647],[119.788602,30.35971],[119.791764,30.356899],[119.795163,30.348988],[119.798895,30.344215],[119.804647,30.342392],[119.807262,30.334437],[119.807666,30.328992],[119.806549,30.325851],[119.80227,30.322614],[119.803839,30.316099],[119.803554,30.311462],[119.802365,30.307868],[119.799085,30.30175],[119.799893,30.297483],[119.808023,30.295342],[119.821001,30.304096],[119.826302,30.306743],[119.83108,30.307745],[119.833433,30.307127],[119.836286,30.29928],[119.837118,30.29382],[119.836761,30.289525],[119.830438,30.286328],[119.827871,30.283789],[119.827657,30.282074],[119.829273,30.278548],[119.828513,30.269216],[119.829083,30.268516],[119.839471,30.27148],[119.844225,30.272194],[119.846816,30.270245],[119.853686,30.273841],[119.859985,30.272825],[119.864715,30.273264],[119.864976,30.271068],[119.867282,30.26938],[119.86588,30.268392],[119.86569,30.265236],[119.863479,30.263218],[119.862837,30.260501],[119.865,30.258922],[119.864477,30.256232],[119.868304,30.252718],[119.86752,30.249795],[119.86298,30.237852],[119.856657,30.227843],[119.853876,30.225276],[119.849787,30.223093],[119.846412,30.222502],[119.844914,30.221047],[119.845057,30.217189],[119.843132,30.214442],[119.84161,30.20667],[119.836452,30.199378],[119.836095,30.197949],[119.839495,30.19387],[119.842656,30.191123],[119.845413,30.190437],[119.84905,30.188074],[119.850168,30.181357],[119.853472,30.174929],[119.840564,30.166453],[119.834455,30.160545],[119.829582,30.156464],[119.831199,30.14359],[119.828584,30.140608],[119.826136,30.133365],[119.821762,30.132582],[119.814512,30.130479],[119.81059,30.125807],[119.807809,30.124762],[119.804671,30.122302],[119.802532,30.117807],[119.80208,30.111691],[119.797136,30.110344],[119.791003,30.107361],[119.789791,30.105189],[119.790005,30.099346],[119.78827,30.098521],[119.783824,30.100034],[119.782113,30.099484],[119.780188,30.096363],[119.779237,30.08458],[119.777573,30.083054],[119.770822,30.082091],[119.76747,30.082133],[119.7553,30.085199],[119.751116,30.08733],[119.747432,30.091455],[119.744698,30.092073],[119.741228,30.089901],[119.73916,30.085625],[119.736165,30.084814],[119.701413,30.092087],[119.70039,30.09617],[119.691049,30.098356],[119.687578,30.099896],[119.67971,30.105106],[119.67498,30.110041],[119.673221,30.115581],[119.672246,30.116502],[119.662239,30.120927],[119.65991,30.123498],[119.655797,30.130081],[119.651733,30.130713],[119.64491,30.126961],[119.632954,30.122659],[119.623375,30.122055],[119.619191,30.123195],[119.616148,30.126961],[119.615934,30.132926],[119.61679,30.136238],[119.615673,30.137516],[119.611727,30.137461],[119.610301,30.138505],[119.610063,30.146544],[119.607948,30.153222],[119.605166,30.156698],[119.594589,30.159212],[119.586126,30.164103],[119.582109,30.1649],[119.580707,30.167332],[119.583226,30.182429],[119.582513,30.186852],[119.580231,30.191412],[119.577521,30.194557],[119.574907,30.19615],[119.571246,30.196947],[119.561595,30.194241],[119.556413,30.192346],[119.550518,30.189228],[119.546549,30.186275],[119.539774,30.185698],[119.535424,30.183967],[119.529315,30.166411],[119.530195,30.160147],[119.529434,30.158443],[119.526201,30.157412],[119.520449,30.158938],[119.505664,30.158567],[119.503429,30.156025],[119.503643,30.149086],[119.497819,30.146091],[119.499412,30.14337],[119.498651,30.141212],[119.492828,30.142628],[119.489785,30.144923],[119.486695,30.141982],[119.483676,30.141927],[119.479754,30.146805],[119.468368,30.143205],[119.463828,30.145527],[119.459502,30.143177],[119.455152,30.142215],[119.452062,30.139288],[119.445834,30.140072],[119.443766,30.139082],[119.441341,30.135784],[119.442577,30.13015],[119.447307,30.125655],[119.452466,30.123168],[119.458028,30.122426],[119.460738,30.120185],[119.461332,30.118343],[119.460785,30.112845],[119.459502,30.109794],[119.457077,30.107264],[119.454201,30.105725],[119.446523,30.10314],[119.440676,30.0998],[119.436944,30.097037],[119.436373,30.094411],[119.437229,30.089874],[119.440081,30.087193],[119.43623,30.086038],[119.431785,30.082559],[119.429741,30.079314],[119.430597,30.074542],[119.433164,30.071531],[119.434044,30.068877],[119.43257,30.067405],[119.42299,30.06537],[119.420399,30.063514],[119.420304,30.062083],[119.427673,30.057173],[119.430169,30.053116],[119.430502,30.050021],[119.433497,30.044588],[119.433117,30.040407],[119.431476,30.037559],[119.430763,30.032813],[119.431096,30.029773],[119.430335,30.024683],[119.432308,30.015423],[119.433568,30.013166],[119.426603,30.000548],[119.426485,29.994741],[119.425058,29.991589],[119.420542,29.991837],[119.412817,29.99525],[119.405353,29.997245],[119.397176,29.995608],[119.38926,29.993186],[119.386978,29.989428],[119.381582,29.991438],[119.36858,29.998828],[119.358287,30.002268],[119.345071,30.004264],[119.338915,30.007195],[119.334374,30.007814],[119.321752,29.999805],[119.318543,29.996034],[119.314098,29.997493],[119.309487,29.993805],[119.30547,29.994204],[119.297958,30.001223],[119.29734,30.003342],[119.299384,30.007222],[119.296532,30.011103],[119.29444,30.012726],[119.290494,30.013744],[119.282603,30.009933],[119.278514,30.005571],[119.274901,30.002736],[119.270456,30.001016],[119.268364,30.001897],[119.265274,30.005557],[119.263135,30.005007],[119.260876,30.002846],[119.256217,30.000108],[119.250346,29.999599],[119.248373,29.998718],[119.246472,29.992291],[119.247922,29.98852],[119.253769,29.983964],[119.255148,29.981212],[119.252961,29.975775],[119.253817,29.968025],[119.255433,29.962078],[119.259569,29.95547],[119.259403,29.951395],[119.258048,29.9463],[119.258214,29.943794],[119.259854,29.940572],[119.25762,29.936799],[119.25472,29.935188],[119.24747,29.934376],[119.24476,29.935491],[119.241171,29.940641],[119.240434,29.943588],[119.237819,29.946906],[119.236369,29.950968]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330122,\"name\":\"桐庐县\",\"center\":[119.685045,29.797437],\"centroid\":[119.553936,29.830649],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":10,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.440081,30.087193],[119.446975,30.086629],[119.454106,30.088801],[119.4576,30.088403],[119.459407,30.086945],[119.461118,30.083535],[119.463043,30.077306],[119.465634,30.074061],[119.467013,30.074034],[119.473217,30.079671],[119.47519,30.080043],[119.481679,30.079011],[119.485459,30.077403],[119.490902,30.073924],[119.494706,30.072947],[119.499816,30.073374],[119.502669,30.070967],[119.505212,30.070128],[119.508635,30.066457],[119.50892,30.06416],[119.50602,30.054863],[119.506424,30.051246],[119.510798,30.043845],[119.511369,30.041301],[119.509063,30.037958],[119.506805,30.036335],[119.504047,30.031974],[119.501385,30.025893],[119.500719,30.022454],[119.502407,30.017432],[119.507161,30.011447],[119.508873,30.011777],[119.514055,30.015464],[119.522541,30.0164],[119.52449,30.014831],[119.530932,30.012423],[119.535258,30.008736],[119.542508,30.006727],[119.542769,30.002874],[119.53937,29.993956],[119.541438,29.989649],[119.539441,29.985988],[119.539204,29.982547],[119.540392,29.980124],[119.547951,29.975293],[119.553395,29.976683],[119.557958,29.980427],[119.560526,29.981707],[119.565375,29.982492],[119.568322,29.98157],[119.575121,29.977179],[119.58218,29.973311],[119.587315,29.974068],[119.593115,29.972279],[119.596324,29.972141],[119.599081,29.970874],[119.60065,29.964955],[119.604192,29.962298],[119.611466,29.962587],[119.611632,29.95631],[119.617432,29.953831],[119.619619,29.946039],[119.626061,29.942968],[119.627677,29.938837],[119.626726,29.933054],[119.630957,29.926568],[119.635426,29.924943],[119.637874,29.925342],[119.643413,29.92789],[119.654228,29.930616],[119.66628,29.927876],[119.668087,29.92256],[119.673744,29.92205],[119.675432,29.920012],[119.676121,29.916665],[119.675146,29.912671],[119.675503,29.908842],[119.674243,29.905109],[119.676311,29.899035],[119.675384,29.893607],[119.675479,29.888702],[119.679045,29.885437],[119.685748,29.881993],[119.692261,29.880905],[119.699915,29.875421],[119.702863,29.870419],[119.705549,29.867897],[119.710731,29.860938],[119.712157,29.860291],[119.72718,29.8655],[119.736688,29.870901],[119.74042,29.868931],[119.744889,29.868393],[119.752186,29.870019],[119.756607,29.871949],[119.763952,29.871328],[119.777502,29.874222],[119.787295,29.875131],[119.794307,29.874677],[119.802841,29.876275],[119.813942,29.880229],[119.817792,29.880629],[119.821786,29.879458],[119.82528,29.874691],[119.827039,29.867277],[119.828537,29.864563],[119.836618,29.85945],[119.840659,29.855853],[119.843892,29.85103],[119.852568,29.841216],[119.859937,29.837591],[119.865642,29.837757],[119.885015,29.846137],[119.887059,29.845668],[119.888889,29.842622],[119.889103,29.838639],[119.886061,29.83489],[119.885371,29.830934],[119.882329,29.826729],[119.882971,29.819726],[119.884896,29.812088],[119.881568,29.80587],[119.875364,29.802423],[119.871822,29.801816],[119.868304,29.80245],[119.867021,29.801389],[119.865761,29.797404],[119.860222,29.786564],[119.860793,29.781862],[119.863313,29.778772],[119.866403,29.776552],[119.870301,29.769324],[119.872654,29.767255],[119.878003,29.764966],[119.883921,29.763421],[119.89053,29.763241],[119.890221,29.758496],[119.888794,29.755972],[119.88908,29.753102],[119.890981,29.750426],[119.894476,29.748757],[119.900466,29.744645],[119.898612,29.740617],[119.901393,29.728612],[119.905648,29.72766],[119.911376,29.722582],[119.91247,29.720402],[119.911376,29.715944],[119.91178,29.71364],[119.915584,29.707967],[119.914252,29.705524],[119.919529,29.699562],[119.922525,29.697753],[119.928657,29.698858],[119.931676,29.696691],[119.933768,29.698582],[119.930084,29.701936],[119.930226,29.704503],[119.933578,29.706739],[119.937761,29.70747],[119.941517,29.705234],[119.94494,29.704903],[119.948149,29.703068],[119.951287,29.699299],[119.957942,29.698416],[119.960129,29.696967],[119.967403,29.694896],[119.973441,29.689941],[119.973797,29.678648],[119.973155,29.673098],[119.970778,29.670765],[119.966832,29.670958],[119.959083,29.672822],[119.948862,29.668017],[119.945653,29.667368],[119.940733,29.667506],[119.936169,29.666526],[119.924806,29.669895],[119.92281,29.668487],[119.921265,29.664027],[119.918246,29.664386],[119.914514,29.66625],[119.911709,29.666498],[119.908595,29.663074],[119.902344,29.661403],[119.895712,29.660644],[119.887178,29.662039],[119.883494,29.663433],[119.879286,29.667934],[119.875816,29.668984],[119.873058,29.668666],[119.869992,29.66995],[119.863384,29.669481],[119.859533,29.671345],[119.856538,29.671027],[119.852521,29.668887],[119.842157,29.675556],[119.837664,29.676453],[119.835454,29.678124],[119.836904,29.68076],[119.835359,29.682251],[119.824472,29.671856],[119.821738,29.671193],[119.817602,29.673057],[119.814132,29.671359],[119.810709,29.667493],[119.809972,29.665201],[119.805313,29.664952],[119.802484,29.663254],[119.79918,29.660078],[119.798253,29.656929],[119.796351,29.655687],[119.793214,29.656101],[119.79117,29.654969],[119.788151,29.645205],[119.781067,29.638618],[119.777525,29.628645],[119.776527,29.62685],[119.776218,29.620233],[119.779831,29.613285],[119.780069,29.609458],[119.779308,29.604001],[119.774364,29.599179],[119.76728,29.597659],[119.765307,29.596402],[119.762312,29.597811],[119.757843,29.598447],[119.750142,29.602978],[119.746434,29.606419],[119.742393,29.609195],[119.731126,29.613547],[119.728368,29.613506],[119.723899,29.610535],[119.718575,29.610439],[119.717315,29.608781],[119.715247,29.601804],[119.709376,29.595863],[119.708282,29.589673],[119.704075,29.587641],[119.701318,29.58959],[119.698322,29.593721],[119.695256,29.596719],[119.692998,29.602633],[119.695375,29.616034],[119.694876,29.619985],[119.693307,29.620965],[119.688363,29.62109],[119.679663,29.62685],[119.678593,29.634018],[119.676192,29.636325],[119.673031,29.636905],[119.670226,29.640979],[119.672104,29.648658],[119.674505,29.653809],[119.670844,29.657137],[119.667968,29.657316],[119.665305,29.653836],[119.658792,29.652013],[119.651043,29.651641],[119.64705,29.65229],[119.643579,29.653961],[119.636733,29.652939],[119.634689,29.653243],[119.62946,29.656239],[119.621972,29.65472],[119.616148,29.656805],[119.617479,29.662757],[119.616909,29.664648],[119.613581,29.669757],[119.612749,29.673029],[119.614128,29.684999],[119.610776,29.688229],[119.610895,29.695227],[119.602528,29.700859],[119.604144,29.708837],[119.603978,29.713419],[119.601815,29.716055],[119.596229,29.717352],[119.593448,29.723203],[119.59176,29.724818],[119.583726,29.729385],[119.581895,29.73111],[119.578306,29.738299],[119.577212,29.741569],[119.574099,29.745197],[119.571698,29.749847],[119.569131,29.751695],[119.560431,29.752316],[119.549472,29.749916],[119.544695,29.747432],[119.543696,29.746122],[119.540511,29.737319],[119.537064,29.736933],[119.531954,29.733925],[119.528269,29.733897],[119.522969,29.731013],[119.520187,29.728792],[119.50835,29.725273],[119.504879,29.722872],[119.50022,29.722679],[119.493802,29.721285],[119.492376,29.722334],[119.484556,29.731262],[119.478019,29.732338],[119.476379,29.733373],[119.472932,29.739361],[119.465753,29.741693],[119.458955,29.744935],[119.454938,29.741983],[119.451206,29.741555],[119.447094,29.743183],[119.44203,29.741651],[119.439867,29.742231],[119.434519,29.748384],[119.425938,29.753171],[119.425439,29.75582],[119.42261,29.758469],[119.417547,29.757048],[119.415431,29.750233],[119.411343,29.745266],[119.407088,29.7431],[119.398792,29.744328],[119.393563,29.748301],[119.392374,29.750357],[119.394323,29.759807],[119.391495,29.7624],[119.390924,29.764979],[119.388357,29.769628],[119.383579,29.770952],[119.380489,29.766993],[119.374142,29.760662],[119.373405,29.758758],[119.373857,29.754978],[119.370624,29.752688],[119.365823,29.750398],[119.36423,29.746397],[119.360332,29.741638],[119.358074,29.737968],[119.355768,29.73231],[119.354056,29.730185],[119.354508,29.725825],[119.352915,29.722334],[119.350015,29.719643],[119.34828,29.715116],[119.344168,29.717435],[119.341434,29.717366],[119.334184,29.714992],[119.327933,29.714316],[119.32218,29.716248],[119.31745,29.717173],[119.316547,29.719808],[119.31707,29.723617],[119.314431,29.724983],[119.308893,29.724721],[119.302451,29.725715],[119.298529,29.724831],[119.291184,29.725356],[119.287547,29.728198],[119.286881,29.730917],[119.28807,29.737954],[119.290233,29.740575],[119.292016,29.746218],[119.293299,29.760607],[119.294369,29.764028],[119.293989,29.768373],[119.294892,29.771766],[119.294369,29.775379],[119.286002,29.781793],[119.28246,29.786151],[119.273118,29.791612],[119.270765,29.795404],[119.272334,29.799624],[119.278609,29.804739],[119.279417,29.807938],[119.278823,29.813329],[119.27502,29.818527],[119.273903,29.828135],[119.274402,29.830175],[119.272215,29.83267],[119.267675,29.833759],[119.26594,29.833043],[119.257739,29.823503],[119.255409,29.821808],[119.251297,29.822235],[119.247209,29.824317],[119.241718,29.828397],[119.239079,29.831568],[119.233564,29.831568],[119.225506,29.834283],[119.222036,29.839177],[119.219017,29.839645],[119.213478,29.836213],[119.204232,29.833718],[119.196221,29.837123],[119.193939,29.83868],[119.189946,29.846495],[119.182933,29.852243],[119.182482,29.860497],[119.185382,29.865706],[119.188329,29.86776],[119.191419,29.873189],[119.191348,29.878741],[119.194581,29.884115],[119.198669,29.889612],[119.205705,29.896582],[119.207726,29.897271],[119.213692,29.896155],[119.219088,29.896541],[119.222368,29.897561],[119.225934,29.900302],[119.227669,29.902588],[119.228644,29.910605],[119.226766,29.912451],[119.227717,29.91617],[119.221703,29.917905],[119.218613,29.922298],[119.218328,29.927559],[119.222036,29.932916],[119.220277,29.936083],[119.216925,29.936662],[119.21141,29.935932],[119.208106,29.93629],[119.204113,29.937901],[119.197338,29.935119],[119.190968,29.936965],[119.18802,29.936689],[119.181127,29.941701],[119.180865,29.945144],[119.183242,29.949026],[119.190136,29.952042],[119.194462,29.953033],[119.205254,29.949192],[119.212076,29.946452],[119.217234,29.945529],[119.223509,29.946094],[119.226956,29.947787],[119.23114,29.951339],[119.236369,29.950968],[119.237819,29.946906],[119.240434,29.943588],[119.241171,29.940641],[119.24476,29.935491],[119.24747,29.934376],[119.25472,29.935188],[119.25762,29.936799],[119.259854,29.940572],[119.258214,29.943794],[119.258048,29.9463],[119.259403,29.951395],[119.259569,29.95547],[119.255433,29.962078],[119.253817,29.968025],[119.252961,29.975775],[119.255148,29.981212],[119.253769,29.983964],[119.247922,29.98852],[119.246472,29.992291],[119.248373,29.998718],[119.250346,29.999599],[119.256217,30.000108],[119.260876,30.002846],[119.263135,30.005007],[119.265274,30.005557],[119.268364,30.001897],[119.270456,30.001016],[119.274901,30.002736],[119.278514,30.005571],[119.282603,30.009933],[119.290494,30.013744],[119.29444,30.012726],[119.296532,30.011103],[119.299384,30.007222],[119.29734,30.003342],[119.297958,30.001223],[119.30547,29.994204],[119.309487,29.993805],[119.314098,29.997493],[119.318543,29.996034],[119.321752,29.999805],[119.334374,30.007814],[119.338915,30.007195],[119.345071,30.004264],[119.358287,30.002268],[119.36858,29.998828],[119.381582,29.991438],[119.386978,29.989428],[119.38926,29.993186],[119.397176,29.995608],[119.405353,29.997245],[119.412817,29.99525],[119.420542,29.991837],[119.425058,29.991589],[119.426485,29.994741],[119.426603,30.000548],[119.433568,30.013166],[119.432308,30.015423],[119.430335,30.024683],[119.431096,30.029773],[119.430763,30.032813],[119.431476,30.037559],[119.433117,30.040407],[119.433497,30.044588],[119.430502,30.050021],[119.430169,30.053116],[119.427673,30.057173],[119.420304,30.062083],[119.420399,30.063514],[119.42299,30.06537],[119.43257,30.067405],[119.434044,30.068877],[119.433164,30.071531],[119.430597,30.074542],[119.429741,30.079314],[119.431785,30.082559],[119.43623,30.086038],[119.440081,30.087193]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330127,\"name\":\"淳安县\",\"center\":[119.044276,29.604177],\"centroid\":[118.889354,29.608818],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":11,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[118.897404,30.01673],[118.898355,30.015547],[118.90501,30.012836],[118.909313,30.01391],[118.913211,30.012382],[118.917086,30.013056],[118.923789,30.009795],[118.927973,30.011584],[118.932109,30.008158],[118.932703,30.009575],[118.93634,30.010951],[118.940286,30.010249],[118.949199,30.016813],[118.95412,30.018766],[118.956093,30.021449],[118.96263,30.023444],[118.966457,30.022137],[118.969381,30.023458],[118.970664,30.026375],[118.975894,30.027943],[118.979721,30.032442],[118.982454,30.034643],[118.9864,30.031424],[118.987113,30.027283],[118.9864,30.025329],[118.988326,30.017996],[118.999355,30.021614],[119.004751,30.024311],[119.016161,30.032662],[119.021247,30.032744],[119.026952,30.035],[119.030138,30.035083],[119.032015,30.032662],[119.031683,30.031066],[119.024243,30.022454],[119.025122,30.021078],[119.031112,30.01845],[119.034963,30.013373],[119.039883,30.01058],[119.046824,30.011158],[119.051911,30.007098],[119.054051,30.008282],[119.058805,30.009217],[119.064414,30.008364],[119.077013,30.008763],[119.081458,30.009933],[119.085332,30.012754],[119.089896,30.013854],[119.097764,30.012616],[119.107986,30.011873],[119.11205,30.010965],[119.114546,30.009506],[119.11312,30.001498],[119.110196,29.997768],[119.113334,29.993447],[119.115901,29.98691],[119.12037,29.978872],[119.12182,29.978652],[119.132089,29.981721],[119.135512,29.980909],[119.142001,29.975637],[119.14811,29.974687],[119.14956,29.973366],[119.14937,29.970737],[119.153553,29.969291],[119.158616,29.970227],[119.161588,29.966318],[119.169741,29.964749],[119.173734,29.962766],[119.178251,29.964859],[119.184431,29.965588],[119.19363,29.963744],[119.197006,29.962436],[119.204279,29.961624],[119.208534,29.957989],[119.210673,29.958127],[119.217662,29.956282],[119.224769,29.959476],[119.228121,29.959614],[119.233184,29.957618],[119.235537,29.955332],[119.236369,29.950968],[119.23114,29.951339],[119.226956,29.947787],[119.223509,29.946094],[119.217234,29.945529],[119.212076,29.946452],[119.205254,29.949192],[119.194462,29.953033],[119.190136,29.952042],[119.183242,29.949026],[119.180865,29.945144],[119.181127,29.941701],[119.18802,29.936689],[119.190968,29.936965],[119.197338,29.935119],[119.204113,29.937901],[119.208106,29.93629],[119.21141,29.935932],[119.216925,29.936662],[119.220277,29.936083],[119.222036,29.932916],[119.218328,29.927559],[119.218613,29.922298],[119.221703,29.917905],[119.227717,29.91617],[119.226766,29.912451],[119.228644,29.910605],[119.227669,29.902588],[119.225934,29.900302],[119.222368,29.897561],[119.219088,29.896541],[119.213692,29.896155],[119.207726,29.897271],[119.205705,29.896582],[119.198669,29.889612],[119.194581,29.884115],[119.191348,29.878741],[119.191419,29.873189],[119.188329,29.86776],[119.185382,29.865706],[119.182482,29.860497],[119.182933,29.852243],[119.189946,29.846495],[119.193939,29.83868],[119.196221,29.837123],[119.204232,29.833718],[119.213478,29.836213],[119.219017,29.839645],[119.222036,29.839177],[119.225506,29.834283],[119.233564,29.831568],[119.239079,29.831568],[119.241718,29.828397],[119.247209,29.824317],[119.251297,29.822235],[119.255409,29.821808],[119.257739,29.823503],[119.26594,29.833043],[119.267675,29.833759],[119.272215,29.83267],[119.274402,29.830175],[119.273903,29.828135],[119.27502,29.818527],[119.278823,29.813329],[119.279417,29.807938],[119.278609,29.804739],[119.272334,29.799624],[119.270765,29.795404],[119.273118,29.791612],[119.28246,29.786151],[119.286002,29.781793],[119.294369,29.775379],[119.294892,29.771766],[119.293989,29.768373],[119.294369,29.764028],[119.293299,29.760607],[119.292016,29.746218],[119.290233,29.740575],[119.28807,29.737954],[119.286881,29.730917],[119.287547,29.728198],[119.291184,29.725356],[119.298529,29.724831],[119.302451,29.725715],[119.308893,29.724721],[119.314431,29.724983],[119.31707,29.723617],[119.316547,29.719808],[119.31745,29.717173],[119.32218,29.716248],[119.327933,29.714316],[119.334184,29.714992],[119.341434,29.717366],[119.344168,29.717435],[119.34828,29.715116],[119.345642,29.711224],[119.336942,29.702336],[119.33504,29.701715],[119.332924,29.702791],[119.330619,29.702115],[119.329763,29.699769],[119.323297,29.693171],[119.321657,29.688422],[119.320588,29.6792],[119.31852,29.676964],[119.315548,29.670309],[119.314621,29.669453],[119.309035,29.668017],[119.30673,29.661776],[119.306706,29.654154],[119.305517,29.651392],[119.303259,29.649735],[119.299194,29.649113],[119.293085,29.65066],[119.286572,29.647401],[119.277777,29.640758],[119.276969,29.63812],[119.274853,29.636228],[119.267508,29.633093],[119.263824,29.630745],[119.257382,29.628866],[119.254292,29.626629],[119.252913,29.623314],[119.251654,29.61747],[119.248849,29.614887],[119.251249,29.610826],[119.248231,29.605617],[119.246971,29.599483],[119.247304,29.59759],[119.243025,29.590087],[119.234967,29.582086],[119.237582,29.581202],[119.241955,29.577706],[119.243072,29.575246],[119.243667,29.56951],[119.24602,29.567893],[119.254078,29.566152],[119.255837,29.564784],[119.264371,29.564825],[119.274996,29.569856],[119.278229,29.572896],[119.282626,29.572896],[119.284457,29.571625],[119.285954,29.568474],[119.282531,29.565544],[119.279441,29.56148],[119.274449,29.560969],[119.268222,29.561895],[119.26613,29.559324],[119.267675,29.548832],[119.265702,29.546704],[119.249562,29.535851],[119.241575,29.533045],[119.230569,29.523961],[119.2295,29.522246],[119.230997,29.51955],[119.2295,29.517877],[119.226552,29.516964],[119.223795,29.519965],[119.216878,29.524279],[119.215499,29.526464],[119.210388,29.529409],[119.206276,29.529063],[119.202092,29.527252],[119.199145,29.524846],[119.199929,29.52226],[119.202401,29.51991],[119.204042,29.516632],[119.20542,29.510382],[119.206656,29.508142],[119.205919,29.504989],[119.201546,29.501739],[119.198646,29.495211],[119.193559,29.49149],[119.191705,29.483703],[119.192941,29.470796],[119.192608,29.465581],[119.190897,29.462606],[119.185929,29.460434],[119.179083,29.453931],[119.172023,29.454927],[119.167316,29.453668],[119.159139,29.452202],[119.156192,29.450721],[119.146303,29.447829],[119.141335,29.447373],[119.138459,29.449393],[119.132255,29.448549],[119.126883,29.450334],[119.122248,29.445975],[119.11728,29.445588],[119.114784,29.44639],[119.110719,29.443982],[119.106583,29.440025],[119.101948,29.436468],[119.099595,29.431085],[119.102399,29.426213],[119.102281,29.423002],[119.098881,29.417673],[119.096504,29.416358],[119.083597,29.414116],[119.078154,29.414462],[119.070428,29.413825],[119.067196,29.412552],[119.061633,29.408122],[119.059328,29.405603],[119.057878,29.402045],[119.057236,29.398086],[119.055405,29.395497],[119.052767,29.394459],[119.050865,29.391482],[119.04806,29.389987],[119.044637,29.386595],[119.039717,29.385889],[119.034725,29.382787],[119.030518,29.376404],[119.016874,29.372],[119.01124,29.368428],[119.007556,29.367444],[119.003206,29.368289],[118.99453,29.368372],[118.990607,29.365436],[118.98621,29.360146],[118.984308,29.358872],[118.98148,29.359218],[118.976036,29.364813],[118.972209,29.364689],[118.967431,29.362431],[118.962368,29.363899],[118.959611,29.362985],[118.958375,29.360922],[118.9574,29.355756],[118.95576,29.353637],[118.946704,29.349759],[118.94214,29.348374],[118.936102,29.345673],[118.92909,29.341808],[118.923195,29.342196],[118.919391,29.341614],[118.91314,29.336627],[118.908219,29.336156],[118.900446,29.332652],[118.893054,29.3288],[118.890629,29.324049],[118.886327,29.322372],[118.87834,29.326556],[118.873206,29.324492],[118.869545,29.322317],[118.863222,29.317495],[118.860679,29.314974],[118.857161,29.309182],[118.855734,29.303335],[118.849412,29.298346],[118.842684,29.297487],[118.838786,29.293191],[118.835078,29.290488],[118.828755,29.287453],[118.828636,29.285042],[118.826544,29.280288],[118.824476,29.279484],[118.819699,29.280343],[118.816894,29.281716],[118.812377,29.280801],[118.809525,29.278278],[118.80073,29.272942],[118.793622,29.267952],[118.786373,29.266732],[118.78478,29.259108],[118.781832,29.258068],[118.778267,29.252564],[118.77501,29.251011],[118.768188,29.251912],[118.766382,29.251164],[118.763886,29.248294],[118.762412,29.240322],[118.766691,29.235621],[118.767261,29.234137],[118.766239,29.229256],[118.767,29.223058],[118.765431,29.220589],[118.759298,29.218065],[118.757349,29.215985],[118.753023,29.213863],[118.743752,29.213655],[118.734173,29.207427],[118.73258,29.205416],[118.731701,29.201519],[118.72949,29.199674],[118.723333,29.198911],[118.718651,29.192807],[118.715442,29.189867],[118.708834,29.188757],[118.70137,29.192169],[118.693882,29.196955],[118.688748,29.20095],[118.684612,29.202531],[118.676577,29.200659],[118.670159,29.200506],[118.655374,29.196886],[118.651904,29.196414],[118.638307,29.192169],[118.628894,29.19235],[118.62685,29.195665],[118.628205,29.199063],[118.631984,29.202004],[118.633672,29.205624],[118.632317,29.214168],[118.631841,29.219618],[118.628109,29.220229],[118.624377,29.218883],[118.620123,29.219272],[118.618863,29.220714],[118.616486,29.226316],[118.613847,29.229464],[118.613063,29.231919],[118.607786,29.238228],[118.607596,29.239711],[118.614632,29.246325],[118.615464,29.250762],[118.611423,29.25768],[118.610091,29.262324],[118.606669,29.267134],[118.606669,29.268492],[118.609854,29.273108],[118.609497,29.277003],[118.610614,29.27947],[118.615511,29.278971],[118.619196,29.276809],[118.621145,29.278084],[118.623997,29.272346],[118.630582,29.265207],[118.634908,29.261852],[118.636928,29.263627],[118.636382,29.267078],[118.634147,29.27297],[118.629916,29.279886],[118.62452,29.284238],[118.619124,29.292928],[118.614394,29.296586],[118.617223,29.303127],[118.6138,29.307311],[118.604814,29.314614],[118.603483,29.316442],[118.60384,29.323564],[118.60094,29.327789],[118.596043,29.330823],[118.594593,29.330698],[118.589031,29.327872],[118.587533,29.328496],[118.587129,29.332056],[118.584253,29.333663],[118.579856,29.332153],[118.575149,29.336558],[118.571679,29.338317],[118.562266,29.338539],[118.551498,29.335713],[118.54237,29.33696],[118.541039,29.342528],[118.528559,29.345257],[118.523401,29.345368],[118.519099,29.344384],[118.518885,29.346448],[118.523995,29.355229],[118.524352,29.36142],[118.517482,29.363484],[118.509994,29.361642],[118.50574,29.359274],[118.502887,29.360991],[118.498989,29.361891],[118.494163,29.362057],[118.491596,29.365215],[118.488839,29.367237],[118.479164,29.366544],[118.473341,29.362764],[118.470132,29.360091],[118.464664,29.360312],[118.45625,29.365893],[118.448738,29.375241],[118.445957,29.37639],[118.441251,29.375919],[118.437685,29.377705],[118.430102,29.382455],[118.423637,29.387356],[118.422733,29.390471],[118.425847,29.395179],[118.4258,29.397643],[118.422139,29.400232],[118.418122,29.40163],[118.415293,29.403762],[118.409684,29.404495],[118.407021,29.405575],[118.405405,29.408136],[118.410825,29.413479],[118.413297,29.41813],[118.413154,29.420552],[118.40859,29.42339],[118.40203,29.425175],[118.395231,29.423473],[118.390263,29.423971],[118.386698,29.427652],[118.384154,29.433258],[118.378093,29.43388],[118.375169,29.435195],[118.372935,29.437824],[118.366374,29.450154],[118.363426,29.451067],[118.357341,29.451565],[118.35254,29.452797],[118.350686,29.454775],[118.350186,29.458746],[118.345741,29.465138],[118.345028,29.468251],[118.344957,29.475707],[118.347619,29.473978],[118.353609,29.47503],[118.35872,29.477063],[118.360479,29.479097],[118.362951,29.484159],[118.365708,29.48629],[118.371104,29.492154],[118.373505,29.496483],[118.379804,29.502555],[118.381444,29.504933],[118.383013,29.510133],[118.393044,29.507298],[118.402814,29.507464],[118.407473,29.508059],[118.41256,29.509677],[118.414984,29.509746],[118.420238,29.508031],[118.425491,29.504754],[118.430578,29.50373],[118.436544,29.505749],[118.439872,29.510036],[118.443105,29.50893],[118.448976,29.513397],[118.45045,29.512733],[118.45827,29.506358],[118.459815,29.50557],[118.464213,29.505888],[118.470393,29.507464],[118.479022,29.510935],[118.481969,29.512996],[118.489433,29.51684],[118.495162,29.518361],[118.496065,29.520642],[118.495162,29.525703],[118.4949,29.5314],[118.495875,29.533321],[118.497563,29.540331],[118.497848,29.544008],[118.494948,29.550602],[118.4949,29.553712],[118.498371,29.56137],[118.49868,29.567672],[118.499678,29.573615],[118.50177,29.576379],[118.50574,29.57725],[118.515462,29.583316],[118.521547,29.585956],[118.532172,29.588954],[118.535239,29.590612],[118.540896,29.599331],[118.542037,29.603821],[118.54855,29.611212],[118.549905,29.613395],[118.553447,29.612373],[118.555087,29.613409],[118.559746,29.620689],[118.567519,29.627292],[118.568065,29.633438],[118.569302,29.635496],[118.573865,29.638383],[118.584015,29.640523],[118.595544,29.644059],[118.602057,29.643672],[118.614228,29.650425],[118.620004,29.654112],[118.633482,29.648782],[118.636928,29.644832],[118.640945,29.641932],[118.642918,29.641656],[118.647316,29.643382],[118.653401,29.648685],[118.656872,29.654444],[118.659629,29.65646],[118.666712,29.663309],[118.672275,29.667009],[118.673915,29.669094],[118.674153,29.674009],[118.67508,29.675625],[118.681498,29.67978],[118.682353,29.68105],[118.682924,29.688326],[118.685467,29.69052],[118.691648,29.69393],[118.692884,29.699148],[118.700823,29.706463],[118.718698,29.709182],[118.72407,29.715958],[118.724641,29.72261],[118.726947,29.725825],[118.733626,29.730089],[118.737406,29.735029],[118.739711,29.736809],[118.744703,29.738768],[118.745559,29.740327],[118.74651,29.746287],[118.748673,29.750426],[118.749029,29.761145],[118.745535,29.76738],[118.747365,29.772428],[118.746628,29.775352],[118.744299,29.779641],[118.738356,29.784799],[118.736526,29.788454],[118.738618,29.807952],[118.739925,29.813288],[118.742278,29.816321],[118.74601,29.818168],[118.754972,29.816982],[118.759441,29.817162],[118.765906,29.82309],[118.765669,29.824524],[118.76013,29.828921],[118.753855,29.829541],[118.750955,29.831609],[118.75471,29.839232],[118.754164,29.843697],[118.755614,29.84542],[118.766952,29.848949],[118.770066,29.846826],[118.774178,29.845324],[118.778742,29.841906],[118.781975,29.842595],[118.786634,29.845227],[118.788916,29.851016],[118.798091,29.858816],[118.802608,29.860663],[118.807718,29.867649],[118.812972,29.87086],[118.81649,29.873946],[118.819057,29.874815],[118.823383,29.87881],[118.830134,29.882489],[118.84133,29.891306],[118.843968,29.89515],[118.845537,29.899103],[118.844848,29.905288],[118.844895,29.915261],[118.843112,29.920591],[118.8419,29.928151],[118.840141,29.929859],[118.838715,29.9345],[118.838976,29.938273],[118.841163,29.939925],[118.848294,29.941261],[118.857921,29.938011],[118.863911,29.936978],[118.867239,29.939484],[118.868951,29.943904],[118.87197,29.946892],[118.876248,29.945736],[118.880337,29.942982],[118.883688,29.939429],[118.887634,29.939223],[118.893553,29.937598],[118.89467,29.938066],[118.894005,29.943106],[118.892365,29.9482],[118.893006,29.957081],[118.891533,29.959889],[118.893173,29.969291],[118.896453,29.975761],[118.898093,29.977495],[118.899472,29.981446],[118.897214,29.987116],[118.893197,29.990956],[118.892079,29.994796],[118.893981,29.997411],[118.895098,30.001195],[118.894028,30.006713],[118.889845,30.010593],[118.890344,30.012024],[118.897404,30.01673]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330182,\"name\":\"建德市\",\"center\":[119.279089,29.472284],\"centroid\":[119.372981,29.48107],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":12,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.765307,29.596402],[119.766829,29.589341],[119.765236,29.587572],[119.765616,29.584712],[119.768421,29.582459],[119.769182,29.579544],[119.766187,29.570906],[119.761647,29.566525],[119.764832,29.563111],[119.765521,29.560015],[119.76419,29.557334],[119.758842,29.556034],[119.756417,29.553726],[119.750665,29.550726],[119.747266,29.550588],[119.741109,29.551901],[119.730412,29.548197],[119.724803,29.545128],[119.72264,29.542764],[119.724755,29.538188],[119.731862,29.532962],[119.734311,29.528385],[119.744033,29.520781],[119.745602,29.518389],[119.744936,29.516425],[119.740348,29.513341],[119.735404,29.510935],[119.726894,29.511557],[119.727536,29.509442],[119.72554,29.506925],[119.718836,29.505293],[119.717862,29.502652],[119.718337,29.496691],[119.719549,29.491158],[119.718741,29.48853],[119.716673,29.486331],[119.712632,29.484132],[119.706785,29.472374],[119.708449,29.467725],[119.707118,29.464225],[119.709518,29.458885],[119.71344,29.456187],[119.715817,29.449005],[119.71344,29.445006],[119.710659,29.442266],[119.709518,29.439111],[119.710636,29.436122],[119.709637,29.434185],[119.70726,29.433216],[119.700509,29.433008],[119.697372,29.434116],[119.693663,29.438765],[119.691168,29.438779],[119.689836,29.433327],[119.690312,29.42685],[119.688909,29.421756],[119.683442,29.418628],[119.678973,29.41777],[119.676311,29.41921],[119.673387,29.425023],[119.67006,29.425424],[119.664402,29.424068],[119.6601,29.426891],[119.655488,29.425922],[119.649094,29.428344],[119.646741,29.43323],[119.644459,29.434102],[119.642486,29.432953],[119.638659,29.428275],[119.633596,29.423348],[119.626631,29.42022],[119.62492,29.41777],[119.625633,29.415293],[119.625538,29.410476],[119.617361,29.399733],[119.612155,29.394763],[119.607068,29.393877],[119.605547,29.392742],[119.606236,29.388076],[119.613866,29.383244],[119.617598,29.38035],[119.618573,29.378467],[119.619643,29.372956],[119.619381,29.371059],[119.616291,29.368261],[119.614057,29.368275],[119.608518,29.370242],[119.604596,29.369632],[119.597988,29.372928],[119.592925,29.377705],[119.589454,29.378702],[119.582085,29.379132],[119.578425,29.378121],[119.574598,29.372762],[119.565898,29.371183],[119.560573,29.372083],[119.55677,29.371585],[119.551469,29.36732],[119.545408,29.367361],[119.540915,29.369799],[119.538847,29.371931],[119.536042,29.37315],[119.529838,29.370546],[119.523872,29.36599],[119.525773,29.36347],[119.526605,29.360021],[119.52506,29.35516],[119.522707,29.350022],[119.512082,29.336724],[119.510418,29.333469],[119.501979,29.335879],[119.50003,29.335713],[119.492329,29.331059],[119.485364,29.332541],[119.480206,29.33297],[119.477543,29.335048],[119.47771,29.341586],[119.476022,29.345216],[119.471482,29.349025],[119.469652,29.349662],[119.464565,29.349177],[119.461427,29.350908],[119.459834,29.356656],[119.454819,29.365284],[119.457576,29.370366],[119.453369,29.378827],[119.451824,29.385598],[119.453607,29.389253],[119.451348,29.397283],[119.448876,29.400688],[119.443148,29.404565],[119.440676,29.408745],[119.441674,29.413036],[119.438798,29.415749],[119.439416,29.421424],[119.438964,29.423597],[119.437134,29.424123],[119.427768,29.422158],[119.428553,29.419057],[119.432332,29.415154],[119.426746,29.405548],[119.421255,29.404758],[119.415883,29.403],[119.410725,29.402557],[119.409204,29.400716],[119.405614,29.399927],[119.404758,29.400688],[119.404901,29.405326],[119.403974,29.407223],[119.399933,29.411237],[119.393515,29.411251],[119.391709,29.416884],[119.389783,29.425826],[119.388547,29.429715],[119.382129,29.43186],[119.378112,29.429798],[119.375283,29.424538],[119.372455,29.421037],[119.370814,29.417715],[119.368319,29.415708],[119.362162,29.416746],[119.360237,29.416289],[119.355578,29.410794],[119.353201,29.409866],[119.346378,29.408731],[119.343906,29.409008],[119.338392,29.411707],[119.334897,29.40815],[119.334042,29.405354],[119.331094,29.400356],[119.32779,29.396923],[119.328646,29.39342],[119.333875,29.390734],[119.336038,29.385847],[119.339105,29.384296],[119.340151,29.382358],[119.339295,29.379145],[119.340198,29.377304],[119.336466,29.372499],[119.335016,29.366987],[119.336704,29.363373],[119.332806,29.353748],[119.334303,29.348983],[119.340008,29.348581],[119.34557,29.342265],[119.348447,29.336253],[119.348233,29.333441],[119.344287,29.324395],[119.347092,29.322719],[119.348779,29.319504],[119.347282,29.317163],[119.340531,29.315389],[119.324201,29.30799],[119.323131,29.305011],[119.328646,29.299274],[119.329026,29.294383],[119.328337,29.292789],[119.32577,29.292248],[119.324177,29.295408],[119.322632,29.29617],[119.322608,29.290488],[119.323345,29.288146],[119.322727,29.284931],[119.318306,29.2799],[119.312672,29.278639],[119.305066,29.279332],[119.298648,29.279276],[119.292562,29.281799],[119.288117,29.280995],[119.286026,29.279332],[119.286216,29.275257],[119.288094,29.268839],[119.287167,29.267453],[119.282317,29.264944],[119.282056,29.26127],[119.278657,29.260646],[119.275781,29.258636],[119.273475,29.25377],[119.270646,29.251649],[119.260924,29.247809],[119.257644,29.247989],[119.249205,29.250193],[119.244237,29.250997],[119.238746,29.250152],[119.237772,29.25072],[119.239293,29.258913],[119.236298,29.26346],[119.234016,29.270682],[119.231544,29.273274],[119.228786,29.27437],[119.227099,29.276837],[119.229,29.282575],[119.228739,29.284183],[119.225031,29.285153],[119.219397,29.2827],[119.214833,29.283753],[119.208178,29.284404],[119.205111,29.288257],[119.200286,29.290391],[119.198836,29.286026],[119.200737,29.280524],[119.200999,29.275811],[119.204255,29.274771],[119.203328,29.272318],[119.200405,29.272152],[119.19779,29.26992],[119.192299,29.263571],[119.191515,29.261741],[119.192228,29.258456],[119.195484,29.256446],[119.198622,29.257985],[119.200904,29.257472],[119.204303,29.252356],[119.210293,29.248724],[119.214786,29.246935],[119.212195,29.246076],[119.211268,29.244426],[119.211648,29.235413],[119.210269,29.230657],[119.213645,29.225207],[119.211838,29.222905],[119.209033,29.222059],[119.204469,29.223557],[119.203233,29.228383],[119.201736,29.229367],[119.196102,29.227883],[119.194153,29.22927],[119.190825,29.22848],[119.189518,29.227093],[119.189779,29.223709],[119.193963,29.220145],[119.194938,29.216304],[119.189518,29.205194],[119.181032,29.206304],[119.177704,29.207233],[119.175826,29.211893],[119.168053,29.219022],[119.165652,29.219202],[119.160257,29.220991],[119.156453,29.223806],[119.15372,29.227024],[119.151771,29.227897],[119.145709,29.222974],[119.141525,29.223377],[119.138126,29.220242],[119.131542,29.221116],[119.130163,29.2226],[119.129117,29.227079],[119.132588,29.235441],[119.126455,29.237119],[119.123508,29.236716],[119.106393,29.227509],[119.10045,29.228313],[119.094222,29.228258],[119.091893,29.230546],[119.08519,29.230601],[119.082908,29.228826],[119.081981,29.22658],[119.07775,29.224222],[119.075658,29.223987],[119.068384,29.226455],[119.062941,29.226275],[119.055144,29.222239],[119.050033,29.221546],[119.045588,29.221823],[119.037126,29.217205],[119.030589,29.215069],[119.01307,29.212379],[119.003253,29.207691],[119.001851,29.208551],[118.998903,29.216345],[118.995742,29.21708],[118.993127,29.219244],[118.991867,29.221837],[118.987137,29.226053],[118.985711,29.229728],[118.98583,29.235344],[118.984831,29.239476],[118.988254,29.243552],[118.982597,29.249736],[118.981408,29.254325],[118.979245,29.258955],[118.977344,29.258775],[118.970189,29.264944],[118.966837,29.269352],[118.963295,29.267674],[118.959492,29.271403],[118.958565,29.273801],[118.954881,29.277918],[118.952337,29.278763],[118.949651,29.281743],[118.949176,29.283919],[118.951268,29.286275],[118.961893,29.290211],[118.963533,29.291999],[118.962083,29.29617],[118.952622,29.298554],[118.948035,29.301117],[118.944113,29.306286],[118.927069,29.310374],[118.923456,29.31478],[118.916753,29.31816],[118.911262,29.324409],[118.908362,29.325143],[118.905414,29.327374],[118.903917,29.330186],[118.900446,29.332652],[118.908219,29.336156],[118.91314,29.336627],[118.919391,29.341614],[118.923195,29.342196],[118.92909,29.341808],[118.936102,29.345673],[118.94214,29.348374],[118.946704,29.349759],[118.95576,29.353637],[118.9574,29.355756],[118.958375,29.360922],[118.959611,29.362985],[118.962368,29.363899],[118.967431,29.362431],[118.972209,29.364689],[118.976036,29.364813],[118.98148,29.359218],[118.984308,29.358872],[118.98621,29.360146],[118.990607,29.365436],[118.99453,29.368372],[119.003206,29.368289],[119.007556,29.367444],[119.01124,29.368428],[119.016874,29.372],[119.030518,29.376404],[119.034725,29.382787],[119.039717,29.385889],[119.044637,29.386595],[119.04806,29.389987],[119.050865,29.391482],[119.052767,29.394459],[119.055405,29.395497],[119.057236,29.398086],[119.057878,29.402045],[119.059328,29.405603],[119.061633,29.408122],[119.067196,29.412552],[119.070428,29.413825],[119.078154,29.414462],[119.083597,29.414116],[119.096504,29.416358],[119.098881,29.417673],[119.102281,29.423002],[119.102399,29.426213],[119.099595,29.431085],[119.101948,29.436468],[119.106583,29.440025],[119.110719,29.443982],[119.114784,29.44639],[119.11728,29.445588],[119.122248,29.445975],[119.126883,29.450334],[119.132255,29.448549],[119.138459,29.449393],[119.141335,29.447373],[119.146303,29.447829],[119.156192,29.450721],[119.159139,29.452202],[119.167316,29.453668],[119.172023,29.454927],[119.179083,29.453931],[119.185929,29.460434],[119.190897,29.462606],[119.192608,29.465581],[119.192941,29.470796],[119.191705,29.483703],[119.193559,29.49149],[119.198646,29.495211],[119.201546,29.501739],[119.205919,29.504989],[119.206656,29.508142],[119.20542,29.510382],[119.204042,29.516632],[119.202401,29.51991],[119.199929,29.52226],[119.199145,29.524846],[119.202092,29.527252],[119.206276,29.529063],[119.210388,29.529409],[119.215499,29.526464],[119.216878,29.524279],[119.223795,29.519965],[119.226552,29.516964],[119.2295,29.517877],[119.230997,29.51955],[119.2295,29.522246],[119.230569,29.523961],[119.241575,29.533045],[119.249562,29.535851],[119.265702,29.546704],[119.267675,29.548832],[119.26613,29.559324],[119.268222,29.561895],[119.274449,29.560969],[119.279441,29.56148],[119.282531,29.565544],[119.285954,29.568474],[119.284457,29.571625],[119.282626,29.572896],[119.278229,29.572896],[119.274996,29.569856],[119.264371,29.564825],[119.255837,29.564784],[119.254078,29.566152],[119.24602,29.567893],[119.243667,29.56951],[119.243072,29.575246],[119.241955,29.577706],[119.237582,29.581202],[119.234967,29.582086],[119.243025,29.590087],[119.247304,29.59759],[119.246971,29.599483],[119.248231,29.605617],[119.251249,29.610826],[119.248849,29.614887],[119.251654,29.61747],[119.252913,29.623314],[119.254292,29.626629],[119.257382,29.628866],[119.263824,29.630745],[119.267508,29.633093],[119.274853,29.636228],[119.276969,29.63812],[119.277777,29.640758],[119.286572,29.647401],[119.293085,29.65066],[119.299194,29.649113],[119.303259,29.649735],[119.305517,29.651392],[119.306706,29.654154],[119.30673,29.661776],[119.309035,29.668017],[119.314621,29.669453],[119.315548,29.670309],[119.31852,29.676964],[119.320588,29.6792],[119.321657,29.688422],[119.323297,29.693171],[119.329763,29.699769],[119.330619,29.702115],[119.332924,29.702791],[119.33504,29.701715],[119.336942,29.702336],[119.345642,29.711224],[119.34828,29.715116],[119.350015,29.719643],[119.352915,29.722334],[119.354508,29.725825],[119.354056,29.730185],[119.355768,29.73231],[119.358074,29.737968],[119.360332,29.741638],[119.36423,29.746397],[119.365823,29.750398],[119.370624,29.752688],[119.373857,29.754978],[119.373405,29.758758],[119.374142,29.760662],[119.380489,29.766993],[119.383579,29.770952],[119.388357,29.769628],[119.390924,29.764979],[119.391495,29.7624],[119.394323,29.759807],[119.392374,29.750357],[119.393563,29.748301],[119.398792,29.744328],[119.407088,29.7431],[119.411343,29.745266],[119.415431,29.750233],[119.417547,29.757048],[119.42261,29.758469],[119.425439,29.75582],[119.425938,29.753171],[119.434519,29.748384],[119.439867,29.742231],[119.44203,29.741651],[119.447094,29.743183],[119.451206,29.741555],[119.454938,29.741983],[119.458955,29.744935],[119.465753,29.741693],[119.472932,29.739361],[119.476379,29.733373],[119.478019,29.732338],[119.484556,29.731262],[119.492376,29.722334],[119.493802,29.721285],[119.50022,29.722679],[119.504879,29.722872],[119.50835,29.725273],[119.520187,29.728792],[119.522969,29.731013],[119.528269,29.733897],[119.531954,29.733925],[119.537064,29.736933],[119.540511,29.737319],[119.543696,29.746122],[119.544695,29.747432],[119.549472,29.749916],[119.560431,29.752316],[119.569131,29.751695],[119.571698,29.749847],[119.574099,29.745197],[119.577212,29.741569],[119.578306,29.738299],[119.581895,29.73111],[119.583726,29.729385],[119.59176,29.724818],[119.593448,29.723203],[119.596229,29.717352],[119.601815,29.716055],[119.603978,29.713419],[119.604144,29.708837],[119.602528,29.700859],[119.610895,29.695227],[119.610776,29.688229],[119.614128,29.684999],[119.612749,29.673029],[119.613581,29.669757],[119.616909,29.664648],[119.617479,29.662757],[119.616148,29.656805],[119.621972,29.65472],[119.62946,29.656239],[119.634689,29.653243],[119.636733,29.652939],[119.643579,29.653961],[119.64705,29.65229],[119.651043,29.651641],[119.658792,29.652013],[119.665305,29.653836],[119.667968,29.657316],[119.670844,29.657137],[119.674505,29.653809],[119.672104,29.648658],[119.670226,29.640979],[119.673031,29.636905],[119.676192,29.636325],[119.678593,29.634018],[119.679663,29.62685],[119.688363,29.62109],[119.693307,29.620965],[119.694876,29.619985],[119.695375,29.616034],[119.692998,29.602633],[119.695256,29.596719],[119.698322,29.593721],[119.701318,29.58959],[119.704075,29.587641],[119.708282,29.589673],[119.709376,29.595863],[119.715247,29.601804],[119.717315,29.608781],[119.718575,29.610439],[119.723899,29.610535],[119.728368,29.613506],[119.731126,29.613547],[119.742393,29.609195],[119.746434,29.606419],[119.750142,29.602978],[119.757843,29.598447],[119.762312,29.597811],[119.765307,29.596402]]]]}}]}', 'admin', '2020-12-07 18:37:35', NULL, '2020-12-07 18:37:35', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1335907956524433409', '上海', 'shanghai', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":310101,\"name\":\"黄浦区\",\"center\":[121.490317,31.222771],\"centroid\":[121.483572,31.215946],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":0,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.475987,31.187885],[121.474944,31.189886],[121.470356,31.191431],[121.469605,31.196404],[121.46745,31.203065],[121.466449,31.204395],[121.462264,31.203173],[121.461555,31.210194],[121.460707,31.213488],[121.457689,31.220196],[121.456758,31.223898],[121.467464,31.223862],[121.467658,31.225634],[121.466129,31.234917],[121.462973,31.241396],[121.469563,31.239216],[121.474847,31.24142],[121.47892,31.240294],[121.482994,31.241923],[121.485969,31.244091],[121.487805,31.244186],[121.494826,31.24221],[121.493491,31.240163],[121.493491,31.23615],[121.495744,31.232977],[121.502014,31.228018],[121.506741,31.223119],[121.509397,31.218459],[121.509911,31.214506],[121.508368,31.210158],[121.501319,31.199747],[121.498066,31.195601],[121.494631,31.192857],[121.490752,31.191467],[121.475987,31.187885]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310104,\"name\":\"徐汇区\",\"center\":[121.43752,31.179973],\"centroid\":[121.439404,31.162992],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":1,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.412572,31.19112],[121.419719,31.190796],[121.422027,31.192294],[121.421638,31.19535],[121.423793,31.197314],[121.433025,31.20128],[121.437933,31.203976],[121.435235,31.21114],[121.43746,31.211535],[121.439462,31.214482],[121.44697,31.215812],[121.452184,31.217429],[121.457689,31.220196],[121.460707,31.213488],[121.461555,31.210194],[121.462264,31.203173],[121.466449,31.204395],[121.46745,31.203065],[121.469605,31.196404],[121.470356,31.191431],[121.474944,31.189886],[121.475987,31.187885],[121.468729,31.184122],[121.466254,31.18109],[121.464905,31.178022],[121.464905,31.17541],[121.468159,31.167092],[121.469369,31.162298],[121.468354,31.158091],[121.46574,31.155118],[121.460387,31.150276],[121.457453,31.146451],[121.457453,31.142232],[121.462431,31.134463],[121.468729,31.127868],[121.469674,31.124859],[121.469299,31.118731],[121.465211,31.1121],[121.463237,31.108586],[121.462862,31.101954],[121.455423,31.100755],[121.452629,31.101234],[121.451878,31.103849],[121.446275,31.105744],[121.447623,31.107423],[121.452364,31.108586],[121.450154,31.112819],[121.450807,31.115398],[121.446706,31.114282],[121.445788,31.114954],[121.441547,31.112568],[121.438002,31.1121],[121.435736,31.113539],[121.438836,31.119103],[121.43853,31.121729],[121.436445,31.129043],[121.421526,31.127137],[121.418398,31.131669],[121.41381,31.13728],[121.411293,31.14174],[121.404953,31.156689],[121.400977,31.155214],[121.401449,31.153776],[121.396931,31.152685],[121.395874,31.15585],[121.401867,31.157528],[121.404578,31.157588],[121.402645,31.162226],[121.394567,31.159601],[121.391508,31.168686],[121.394053,31.169489],[121.39269,31.173085],[121.395415,31.174595],[121.394442,31.177879],[121.398071,31.178226],[121.398349,31.179904],[121.400101,31.178813],[121.41146,31.182037],[121.415158,31.183391],[121.415256,31.187357],[121.41356,31.18683],[121.412572,31.19112]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310105,\"name\":\"长宁区\",\"center\":[121.4222,31.218123],\"centroid\":[121.380949,31.20737],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":2,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.439462,31.214482],[121.43746,31.211535],[121.435235,31.21114],[121.437933,31.203976],[121.433025,31.20128],[121.423793,31.197314],[121.421638,31.19535],[121.422027,31.192294],[121.419719,31.190796],[121.412572,31.19112],[121.391425,31.191911],[121.38001,31.190065],[121.365954,31.185572],[121.360253,31.185296],[121.358321,31.186015],[121.356958,31.182768],[121.353301,31.181629],[121.351424,31.183499],[121.341414,31.179436],[121.338341,31.180108],[121.331806,31.189622],[121.338049,31.192618],[121.33734,31.195817],[121.338925,31.196644],[121.338438,31.20666],[121.338508,31.212182],[121.339996,31.212278],[121.33937,31.216615],[121.342457,31.217789],[121.343096,31.223071],[121.345627,31.223526],[121.340997,31.224269],[121.341581,31.226293],[121.345362,31.227886],[121.345376,31.23039],[121.343513,31.234306],[121.338355,31.237528],[121.340872,31.239947],[121.345585,31.239887],[121.344612,31.243552],[121.346822,31.241037],[121.347281,31.243192],[121.348922,31.243863],[121.350131,31.241839],[121.348741,31.239372],[121.352856,31.238342],[121.354177,31.237121],[121.359071,31.229827],[121.362102,31.22597],[121.366065,31.226006],[121.366691,31.224065],[121.371404,31.222508],[121.373197,31.220089],[121.37691,31.220687],[121.388658,31.218639],[121.399712,31.218711],[121.400462,31.220807],[121.403799,31.22058],[121.408707,31.222364],[121.414157,31.223359],[121.415965,31.224473],[121.414853,31.228054],[121.415617,31.228581],[121.419941,31.225191],[121.423334,31.228114],[121.427519,31.229288],[121.427713,31.224221],[121.429034,31.223095],[121.434304,31.225886],[121.435416,31.225071],[121.436167,31.220675],[121.439462,31.214482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310106,\"name\":\"静安区\",\"center\":[121.448224,31.229003],\"centroid\":[121.450659,31.270821],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":3,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.482994,31.241923],[121.47892,31.240294],[121.474847,31.24142],[121.469563,31.239216],[121.462973,31.241396],[121.466129,31.234917],[121.467658,31.225634],[121.467464,31.223862],[121.456758,31.223898],[121.457689,31.220196],[121.452184,31.217429],[121.44697,31.215812],[121.439462,31.214482],[121.436167,31.220675],[121.435416,31.225071],[121.434304,31.225886],[121.429034,31.223095],[121.427713,31.224221],[121.427519,31.229288],[121.427908,31.231144],[121.431009,31.235108],[121.435166,31.235252],[121.445774,31.241348],[121.449987,31.2433],[121.448318,31.245216],[121.450404,31.247743],[121.451461,31.251994],[121.44932,31.252928],[121.451044,31.256269],[121.442952,31.267117],[121.437098,31.269439],[121.432413,31.271942],[121.429841,31.274923],[121.425252,31.270661],[121.424571,31.27193],[121.424432,31.280238],[121.422833,31.28426],[121.423806,31.291011],[121.419691,31.291071],[121.418648,31.292256],[121.420039,31.296912],[121.42364,31.297259],[121.426935,31.298528],[121.426434,31.303207],[121.431287,31.303638],[121.432441,31.305912],[121.431676,31.309478],[121.432163,31.31168],[121.434623,31.312303],[121.432468,31.318669],[121.433595,31.32087],[121.436459,31.32087],[121.436765,31.319662],[121.44672,31.319817],[121.447887,31.317101],[121.4547,31.319243],[121.457133,31.321002],[121.465378,31.321397],[121.468145,31.32032],[121.468312,31.316036],[121.467672,31.306307],[121.463529,31.306008],[121.46453,31.297989],[121.462445,31.292747],[121.460081,31.289778],[121.461805,31.284691],[121.461457,31.278921],[121.462834,31.275389],[121.464627,31.274396],[121.469605,31.267799],[121.474124,31.263453],[121.480491,31.258568],[121.480589,31.255239],[121.479629,31.253383],[121.481673,31.250689],[121.479588,31.249815],[121.481228,31.247959],[121.482994,31.241923]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310107,\"name\":\"普陀区\",\"center\":[121.392499,31.241701],\"centroid\":[121.392058,31.257885],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":4,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.354177,31.237121],[121.356054,31.237803],[121.356068,31.240151],[121.360086,31.240498],[121.36067,31.238642],[121.363117,31.240091],[121.366718,31.246342],[121.368387,31.247384],[121.372349,31.243755],[121.3731,31.245683],[121.375686,31.244486],[121.377216,31.247719],[121.380886,31.257766],[121.377508,31.259478],[121.375158,31.25949],[121.374574,31.257059],[121.365884,31.257682],[121.366023,31.259358],[121.361783,31.259945],[121.358918,31.263609],[121.35985,31.266997],[121.362227,31.26756],[121.366996,31.266662],[121.367441,31.269631],[121.361268,31.27084],[121.358918,31.268793],[121.35732,31.271415],[121.344723,31.273917],[121.343541,31.271439],[121.338272,31.272839],[121.338883,31.275006],[121.336228,31.275461],[121.336061,31.280046],[121.335004,31.279711],[121.332738,31.286067],[121.328998,31.284595],[121.327316,31.285182],[121.326384,31.288928],[121.33353,31.291107],[121.332891,31.292998],[121.336506,31.294901],[121.338675,31.293225],[121.341011,31.293716],[121.340927,31.297439],[121.34685,31.297654],[121.346892,31.296349],[121.349659,31.297582],[121.348894,31.299246],[121.352954,31.301663],[121.354803,31.299808],[121.360309,31.302717],[121.363534,31.302741],[121.360295,31.294674],[121.358585,31.293465],[121.363785,31.292028],[121.363785,31.291334],[121.369666,31.28912],[121.370153,31.290329],[121.374838,31.289096],[121.376242,31.290592],[121.38154,31.289431],[121.381623,31.292711],[121.384765,31.294446],[121.388394,31.29526],[121.394762,31.294674],[121.393483,31.291274],[121.39789,31.29052],[121.399559,31.288904],[121.398446,31.287145],[121.400379,31.286115],[121.404453,31.286223],[121.400087,31.278071],[121.404564,31.276227],[121.406496,31.276862],[121.40544,31.273067],[121.41096,31.273175],[121.410598,31.270373],[121.41527,31.26914],[121.41577,31.265896],[121.419496,31.265237],[121.425252,31.270661],[121.429841,31.274923],[121.432413,31.271942],[121.437098,31.269439],[121.442952,31.267117],[121.451044,31.256269],[121.44932,31.252928],[121.451461,31.251994],[121.450404,31.247743],[121.448318,31.245216],[121.449987,31.2433],[121.445774,31.241348],[121.435166,31.235252],[121.431009,31.235108],[121.427908,31.231144],[121.427519,31.229288],[121.423334,31.228114],[121.419941,31.225191],[121.415617,31.228581],[121.414853,31.228054],[121.415965,31.224473],[121.414157,31.223359],[121.408707,31.222364],[121.403799,31.22058],[121.400462,31.220807],[121.399712,31.218711],[121.388658,31.218639],[121.37691,31.220687],[121.373197,31.220089],[121.371404,31.222508],[121.366691,31.224065],[121.366065,31.226006],[121.362102,31.22597],[121.359071,31.229827],[121.354177,31.237121]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310109,\"name\":\"虹口区\",\"center\":[121.491832,31.26097],\"centroid\":[121.485443,31.276649],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":5,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.485413,31.311573],[121.485664,31.303483],[121.490168,31.292603],[121.493644,31.293884],[121.500652,31.295488],[121.502709,31.289658],[121.498149,31.286259],[121.496049,31.282991],[121.496564,31.276407],[121.499915,31.275904],[121.506505,31.270589],[121.50631,31.266746],[121.508479,31.262639],[121.514569,31.256317],[121.517642,31.251862],[121.516001,31.251599],[121.516488,31.246953],[121.50688,31.246474],[121.500012,31.244989],[121.494826,31.24221],[121.487805,31.244186],[121.485969,31.244091],[121.482994,31.241923],[121.481228,31.247959],[121.479588,31.249815],[121.481673,31.250689],[121.479629,31.253383],[121.480589,31.255239],[121.480491,31.258568],[121.474124,31.263453],[121.469605,31.267799],[121.464627,31.274396],[121.462834,31.275389],[121.461457,31.278921],[121.461805,31.284691],[121.460081,31.289778],[121.462445,31.292747],[121.46453,31.297989],[121.463529,31.306008],[121.467672,31.306307],[121.468312,31.316036],[121.472956,31.315797],[121.479171,31.314696],[121.485372,31.314636],[121.485413,31.311573]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310110,\"name\":\"杨浦区\",\"center\":[121.522797,31.270755],\"centroid\":[121.529302,31.29835],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":6,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.516488,31.246953],[121.516001,31.251599],[121.517642,31.251862],[121.514569,31.256317],[121.508479,31.262639],[121.50631,31.266746],[121.506505,31.270589],[121.499915,31.275904],[121.496564,31.276407],[121.496049,31.282991],[121.498149,31.286259],[121.502709,31.289658],[121.500652,31.295488],[121.493644,31.293884],[121.490168,31.292603],[121.485664,31.303483],[121.485413,31.311573],[121.496717,31.311489],[121.496216,31.323347],[121.498928,31.325322],[121.497593,31.328109],[121.493575,31.330299],[121.50556,31.345732],[121.517628,31.340779],[121.520256,31.344033],[121.522883,31.342885],[121.525483,31.346797],[121.549398,31.337789],[121.555779,31.333948],[121.558574,31.331256],[121.560493,31.32781],[121.561883,31.321158],[121.561758,31.303339],[121.562523,31.29976],[121.565456,31.294135],[121.569141,31.285254],[121.56953,31.279567],[121.568515,31.275701],[121.563537,31.268805],[121.559074,31.264219],[121.541542,31.251826],[121.536384,31.249623],[121.527555,31.247252],[121.516488,31.246953]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310112,\"name\":\"闵行区\",\"center\":[121.375972,31.111658],\"centroid\":[121.418901,31.087213],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":7,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.35871,30.97786],[121.351258,30.975986],[121.34375,30.976599],[121.334406,30.980694],[121.329554,30.981318],[121.327371,30.980658],[121.3258,30.9833],[121.326898,30.989964],[121.326773,30.994479],[121.327482,30.995896],[121.330347,30.996905],[121.33823,31.006197],[121.339829,31.010267],[121.34425,31.013941],[121.34279,31.014817],[121.339898,31.013857],[121.333072,31.01334],[121.333725,31.015657],[121.333892,31.026917],[121.333308,31.030686],[121.334017,31.031922],[121.33367,31.040695],[121.335102,31.04564],[121.335338,31.060435],[121.341456,31.062763],[121.343444,31.059139],[121.35344,31.061287],[121.358195,31.064047],[121.357278,31.066758],[121.363743,31.068354],[121.364424,31.069878],[121.362116,31.072601],[121.364341,31.073705],[121.365481,31.077892],[121.368804,31.079127],[121.370625,31.078372],[121.372016,31.079871],[121.368289,31.088976],[121.362756,31.099771],[121.359085,31.098931],[121.35839,31.100791],[121.351341,31.099255],[121.348532,31.106655],[121.351675,31.107735],[121.352217,31.106487],[121.357014,31.110529],[121.356026,31.112532],[121.353774,31.111512],[121.35066,31.115554],[121.353065,31.117604],[121.349589,31.117748],[121.346753,31.121657],[121.347545,31.121969],[121.34489,31.12577],[121.346002,31.126202],[121.344014,31.129451],[121.344681,31.130338],[121.342095,31.134655],[121.33677,31.138971],[121.338814,31.14017],[121.336728,31.14355],[121.335477,31.143862],[121.333711,31.148765],[121.331292,31.149772],[121.331528,31.15205],[121.328775,31.156665],[121.327218,31.156856],[121.323854,31.162933],[121.318584,31.170256],[121.318042,31.173624],[121.316304,31.176836],[121.310784,31.18423],[121.30856,31.188388],[121.300565,31.197027],[121.297506,31.201412],[121.294837,31.203077],[121.292431,31.202514],[121.292126,31.200621],[121.287329,31.196332],[121.284034,31.194391],[121.277388,31.193576],[121.271701,31.198309],[121.266724,31.203257],[121.264777,31.203317],[121.263053,31.205701],[121.26468,31.206731],[121.263846,31.208912],[121.259397,31.212769],[121.261218,31.215081],[121.259675,31.218148],[121.25745,31.220208],[121.258215,31.222772],[121.256588,31.226329],[121.258006,31.226868],[121.257158,31.230701],[121.254155,31.23312],[121.252792,31.236965],[121.251082,31.238198],[121.249692,31.236534],[121.247912,31.240917],[121.241391,31.240222],[121.239932,31.241061],[121.241683,31.247348],[121.24591,31.248821],[121.247314,31.253287],[121.254183,31.258688],[121.254405,31.259634],[121.260217,31.258328],[121.263985,31.259155],[121.264444,31.256496],[121.271284,31.252258],[121.275302,31.253527],[121.280363,31.251886],[121.284228,31.251838],[121.28142,31.248174],[121.283742,31.245192],[121.287301,31.243276],[121.288538,31.238198],[121.29264,31.232761],[121.296922,31.231048],[121.302998,31.230605],[121.315386,31.227204],[121.322853,31.229623],[121.32612,31.229575],[121.333878,31.232006],[121.334935,31.235887],[121.338355,31.237528],[121.343513,31.234306],[121.345376,31.23039],[121.345362,31.227886],[121.341581,31.226293],[121.340997,31.224269],[121.345627,31.223526],[121.343096,31.223071],[121.342457,31.217789],[121.33937,31.216615],[121.339996,31.212278],[121.338508,31.212182],[121.338438,31.20666],[121.338925,31.196644],[121.33734,31.195817],[121.338049,31.192618],[121.331806,31.189622],[121.338341,31.180108],[121.341414,31.179436],[121.351424,31.183499],[121.353301,31.181629],[121.356958,31.182768],[121.358321,31.186015],[121.360253,31.185296],[121.365954,31.185572],[121.38001,31.190065],[121.391425,31.191911],[121.412572,31.19112],[121.41356,31.18683],[121.415256,31.187357],[121.415158,31.183391],[121.41146,31.182037],[121.400101,31.178813],[121.398349,31.179904],[121.398071,31.178226],[121.394442,31.177879],[121.395415,31.174595],[121.39269,31.173085],[121.394053,31.169489],[121.391508,31.168686],[121.394567,31.159601],[121.402645,31.162226],[121.404578,31.157588],[121.401867,31.157528],[121.395874,31.15585],[121.396931,31.152685],[121.401449,31.153776],[121.400977,31.155214],[121.404953,31.156689],[121.411293,31.14174],[121.41381,31.13728],[121.418398,31.131669],[121.421526,31.127137],[121.436445,31.129043],[121.43853,31.121729],[121.438836,31.119103],[121.435736,31.113539],[121.438002,31.1121],[121.441547,31.112568],[121.445788,31.114954],[121.446706,31.114282],[121.450807,31.115398],[121.450154,31.112819],[121.452364,31.108586],[121.447623,31.107423],[121.446275,31.105744],[121.451878,31.103849],[121.452629,31.101234],[121.455423,31.100755],[121.462862,31.101954],[121.463237,31.108586],[121.465211,31.1121],[121.470286,31.110937],[121.473984,31.112915],[121.474137,31.114354],[121.477321,31.110853],[121.481353,31.110697],[121.477446,31.117328],[121.481256,31.118024],[121.48191,31.120086],[121.485705,31.121933],[121.485969,31.124523],[121.490266,31.124283],[121.49281,31.118719],[121.498538,31.121501],[121.501583,31.114666],[121.505295,31.115494],[121.503863,31.118324],[121.50549,31.120002],[121.511343,31.12119],[121.513749,31.118012],[121.514513,31.115278],[121.521424,31.116309],[121.522869,31.115242],[121.525289,31.116741],[121.53142,31.11842],[121.532254,31.117208],[121.535341,31.117976],[121.537885,31.113983],[121.539526,31.115626],[121.542251,31.116153],[121.544225,31.111464],[121.547687,31.109653],[121.550426,31.11162],[121.549217,31.113419],[121.552317,31.113899],[121.553332,31.112688],[121.555279,31.114882],[121.556697,31.113083],[121.559867,31.111896],[121.557851,31.109797],[121.561396,31.106224],[121.561132,31.105264],[121.563649,31.101858],[121.562064,31.101258],[121.563315,31.098955],[121.566819,31.096569],[121.567264,31.09363],[121.564358,31.091891],[121.561855,31.091867],[121.561563,31.09357],[121.559088,31.091951],[121.551608,31.090128],[121.551539,31.088148],[121.548549,31.086889],[121.550565,31.082834],[121.553555,31.080303],[121.556405,31.081059],[121.557031,31.082702],[121.561563,31.08365],[121.563579,31.082486],[121.569766,31.081611],[121.571643,31.080063],[121.572658,31.081323],[121.575272,31.080063],[121.567639,31.0762],[121.56262,31.075121],[121.562675,31.074305],[121.557531,31.073357],[121.559033,31.072169],[121.555599,31.071689],[121.55279,31.069506],[121.556753,31.06737],[121.551789,31.065643],[121.551094,31.063795],[121.548549,31.063639],[121.547201,31.061647],[121.548383,31.056896],[121.543308,31.055696],[121.54328,31.054016],[121.540791,31.052528],[121.542307,31.049072],[121.541472,31.046396],[121.54588,31.047044],[121.547799,31.048544],[121.54955,31.047908],[121.550538,31.049396],[121.552693,31.0493],[121.554737,31.050824],[121.556127,31.047632],[121.557031,31.04798],[121.559811,31.044812],[121.562119,31.043635],[121.559464,31.041391],[121.559505,31.030278],[121.558254,31.029533],[121.558407,31.024528],[121.555765,31.022908],[121.552804,31.023268],[121.552262,31.020915],[121.554139,31.01861],[121.556516,31.01873],[121.556474,31.020255],[121.558699,31.020255],[121.56027,31.024132],[121.564302,31.021191],[121.569057,31.024396],[121.56839,31.025284],[121.572325,31.026677],[121.574758,31.020951],[121.574674,31.018634],[121.571018,31.016426],[121.569822,31.012452],[121.565859,31.011912],[121.568181,31.010063],[121.569725,31.010603],[121.571463,31.005633],[121.570253,31.004565],[121.570712,31.002295],[121.567959,31.000879],[121.570475,30.998345],[121.561494,30.995644],[121.555918,30.995152],[121.556224,30.993374],[121.553304,30.993026],[121.55279,30.98886],[121.549537,30.988307],[121.54613,30.99305],[121.543294,30.994203],[121.538233,30.993146],[121.537774,30.994683],[121.534507,30.995848],[121.531962,30.994815],[121.528612,30.99592],[121.522897,30.99981],[121.520325,30.999354],[121.520089,31.00256],[121.522105,31.002199],[121.520853,31.004445],[121.517002,31.007626],[121.510412,31.004553],[121.507881,31.004745],[121.503057,31.002716],[121.49883,30.999426],[121.498872,30.998213],[121.495924,30.998297],[121.491948,31.010039],[121.492879,31.012752],[121.489153,31.014949],[121.485872,31.014073],[121.476362,31.01334],[121.47144,31.011948],[121.465587,31.008755],[121.459942,31.007398],[121.448305,31.007458],[121.440811,31.005789],[121.436834,31.00406],[121.433636,31.001779],[121.431426,30.999174],[121.423973,30.994515],[121.413184,30.991069],[121.409333,30.990229],[121.394261,30.988247],[121.375227,30.982832],[121.35871,30.97786]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310113,\"name\":\"宝山区\",\"center\":[121.489934,31.398896],\"centroid\":[121.404861,31.392111],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":8,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.425252,31.270661],[121.419496,31.265237],[121.41577,31.265896],[121.41527,31.26914],[121.410598,31.270373],[121.41096,31.273175],[121.40544,31.273067],[121.406496,31.276862],[121.404564,31.276227],[121.400087,31.278071],[121.404453,31.286223],[121.400379,31.286115],[121.398446,31.287145],[121.399559,31.288904],[121.39789,31.29052],[121.393483,31.291274],[121.394762,31.294674],[121.388394,31.29526],[121.384765,31.294446],[121.381623,31.292711],[121.38154,31.289431],[121.376242,31.290592],[121.374838,31.289096],[121.370153,31.290329],[121.369666,31.28912],[121.363785,31.291334],[121.363785,31.292028],[121.358585,31.293465],[121.360295,31.294674],[121.363534,31.302741],[121.360309,31.302717],[121.354803,31.299808],[121.352954,31.301663],[121.348894,31.299246],[121.349659,31.297582],[121.346892,31.296349],[121.34685,31.297654],[121.340927,31.297439],[121.341011,31.293716],[121.338675,31.293225],[121.336506,31.294901],[121.33588,31.297044],[121.334198,31.296122],[121.331306,31.301436],[121.335686,31.303339],[121.338981,31.310101],[121.340357,31.311525],[121.343458,31.317185],[121.347698,31.316706],[121.347782,31.319542],[121.3492,31.321313],[121.345585,31.320835],[121.344848,31.323335],[121.347517,31.324077],[121.345932,31.32513],[121.342318,31.331005],[121.341692,31.33329],[121.342846,31.336066],[121.34628,31.336329],[121.344347,31.341928],[121.342401,31.341306],[121.338925,31.344775],[121.337521,31.344536],[121.336464,31.346821],[121.332502,31.347084],[121.332251,31.351307],[121.334643,31.3509],[121.337743,31.3534],[121.337118,31.356019],[121.341428,31.357802],[121.340329,31.360517],[121.338911,31.360995],[121.337576,31.364189],[121.335018,31.366963],[121.335991,31.370097],[121.333336,31.371281],[121.334003,31.37262],[121.331389,31.37433],[121.328734,31.377344],[121.331306,31.378456],[121.330527,31.381135],[121.326607,31.381063],[121.323061,31.388489],[121.320419,31.389123],[121.323339,31.393331],[121.323145,31.395866],[121.321476,31.397576],[121.317444,31.39742],[121.314747,31.398365],[121.315637,31.402729],[121.317375,31.403661],[121.314316,31.4072],[121.32847,31.411958],[121.330444,31.410308],[121.333141,31.410739],[121.332488,31.413117],[121.334101,31.413655],[121.33239,31.416943],[121.336561,31.419058],[121.336422,31.424999],[121.335143,31.429158],[121.336645,31.429493],[121.336603,31.432254],[121.333656,31.440118],[121.331236,31.439652],[121.328261,31.441098],[121.326106,31.448041],[121.327399,31.448829],[121.324132,31.455007],[121.319794,31.454876],[121.318654,31.456895],[121.320531,31.457289],[121.317778,31.460109],[121.317277,31.466262],[121.320058,31.466728],[121.320572,31.469058],[121.317958,31.468472],[121.31426,31.472474],[121.318807,31.475055],[121.315956,31.481219],[121.313342,31.480598],[121.310214,31.487311],[121.308629,31.488649],[121.31027,31.489735],[121.309171,31.492495],[121.306544,31.493307],[121.304667,31.495779],[121.300857,31.496747],[121.299926,31.499756],[121.302595,31.502599],[121.305876,31.503435],[121.305529,31.505333],[121.310353,31.505919],[121.311938,31.502909],[121.315345,31.501273],[121.316652,31.505775],[121.320169,31.505883],[121.321879,31.503399],[121.32003,31.502993],[121.319905,31.49972],[121.323701,31.499649],[121.323131,31.502288],[121.327218,31.504247],[121.329512,31.504247],[121.335838,31.508295],[121.343499,31.512057],[121.357751,31.508259],[121.362255,31.50679],[121.376298,31.501106],[121.405426,31.487215],[121.406288,31.485388],[121.403966,31.481494],[121.404328,31.479212],[121.409694,31.476321],[121.41869,31.470682],[121.434276,31.458496],[121.446024,31.450717],[121.463696,31.438277],[121.481339,31.427294],[121.49427,31.417851],[121.505991,31.407021],[121.507228,31.409722],[121.501319,31.411982],[121.502362,31.413404],[121.510801,31.409973],[121.517239,31.406303],[121.516585,31.405287],[121.509425,31.408288],[121.507353,31.405933],[121.521229,31.39479],[121.512372,31.385858],[121.507284,31.379102],[121.503835,31.373744],[121.50346,31.369403],[121.503835,31.36493],[121.508424,31.357251],[121.514903,31.352],[121.525483,31.346797],[121.522883,31.342885],[121.520256,31.344033],[121.517628,31.340779],[121.50556,31.345732],[121.493575,31.330299],[121.497593,31.328109],[121.498928,31.325322],[121.496216,31.323347],[121.496717,31.311489],[121.485413,31.311573],[121.485372,31.314636],[121.479171,31.314696],[121.472956,31.315797],[121.468312,31.316036],[121.468145,31.32032],[121.465378,31.321397],[121.457133,31.321002],[121.4547,31.319243],[121.447887,31.317101],[121.44672,31.319817],[121.436765,31.319662],[121.436459,31.32087],[121.433595,31.32087],[121.432468,31.318669],[121.434623,31.312303],[121.432163,31.31168],[121.431676,31.309478],[121.432441,31.305912],[121.431287,31.303638],[121.426434,31.303207],[121.426935,31.298528],[121.42364,31.297259],[121.420039,31.296912],[121.418648,31.292256],[121.419691,31.291071],[121.423806,31.291011],[121.422833,31.28426],[121.424432,31.280238],[121.424571,31.27193],[121.425252,31.270661]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310114,\"name\":\"嘉定区\",\"center\":[121.250333,31.383524],\"centroid\":[121.244394,31.358136],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":9,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.336506,31.294901],[121.332891,31.292998],[121.33353,31.291107],[121.326384,31.288928],[121.327316,31.285182],[121.328998,31.284595],[121.332738,31.286067],[121.335004,31.279711],[121.336061,31.280046],[121.336228,31.275461],[121.338883,31.275006],[121.338272,31.272839],[121.343541,31.271439],[121.344723,31.273917],[121.35732,31.271415],[121.358918,31.268793],[121.361268,31.27084],[121.367441,31.269631],[121.366996,31.266662],[121.362227,31.26756],[121.35985,31.266997],[121.358918,31.263609],[121.361783,31.259945],[121.366023,31.259358],[121.365884,31.257682],[121.374574,31.257059],[121.375158,31.25949],[121.377508,31.259478],[121.380886,31.257766],[121.377216,31.247719],[121.375686,31.244486],[121.3731,31.245683],[121.372349,31.243755],[121.368387,31.247384],[121.366718,31.246342],[121.363117,31.240091],[121.36067,31.238642],[121.360086,31.240498],[121.356068,31.240151],[121.356054,31.237803],[121.354177,31.237121],[121.352856,31.238342],[121.348741,31.239372],[121.350131,31.241839],[121.348922,31.243863],[121.347281,31.243192],[121.346822,31.241037],[121.344612,31.243552],[121.345585,31.239887],[121.340872,31.239947],[121.338355,31.237528],[121.334935,31.235887],[121.333878,31.232006],[121.32612,31.229575],[121.322853,31.229623],[121.315386,31.227204],[121.302998,31.230605],[121.296922,31.231048],[121.29264,31.232761],[121.288538,31.238198],[121.287301,31.243276],[121.283742,31.245192],[121.28142,31.248174],[121.284228,31.251838],[121.280363,31.251886],[121.275302,31.253527],[121.271284,31.252258],[121.264444,31.256496],[121.263985,31.259155],[121.260217,31.258328],[121.254405,31.259634],[121.254183,31.258688],[121.246758,31.258448],[121.246577,31.259801],[121.242253,31.25937],[121.237693,31.262088],[121.235177,31.262699],[121.229087,31.262711],[121.229198,31.261717],[121.223539,31.260532],[121.223859,31.259035],[121.220216,31.257406],[121.221273,31.256293],[121.214182,31.254353],[121.212625,31.259837],[121.209761,31.260831],[121.209816,31.258017],[121.208482,31.25749],[121.206368,31.260065],[121.202865,31.257131],[121.203143,31.255814],[121.199848,31.255239],[121.19608,31.253395],[121.19626,31.251228],[121.193368,31.251455],[121.193021,31.253623],[121.188377,31.25476],[121.186444,31.252329],[121.183928,31.252246],[121.181537,31.254413],[121.17934,31.253419],[121.178798,31.255862],[121.176768,31.254605],[121.174251,31.256856],[121.171415,31.254928],[121.16894,31.256197],[121.170386,31.259119],[121.168036,31.259622],[121.167661,31.263944],[121.162614,31.269176],[121.161057,31.26762],[121.157845,31.270541],[121.155537,31.266147],[121.151783,31.267632],[121.153924,31.272061],[121.153743,31.276646],[121.155481,31.278442],[121.155537,31.280765],[121.159402,31.281579],[121.161293,31.283985],[121.159305,31.28766],[121.156399,31.287408],[121.154967,31.290209],[121.153145,31.28997],[121.151282,31.291933],[121.152714,31.294075],[121.148933,31.298875],[121.150782,31.299018],[121.146903,31.305936],[121.143774,31.309706],[121.13895,31.305625],[121.139645,31.302992],[121.133778,31.30207],[121.129954,31.302597],[121.129134,31.307528],[121.129773,31.308306],[121.127966,31.311884],[121.128633,31.314265],[121.127076,31.316934],[121.127257,31.319315],[121.131637,31.32324],[121.131539,31.325441],[121.133305,31.325585],[121.132582,31.331962],[121.13115,31.332106],[121.130121,31.334702],[121.130816,31.341509],[121.130441,31.344213],[121.123948,31.342753],[121.117969,31.343447],[121.11733,31.34712],[121.120194,31.347562],[121.117246,31.351689],[121.111838,31.350517],[121.111157,31.351534],[121.10832,31.350649],[121.108418,31.354034],[121.107361,31.354763],[121.108251,31.360457],[121.106749,31.364535],[121.106958,31.366593],[121.10889,31.366509],[121.10928,31.364703],[121.112853,31.365133],[121.113173,31.36688],[121.120208,31.368674],[121.119082,31.370563],[121.11523,31.371137],[121.113757,31.37445],[121.118206,31.375837],[121.12328,31.37848],[121.124268,31.376722],[121.131247,31.379664],[121.131762,31.378815],[121.138408,31.381147],[121.137518,31.382785],[121.141049,31.384531],[121.141425,31.38355],[121.148432,31.385404],[121.148988,31.38691],[121.147097,31.3899],[121.14383,31.392327],[121.149475,31.394503],[121.147653,31.397325],[121.152742,31.398174],[121.149586,31.399381],[121.15049,31.402215],[121.153896,31.403685],[121.153104,31.405837],[121.157887,31.407893],[121.15886,31.410117],[121.154508,31.411575],[121.155523,31.413835],[121.153493,31.413679],[121.148905,31.415867],[121.149266,31.41913],[121.146208,31.419704],[121.146249,31.421078],[121.151157,31.421796],[121.155273,31.42574],[121.161362,31.425776],[121.162002,31.427951],[121.16431,31.427222],[121.16253,31.429565],[121.162711,31.432218],[121.158484,31.432254],[121.152492,31.433604],[121.14782,31.436186],[121.146569,31.439006],[121.147348,31.44393],[121.160917,31.449678],[121.163045,31.448865],[121.166048,31.450168],[121.16773,31.448315],[121.16983,31.450024],[121.174974,31.449295],[121.180814,31.451458],[121.186055,31.454362],[121.185457,31.457468],[121.186055,31.460814],[121.195051,31.467827],[121.202906,31.469356],[121.203421,31.472331],[121.206368,31.474995],[121.214377,31.479128],[121.21503,31.477528],[121.21364,31.475939],[121.219062,31.475222],[121.220731,31.47607],[121.225361,31.476022],[121.226209,31.477683],[121.230352,31.477432],[121.230839,31.481111],[121.22867,31.482127],[121.232994,31.487896],[121.235413,31.488099],[121.234746,31.492686],[121.237234,31.491957],[121.240877,31.493701],[121.241141,31.490906],[121.243797,31.487311],[121.244409,31.481183],[121.248176,31.481876],[121.245813,31.479881],[121.247064,31.477062],[121.249692,31.477623],[121.251221,31.479606],[121.253362,31.479809],[121.253627,31.483082],[121.255643,31.483632],[121.254794,31.477635],[121.261454,31.478854],[121.261732,31.480777],[121.265153,31.48313],[121.267433,31.483357],[121.267322,31.486224],[121.268879,31.487466],[121.272049,31.484337],[121.27622,31.485376],[121.276442,31.486654],[121.280321,31.488672],[121.279696,31.490404],[121.283686,31.489795],[121.285355,31.490679],[121.289387,31.489031],[121.29061,31.491694],[121.293488,31.489807],[121.298605,31.491515],[121.298563,31.493713],[121.300496,31.494537],[121.300857,31.496747],[121.304667,31.495779],[121.306544,31.493307],[121.309171,31.492495],[121.31027,31.489735],[121.308629,31.488649],[121.310214,31.487311],[121.313342,31.480598],[121.315956,31.481219],[121.318807,31.475055],[121.31426,31.472474],[121.317958,31.468472],[121.320572,31.469058],[121.320058,31.466728],[121.317277,31.466262],[121.317778,31.460109],[121.320531,31.457289],[121.318654,31.456895],[121.319794,31.454876],[121.324132,31.455007],[121.327399,31.448829],[121.326106,31.448041],[121.328261,31.441098],[121.331236,31.439652],[121.333656,31.440118],[121.336603,31.432254],[121.336645,31.429493],[121.335143,31.429158],[121.336422,31.424999],[121.336561,31.419058],[121.33239,31.416943],[121.334101,31.413655],[121.332488,31.413117],[121.333141,31.410739],[121.330444,31.410308],[121.32847,31.411958],[121.314316,31.4072],[121.317375,31.403661],[121.315637,31.402729],[121.314747,31.398365],[121.317444,31.39742],[121.321476,31.397576],[121.323145,31.395866],[121.323339,31.393331],[121.320419,31.389123],[121.323061,31.388489],[121.326607,31.381063],[121.330527,31.381135],[121.331306,31.378456],[121.328734,31.377344],[121.331389,31.37433],[121.334003,31.37262],[121.333336,31.371281],[121.335991,31.370097],[121.335018,31.366963],[121.337576,31.364189],[121.338911,31.360995],[121.340329,31.360517],[121.341428,31.357802],[121.337118,31.356019],[121.337743,31.3534],[121.334643,31.3509],[121.332251,31.351307],[121.332502,31.347084],[121.336464,31.346821],[121.337521,31.344536],[121.338925,31.344775],[121.342401,31.341306],[121.344347,31.341928],[121.34628,31.336329],[121.342846,31.336066],[121.341692,31.33329],[121.342318,31.331005],[121.345932,31.32513],[121.347517,31.324077],[121.344848,31.323335],[121.345585,31.320835],[121.3492,31.321313],[121.347782,31.319542],[121.347698,31.316706],[121.343458,31.317185],[121.340357,31.311525],[121.338981,31.310101],[121.335686,31.303339],[121.331306,31.301436],[121.334198,31.296122],[121.33588,31.297044],[121.336506,31.294901]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310115,\"name\":\"浦东新区\",\"center\":[121.567706,31.245944],\"centroid\":[121.742177,31.083823],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":10,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.570475,30.998345],[121.567959,31.000879],[121.570712,31.002295],[121.570253,31.004565],[121.571463,31.005633],[121.569725,31.010603],[121.568181,31.010063],[121.565859,31.011912],[121.569822,31.012452],[121.571018,31.016426],[121.574674,31.018634],[121.574758,31.020951],[121.572325,31.026677],[121.56839,31.025284],[121.569057,31.024396],[121.564302,31.021191],[121.56027,31.024132],[121.558699,31.020255],[121.556474,31.020255],[121.556516,31.01873],[121.554139,31.01861],[121.552262,31.020915],[121.552804,31.023268],[121.555765,31.022908],[121.558407,31.024528],[121.558254,31.029533],[121.559505,31.030278],[121.559464,31.041391],[121.562119,31.043635],[121.559811,31.044812],[121.557031,31.04798],[121.556127,31.047632],[121.554737,31.050824],[121.552693,31.0493],[121.550538,31.049396],[121.54955,31.047908],[121.547799,31.048544],[121.54588,31.047044],[121.541472,31.046396],[121.542307,31.049072],[121.540791,31.052528],[121.54328,31.054016],[121.543308,31.055696],[121.548383,31.056896],[121.547201,31.061647],[121.548549,31.063639],[121.551094,31.063795],[121.551789,31.065643],[121.556753,31.06737],[121.55279,31.069506],[121.555599,31.071689],[121.559033,31.072169],[121.557531,31.073357],[121.562675,31.074305],[121.56262,31.075121],[121.567639,31.0762],[121.575272,31.080063],[121.572658,31.081323],[121.571643,31.080063],[121.569766,31.081611],[121.563579,31.082486],[121.561563,31.08365],[121.557031,31.082702],[121.556405,31.081059],[121.553555,31.080303],[121.550565,31.082834],[121.548549,31.086889],[121.551539,31.088148],[121.551608,31.090128],[121.559088,31.091951],[121.561563,31.09357],[121.561855,31.091867],[121.564358,31.091891],[121.567264,31.09363],[121.566819,31.096569],[121.563315,31.098955],[121.562064,31.101258],[121.563649,31.101858],[121.561132,31.105264],[121.561396,31.106224],[121.557851,31.109797],[121.559867,31.111896],[121.556697,31.113083],[121.555279,31.114882],[121.553332,31.112688],[121.552317,31.113899],[121.549217,31.113419],[121.550426,31.11162],[121.547687,31.109653],[121.544225,31.111464],[121.542251,31.116153],[121.539526,31.115626],[121.537885,31.113983],[121.535341,31.117976],[121.532254,31.117208],[121.53142,31.11842],[121.525289,31.116741],[121.522869,31.115242],[121.521424,31.116309],[121.514513,31.115278],[121.513749,31.118012],[121.511343,31.12119],[121.50549,31.120002],[121.503863,31.118324],[121.505295,31.115494],[121.501583,31.114666],[121.498538,31.121501],[121.49281,31.118719],[121.490266,31.124283],[121.485969,31.124523],[121.485705,31.121933],[121.48191,31.120086],[121.481256,31.118024],[121.477446,31.117328],[121.481353,31.110697],[121.477321,31.110853],[121.474137,31.114354],[121.473984,31.112915],[121.470286,31.110937],[121.465211,31.1121],[121.469299,31.118731],[121.469674,31.124859],[121.468729,31.127868],[121.462431,31.134463],[121.457453,31.142232],[121.457453,31.146451],[121.460387,31.150276],[121.46574,31.155118],[121.468354,31.158091],[121.469369,31.162298],[121.468159,31.167092],[121.464905,31.17541],[121.464905,31.178022],[121.466254,31.18109],[121.468729,31.184122],[121.475987,31.187885],[121.490752,31.191467],[121.494631,31.192857],[121.498066,31.195601],[121.501319,31.199747],[121.508368,31.210158],[121.509911,31.214506],[121.509397,31.218459],[121.506741,31.223119],[121.502014,31.228018],[121.495744,31.232977],[121.493491,31.23615],[121.493491,31.240163],[121.494826,31.24221],[121.500012,31.244989],[121.50688,31.246474],[121.516488,31.246953],[121.527555,31.247252],[121.536384,31.249623],[121.541542,31.251826],[121.559074,31.264219],[121.563537,31.268805],[121.568515,31.275701],[121.56953,31.279567],[121.569141,31.285254],[121.565456,31.294135],[121.562523,31.29976],[121.561758,31.303339],[121.561883,31.321158],[121.560493,31.32781],[121.558574,31.331256],[121.555779,31.333948],[121.549398,31.337789],[121.525483,31.346797],[121.514903,31.352],[121.508424,31.357251],[121.503835,31.36493],[121.50346,31.369403],[121.503835,31.373744],[121.507284,31.379102],[121.512372,31.385858],[121.521229,31.39479],[121.538011,31.388489],[121.559811,31.38361],[121.593708,31.376411],[121.603038,31.372656],[121.610559,31.368195],[121.689448,31.322462],[121.712431,31.309407],[121.722511,31.303518],[121.729101,31.298288],[121.743742,31.283207],[121.809812,31.196907],[121.853358,31.155346],[121.884029,31.130638],[121.889465,31.121705],[121.94679,31.065883],[121.962682,31.047284],[121.977558,31.016101],[121.990934,30.968432],[121.996231,30.935458],[121.998497,30.899961],[121.996982,30.874898],[121.993951,30.863055],[121.985372,30.850694],[121.970732,30.839077],[121.954715,30.825811],[121.954326,30.821409],[121.955466,30.817138],[121.969703,30.789202],[121.943689,30.777096],[121.9246,30.8066],[121.915284,30.812892],[121.904467,30.814155],[121.793767,30.816862],[121.769338,30.85043],[121.768143,30.863272],[121.771605,30.875427],[121.772481,30.875703],[121.773134,30.880596],[121.776679,30.881005],[121.776012,30.886426],[121.778807,30.894588],[121.778987,30.899468],[121.778334,30.903807],[121.77896,30.910116],[121.780239,30.911811],[121.781115,30.917567],[121.777653,30.926723],[121.777806,30.931025],[121.77337,30.931553],[121.773023,30.933932],[121.769769,30.935278],[121.76799,30.93833],[121.766432,30.936539],[121.763846,30.936852],[121.764277,30.938522],[121.761469,30.938414],[121.761677,30.940132],[121.764542,30.941766],[121.760927,30.944613],[121.761024,30.947604],[121.759286,30.949154],[121.751987,30.952721],[121.749234,30.953046],[121.747857,30.951893],[121.743742,30.956589],[121.739988,30.956721],[121.73686,30.958703],[121.737916,30.960637],[121.733954,30.964469],[121.73191,30.967784],[121.712792,30.980934],[121.705507,30.984981],[121.699459,30.987419],[121.69298,30.98934],[121.688086,30.990145],[121.683595,30.989808],[121.674558,30.991802],[121.673348,30.989832],[121.669525,30.991609],[121.663115,30.992714],[121.654536,30.993254],[121.646695,30.99335],[121.62057,30.992678],[121.61772,30.995692],[121.614717,31.001251],[121.604066,31.001131],[121.595585,31.002043],[121.594682,31.000699],[121.584309,31.000819],[121.582933,30.999498],[121.576746,30.999474],[121.570475,30.998345]]],[[[121.943244,31.215465],[121.946595,31.224365],[121.951044,31.228821],[121.957259,31.230414],[121.969188,31.230282],[121.980659,31.22809],[121.989655,31.224521],[122.008563,31.220987],[122.011038,31.217405],[122.012609,31.210002],[122.012011,31.192043],[122.010593,31.188004],[121.999554,31.165079],[121.99573,31.1608],[121.975862,31.158834],[121.970773,31.157552],[121.965685,31.15754],[121.959637,31.159278],[121.952629,31.1672],[121.948027,31.176405],[121.944843,31.186878],[121.942619,31.198465],[121.941826,31.207678],[121.943244,31.215465]]],[[[121.882625,31.240857],[121.88991,31.242594],[121.897363,31.242115],[121.915451,31.236558],[121.923557,31.233863],[121.926727,31.229731],[121.927519,31.224017],[121.925448,31.205438],[121.922445,31.196859],[121.918788,31.194319],[121.913852,31.19384],[121.908777,31.195266],[121.901645,31.20146],[121.889271,31.214997],[121.885155,31.22052],[121.882541,31.225611],[121.880873,31.23633],[121.882625,31.240857]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310116,\"name\":\"金山区\",\"center\":[121.330736,30.724697],\"centroid\":[121.255144,30.818932],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":11,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.99673,30.950307],[121.002055,30.95104],[121.002653,30.947015],[121.00763,30.947628],[121.010175,30.950727],[121.015361,30.948169],[121.013345,30.946811],[121.011079,30.947184],[121.011607,30.943604],[121.013831,30.944168],[121.015291,30.940288],[121.017697,30.939219],[121.016932,30.941333],[121.019462,30.941165],[121.028041,30.94394],[121.02989,30.944457],[121.029612,30.941874],[121.031851,30.939771],[121.031503,30.936083],[121.028694,30.92754],[121.028319,30.922602],[121.025872,30.91675],[121.024885,30.911618],[121.025288,30.909059],[121.034659,30.90615],[121.034395,30.902737],[121.038788,30.902148],[121.040332,30.904504],[121.040874,30.900706],[121.04232,30.899408],[121.045184,30.901896],[121.053026,30.903374],[121.056529,30.90335],[121.067944,30.904504],[121.068973,30.902124],[121.072491,30.903182],[121.072421,30.904924],[121.080833,30.905946],[121.081806,30.904251],[121.083725,30.905285],[121.091664,30.90341],[121.094347,30.904804],[121.09425,30.902545],[121.097128,30.903206],[121.098782,30.906607],[121.096196,30.910332],[121.093805,30.909708],[121.089092,30.911979],[121.089022,30.915296],[121.091358,30.916185],[121.100395,30.926459],[121.104358,30.922758],[121.105122,30.920138],[121.110962,30.921749],[121.114591,30.921676],[121.121445,30.919958],[121.119346,30.911991],[121.117802,30.910705],[121.113506,30.903602],[121.110851,30.90103],[121.111087,30.899228],[121.113451,30.897425],[121.118164,30.901487],[121.122224,30.901114],[121.123545,30.902857],[121.130163,30.902593],[121.131706,30.899732],[121.134417,30.901812],[121.141258,30.901331],[121.14098,30.904984],[121.139673,30.907388],[121.14009,30.910332],[121.13742,30.913349],[121.139061,30.91961],[121.143246,30.918108],[121.142162,30.915596],[121.149836,30.912616],[121.152895,30.9102],[121.156649,30.909972],[121.156288,30.912616],[121.156746,30.918961],[121.158206,30.920295],[121.164616,30.919934],[121.16691,30.916978],[121.171262,30.914683],[121.174654,30.915115],[121.186472,30.915404],[121.187765,30.916593],[121.194828,30.917314],[121.207522,30.919886],[121.211026,30.92128],[121.218145,30.927684],[121.222997,30.930748],[121.227335,30.926783],[121.234495,30.928562],[121.234773,30.925978],[121.238166,30.924861],[121.240655,30.925149],[121.242935,30.91991],[121.244589,30.920307],[121.245507,30.917074],[121.243686,30.917855],[121.246619,30.9099],[121.255226,30.909551],[121.255893,30.907977],[121.258952,30.907208],[121.262122,30.908097],[121.262525,30.906835],[121.266932,30.906258],[121.266168,30.901715],[121.269046,30.901679],[121.270422,30.900165],[121.27298,30.900405],[121.274663,30.896078],[121.279098,30.897112],[121.27964,30.894456],[121.282073,30.894804],[121.28231,30.896571],[121.285257,30.896631],[121.285799,30.895429],[121.288413,30.896066],[121.288719,30.899961],[121.290151,30.900021],[121.291013,30.902677],[121.290068,30.909804],[121.288705,30.909912],[121.288844,30.916894],[121.294948,30.918504],[121.294809,30.914947],[121.296269,30.914959],[121.29848,30.909744],[121.301775,30.908458],[121.303443,30.909287],[121.303721,30.912099],[121.306502,30.912123],[121.306808,30.910212],[121.313829,30.910717],[121.314608,30.909143],[121.320127,30.91109],[121.321518,30.908986],[121.325939,30.908962],[121.327635,30.91014],[121.331097,30.907508],[121.334657,30.907737],[121.336631,30.906739],[121.340162,30.908554],[121.343819,30.909119],[121.347573,30.913145],[121.350604,30.911402],[121.351814,30.913217],[121.35668,30.908614],[121.358418,30.900598],[121.360476,30.897785],[121.361185,30.892977],[121.36327,30.886955],[121.367233,30.886667],[121.370166,30.883914],[121.371751,30.883698],[121.377535,30.879983],[121.382207,30.878961],[121.381498,30.876605],[121.382791,30.874489],[121.38286,30.869043],[121.381873,30.867324],[121.381929,30.863765],[121.384001,30.863488],[121.383472,30.859232],[121.384376,30.856238],[121.383722,30.851765],[121.384918,30.848073],[121.385446,30.843178],[121.379065,30.843238],[121.379259,30.840112],[121.383764,30.833906],[121.387588,30.832799],[121.387588,30.829864],[121.391717,30.829913],[121.392051,30.82782],[121.396986,30.827988],[121.397376,30.833292],[121.399712,30.834182],[121.404202,30.833797],[121.403632,30.829877],[121.400685,30.830105],[121.400991,30.827399],[121.404786,30.823081],[121.41235,30.821505],[121.414171,30.821757],[121.41552,30.819941],[121.415131,30.815803],[121.419288,30.81602],[121.420525,30.819797],[121.425989,30.81869],[121.437029,30.818101],[121.441645,30.806829],[121.445427,30.804868],[121.44672,30.805577],[121.451711,30.798323],[121.465072,30.776483],[121.478767,30.756347],[121.426365,30.730283],[121.406997,30.718086],[121.361894,30.67952],[121.35433,30.676991],[121.346642,30.675593],[121.326718,30.67593],[121.291041,30.678328],[121.274649,30.6774],[121.271604,30.69689],[121.270422,30.69807],[121.270672,30.701563],[121.268656,30.702129],[121.268031,30.706103],[121.266668,30.706296],[121.265862,30.709488],[121.268448,30.712149],[121.267057,30.715039],[121.270339,30.716894],[121.270102,30.72047],[121.272035,30.723252],[121.270339,30.725864],[121.271451,30.726948],[121.269755,30.730729],[121.271451,30.73227],[121.26817,30.734931],[121.266835,30.733498],[121.261343,30.738217],[121.256393,30.743948],[121.244756,30.749185],[121.243102,30.750533],[121.23729,30.752651],[121.232298,30.755817],[121.230686,30.763737],[121.229115,30.767974],[121.226918,30.770826],[121.226209,30.775087],[121.224624,30.776976],[121.2234,30.775977],[121.217992,30.784954],[121.213723,30.785929],[121.205534,30.785905],[121.200098,30.783294],[121.199166,30.780755],[121.20032,30.773618],[121.196956,30.773354],[121.191839,30.778853],[121.190963,30.781092],[121.189517,30.778974],[121.186361,30.779034],[121.185791,30.776651],[121.183441,30.775038],[121.179965,30.774376],[121.174668,30.772018],[121.170984,30.774677],[121.170789,30.777084],[121.168968,30.775953],[121.163434,30.775279],[121.160737,30.773221],[121.160681,30.776579],[121.155815,30.777205],[121.152687,30.778974],[121.144122,30.779479],[121.140618,30.776928],[121.1387,30.77842],[121.13603,30.777337],[121.131817,30.777313],[121.127521,30.778673],[121.12342,30.77895],[121.117219,30.786073],[121.120041,30.788552],[121.125255,30.788179],[121.126576,30.788998],[121.126047,30.79304],[121.128202,30.810221],[121.130218,30.815574],[121.132373,30.819279],[121.13742,30.825029],[121.13742,30.829985],[121.136239,30.827868],[121.134264,30.828505],[121.132916,30.831608],[121.134612,30.833028],[121.131609,30.83601],[121.129982,30.834892],[121.127688,30.83565],[121.120639,30.836335],[121.117747,30.835301],[121.119832,30.83773],[121.12025,30.843299],[121.123545,30.847267],[121.121153,30.850165],[121.120055,30.849119],[121.114744,30.851476],[121.113159,30.854049],[121.110906,30.851416],[121.104789,30.849335],[121.102272,30.850261],[121.097684,30.854927],[121.097712,30.857103],[121.080471,30.848746],[121.066999,30.84877],[121.06052,30.845187],[121.061674,30.843383],[121.060228,30.842793],[121.062049,30.83779],[121.056335,30.835602],[121.046755,30.831091],[121.048896,30.825186],[121.045101,30.825907],[121.043516,30.828157],[121.039956,30.827218],[121.04175,30.825378],[121.040276,30.82438],[121.039192,30.820867],[121.03769,30.820266],[121.03908,30.818582],[121.043752,30.820013],[121.044976,30.815526],[121.037912,30.81389],[121.036647,30.818449],[121.030057,30.828553],[121.014874,30.833954],[121.014402,30.835818],[121.010898,30.834615],[121.006935,30.830779],[121.003446,30.826304],[121.00054,30.829431],[120.994603,30.821493],[120.990918,30.822708],[120.992754,30.825691],[120.989153,30.828698],[120.992462,30.831572],[120.989125,30.832318],[120.989987,30.834724],[120.992865,30.838392],[120.995659,30.838572],[120.997759,30.84408],[120.9999,30.843335],[121.000985,30.845632],[121.003974,30.846101],[121.006463,30.850454],[121.008006,30.850574],[121.010133,30.853135],[121.013359,30.851692],[121.015013,30.853604],[121.010981,30.856033],[121.015403,30.86053],[121.016265,30.862851],[121.013971,30.86439],[121.01778,30.86938],[121.014819,30.871027],[121.01778,30.873359],[121.020463,30.87188],[121.019796,30.873996],[121.021896,30.875162],[121.019421,30.876665],[121.021465,30.878793],[121.0186,30.880716],[121.017474,30.882724],[121.011092,30.882219],[121.008298,30.882964],[121.00852,30.888121],[121.005017,30.888794],[120.993824,30.88966],[120.992907,30.893915],[120.99046,30.89579],[120.992656,30.899732],[120.992809,30.90216],[120.995715,30.903723],[120.998635,30.903386],[120.998704,30.905946],[121.00257,30.904852],[121.004516,30.906955],[121.004572,30.909299],[120.998982,30.909527],[120.999622,30.91395],[121.000025,30.934701],[121.000818,30.937729],[120.997481,30.941141],[120.995673,30.944336],[120.996813,30.944625],[120.99673,30.950307]]],[[[121.426671,30.682183],[121.428589,30.681749],[121.426796,30.680315],[121.426671,30.682183]]],[[[121.422458,30.691482],[121.426615,30.691277],[121.428909,30.689109],[121.425364,30.687374],[121.419482,30.689856],[121.419469,30.691626],[121.422458,30.691482]]],[[[121.406775,30.704995],[121.409291,30.704514],[121.406622,30.703093],[121.406775,30.704995]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310117,\"name\":\"松江区\",\"center\":[121.223543,31.03047],\"centroid\":[121.220231,31.015194],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":12,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.323854,31.162933],[121.327218,31.156856],[121.328775,31.156665],[121.331528,31.15205],[121.331292,31.149772],[121.333711,31.148765],[121.335477,31.143862],[121.336728,31.14355],[121.338814,31.14017],[121.33677,31.138971],[121.342095,31.134655],[121.344681,31.130338],[121.344014,31.129451],[121.346002,31.126202],[121.34489,31.12577],[121.347545,31.121969],[121.346753,31.121657],[121.349589,31.117748],[121.353065,31.117604],[121.35066,31.115554],[121.353774,31.111512],[121.356026,31.112532],[121.357014,31.110529],[121.352217,31.106487],[121.351675,31.107735],[121.348532,31.106655],[121.351341,31.099255],[121.35839,31.100791],[121.359085,31.098931],[121.362756,31.099771],[121.368289,31.088976],[121.372016,31.079871],[121.370625,31.078372],[121.368804,31.079127],[121.365481,31.077892],[121.364341,31.073705],[121.362116,31.072601],[121.364424,31.069878],[121.363743,31.068354],[121.357278,31.066758],[121.358195,31.064047],[121.35344,31.061287],[121.343444,31.059139],[121.341456,31.062763],[121.335338,31.060435],[121.335102,31.04564],[121.33367,31.040695],[121.334017,31.031922],[121.333308,31.030686],[121.333892,31.026917],[121.333725,31.015657],[121.333072,31.01334],[121.339898,31.013857],[121.34279,31.014817],[121.34425,31.013941],[121.339829,31.010267],[121.33823,31.006197],[121.330347,30.996905],[121.327482,30.995896],[121.326773,30.994479],[121.326898,30.989964],[121.3258,30.9833],[121.327371,30.980658],[121.329554,30.981318],[121.334406,30.980694],[121.34375,30.976599],[121.351258,30.975986],[121.35871,30.97786],[121.359961,30.976251],[121.361435,30.970438],[121.36099,30.965574],[121.362853,30.959544],[121.363117,30.956109],[121.362255,30.9517],[121.362478,30.948901],[121.365467,30.947232],[121.363868,30.945165],[121.361129,30.944048],[121.362408,30.939122],[121.362658,30.934761],[121.359336,30.935086],[121.357361,30.933632],[121.354706,30.933512],[121.355679,30.932058],[121.35116,30.930628],[121.352203,30.928213],[121.352161,30.923803],[121.355373,30.921388],[121.356054,30.919742],[121.355081,30.916341],[121.351814,30.913217],[121.350604,30.911402],[121.347573,30.913145],[121.343819,30.909119],[121.340162,30.908554],[121.336631,30.906739],[121.334657,30.907737],[121.331097,30.907508],[121.327635,30.91014],[121.325939,30.908962],[121.321518,30.908986],[121.320127,30.91109],[121.314608,30.909143],[121.313829,30.910717],[121.306808,30.910212],[121.306502,30.912123],[121.303721,30.912099],[121.303443,30.909287],[121.301775,30.908458],[121.29848,30.909744],[121.296269,30.914959],[121.294809,30.914947],[121.294948,30.918504],[121.288844,30.916894],[121.288705,30.909912],[121.290068,30.909804],[121.291013,30.902677],[121.290151,30.900021],[121.288719,30.899961],[121.288413,30.896066],[121.285799,30.895429],[121.285257,30.896631],[121.28231,30.896571],[121.282073,30.894804],[121.27964,30.894456],[121.279098,30.897112],[121.274663,30.896078],[121.27298,30.900405],[121.270422,30.900165],[121.269046,30.901679],[121.266168,30.901715],[121.266932,30.906258],[121.262525,30.906835],[121.262122,30.908097],[121.258952,30.907208],[121.255893,30.907977],[121.255226,30.909551],[121.246619,30.9099],[121.243686,30.917855],[121.245507,30.917074],[121.244589,30.920307],[121.242935,30.91991],[121.240655,30.925149],[121.238166,30.924861],[121.234773,30.925978],[121.234495,30.928562],[121.227335,30.926783],[121.222997,30.930748],[121.218145,30.927684],[121.211026,30.92128],[121.207522,30.919886],[121.194828,30.917314],[121.187765,30.916593],[121.186472,30.915404],[121.174654,30.915115],[121.171262,30.914683],[121.16691,30.916978],[121.164616,30.919934],[121.158206,30.920295],[121.156746,30.918961],[121.156288,30.912616],[121.156649,30.909972],[121.152895,30.9102],[121.149836,30.912616],[121.142162,30.915596],[121.143246,30.918108],[121.139061,30.91961],[121.13742,30.913349],[121.14009,30.910332],[121.139673,30.907388],[121.14098,30.904984],[121.141258,30.901331],[121.134417,30.901812],[121.131706,30.899732],[121.130163,30.902593],[121.123545,30.902857],[121.122224,30.901114],[121.118164,30.901487],[121.113451,30.897425],[121.111087,30.899228],[121.110851,30.90103],[121.113506,30.903602],[121.117802,30.910705],[121.119346,30.911991],[121.121445,30.919958],[121.114591,30.921676],[121.110962,30.921749],[121.105122,30.920138],[121.104358,30.922758],[121.100395,30.926459],[121.091358,30.916185],[121.089022,30.915296],[121.089092,30.911979],[121.093805,30.909708],[121.096196,30.910332],[121.098782,30.906607],[121.097128,30.903206],[121.09425,30.902545],[121.094347,30.904804],[121.091664,30.90341],[121.083725,30.905285],[121.081806,30.904251],[121.080833,30.905946],[121.072421,30.904924],[121.072491,30.903182],[121.068973,30.902124],[121.067944,30.904504],[121.056529,30.90335],[121.053026,30.903374],[121.045184,30.901896],[121.04232,30.899408],[121.040874,30.900706],[121.040332,30.904504],[121.038788,30.902148],[121.034395,30.902737],[121.034659,30.90615],[121.025288,30.909059],[121.024885,30.911618],[121.025872,30.91675],[121.028319,30.922602],[121.028694,30.92754],[121.031503,30.936083],[121.031851,30.939771],[121.029612,30.941874],[121.02989,30.944457],[121.028041,30.94394],[121.027902,30.945826],[121.033213,30.947111],[121.034659,30.952974],[121.036258,30.957094],[121.040401,30.956493],[121.043516,30.957514],[121.042626,30.960433],[121.045949,30.963448],[121.043112,30.969429],[121.0467,30.970246],[121.047409,30.969033],[121.051024,30.969369],[121.053262,30.964445],[121.05735,30.965346],[121.056891,30.96191],[121.059505,30.959184],[121.060339,30.956517],[121.065344,30.95516],[121.07231,30.955088],[121.076495,30.955809],[121.076634,30.957574],[121.079109,30.958283],[121.078539,30.960025],[121.080736,30.960181],[121.081236,30.962283],[121.088174,30.962151],[121.088035,30.964168],[121.093555,30.964673],[121.097489,30.965634],[121.095779,30.968408],[121.095557,30.974245],[121.099172,30.973068],[121.099686,30.980994],[121.099227,30.981979],[121.100145,30.994935],[121.104107,30.99508],[121.104205,31.007998],[121.10205,31.011756],[121.093026,31.020207],[121.085532,31.0255],[121.089509,31.027901],[121.091177,31.025933],[121.096405,31.026437],[121.096975,31.031454],[121.099936,31.031202],[121.100284,31.03341],[121.097767,31.038871],[121.095863,31.040479],[121.09311,31.040719],[121.09621,31.044812],[121.090259,31.048136],[121.089926,31.05194],[121.087159,31.052948],[121.085866,31.050224],[121.082404,31.054208],[121.080972,31.056896],[121.08442,31.058779],[121.086519,31.061167],[121.085935,31.062847],[121.088202,31.064671],[121.092929,31.064539],[121.094542,31.061899],[121.093012,31.058443],[121.094639,31.056332],[121.098337,31.05662],[121.101146,31.053644],[121.101813,31.05728],[121.10839,31.057939],[121.10864,31.05662],[121.118206,31.056068],[121.117997,31.058407],[121.120708,31.057268],[121.12588,31.057376],[121.127757,31.059751],[121.126395,31.059811],[121.126228,31.06665],[121.122238,31.067178],[121.121543,31.07019],[121.118386,31.075948],[121.117121,31.075624],[121.112603,31.077628],[121.107264,31.082115],[121.102912,31.080219],[121.100687,31.080939],[121.099408,31.085941],[121.10084,31.088688],[121.097601,31.093534],[121.099519,31.094158],[121.099853,31.096593],[121.097976,31.099339],[121.100618,31.098428],[121.103843,31.100539],[121.103551,31.102638],[121.108751,31.107159],[121.112589,31.111932],[121.114368,31.109797],[121.11612,31.110973],[121.117733,31.108874],[121.120959,31.107747],[121.125505,31.103369],[121.127688,31.103309],[121.130691,31.100527],[121.131942,31.10205],[121.133319,31.099075],[121.135766,31.09808],[121.141605,31.09868],[121.141897,31.096893],[121.144483,31.097456],[121.14586,31.093954],[121.149461,31.095297],[121.151157,31.091651],[121.152867,31.092035],[121.153465,31.09014],[121.155161,31.090475],[121.155384,31.093162],[121.156733,31.09315],[121.156788,31.098943],[121.154341,31.098884],[121.154397,31.101846],[121.159569,31.100539],[121.165492,31.101438],[121.1652,31.104269],[121.166799,31.104293],[121.166451,31.10831],[121.170567,31.107819],[121.170497,31.109054],[121.174487,31.108538],[121.172986,31.114091],[121.17521,31.115242],[121.174321,31.117868],[121.17642,31.119007],[121.178839,31.117149],[121.183817,31.118695],[121.183858,31.124295],[121.181815,31.124295],[121.181842,31.126957],[121.180341,31.127425],[121.179868,31.131873],[121.181662,31.131777],[121.181968,31.143478],[121.194717,31.138179],[121.199653,31.139582],[121.201627,31.140937],[121.200348,31.137832],[121.206174,31.138299],[121.208287,31.135686],[121.22055,31.138383],[121.227988,31.139091],[121.226765,31.134139],[121.223581,31.126442],[121.221732,31.119931],[121.221301,31.115074],[121.224095,31.115146],[121.233884,31.117316],[121.235816,31.118959],[121.236831,31.125698],[121.239848,31.126238],[121.244534,31.125398],[121.245326,31.129295],[121.239348,31.129955],[121.245479,31.130758],[121.246995,31.134163],[121.25378,31.13264],[121.258048,31.132353],[121.257965,31.127077],[121.261607,31.127173],[121.26062,31.132269],[121.263623,31.135422],[121.26557,31.134787],[121.265737,31.136393],[121.280989,31.133252],[121.287482,31.139954],[121.284173,31.142627],[121.281781,31.142016],[121.279293,31.145708],[121.277012,31.144174],[121.276415,31.145852],[121.278723,31.14825],[121.277763,31.152265],[121.28028,31.150539],[121.283825,31.150839],[121.28313,31.152158],[121.285438,31.153452],[121.287134,31.152313],[121.295435,31.15392],[121.301441,31.15549],[121.316221,31.160189],[121.318056,31.157564],[121.320934,31.158487],[121.322491,31.162394],[121.323854,31.162933]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310118,\"name\":\"青浦区\",\"center\":[121.113021,31.151209],\"centroid\":[121.085182,31.124658],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":13,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.323854,31.162933],[121.322491,31.162394],[121.320934,31.158487],[121.318056,31.157564],[121.316221,31.160189],[121.301441,31.15549],[121.295435,31.15392],[121.287134,31.152313],[121.285438,31.153452],[121.28313,31.152158],[121.283825,31.150839],[121.28028,31.150539],[121.277763,31.152265],[121.278723,31.14825],[121.276415,31.145852],[121.277012,31.144174],[121.279293,31.145708],[121.281781,31.142016],[121.284173,31.142627],[121.287482,31.139954],[121.280989,31.133252],[121.265737,31.136393],[121.26557,31.134787],[121.263623,31.135422],[121.26062,31.132269],[121.261607,31.127173],[121.257965,31.127077],[121.258048,31.132353],[121.25378,31.13264],[121.246995,31.134163],[121.245479,31.130758],[121.239348,31.129955],[121.245326,31.129295],[121.244534,31.125398],[121.239848,31.126238],[121.236831,31.125698],[121.235816,31.118959],[121.233884,31.117316],[121.224095,31.115146],[121.221301,31.115074],[121.221732,31.119931],[121.223581,31.126442],[121.226765,31.134139],[121.227988,31.139091],[121.22055,31.138383],[121.208287,31.135686],[121.206174,31.138299],[121.200348,31.137832],[121.201627,31.140937],[121.199653,31.139582],[121.194717,31.138179],[121.181968,31.143478],[121.181662,31.131777],[121.179868,31.131873],[121.180341,31.127425],[121.181842,31.126957],[121.181815,31.124295],[121.183858,31.124295],[121.183817,31.118695],[121.178839,31.117149],[121.17642,31.119007],[121.174321,31.117868],[121.17521,31.115242],[121.172986,31.114091],[121.174487,31.108538],[121.170497,31.109054],[121.170567,31.107819],[121.166451,31.10831],[121.166799,31.104293],[121.1652,31.104269],[121.165492,31.101438],[121.159569,31.100539],[121.154397,31.101846],[121.154341,31.098884],[121.156788,31.098943],[121.156733,31.09315],[121.155384,31.093162],[121.155161,31.090475],[121.153465,31.09014],[121.152867,31.092035],[121.151157,31.091651],[121.149461,31.095297],[121.14586,31.093954],[121.144483,31.097456],[121.141897,31.096893],[121.141605,31.09868],[121.135766,31.09808],[121.133319,31.099075],[121.131942,31.10205],[121.130691,31.100527],[121.127688,31.103309],[121.125505,31.103369],[121.120959,31.107747],[121.117733,31.108874],[121.11612,31.110973],[121.114368,31.109797],[121.112589,31.111932],[121.108751,31.107159],[121.103551,31.102638],[121.103843,31.100539],[121.100618,31.098428],[121.097976,31.099339],[121.099853,31.096593],[121.099519,31.094158],[121.097601,31.093534],[121.10084,31.088688],[121.099408,31.085941],[121.100687,31.080939],[121.102912,31.080219],[121.107264,31.082115],[121.112603,31.077628],[121.117121,31.075624],[121.118386,31.075948],[121.121543,31.07019],[121.122238,31.067178],[121.126228,31.06665],[121.126395,31.059811],[121.127757,31.059751],[121.12588,31.057376],[121.120708,31.057268],[121.117997,31.058407],[121.118206,31.056068],[121.10864,31.05662],[121.10839,31.057939],[121.101813,31.05728],[121.101146,31.053644],[121.098337,31.05662],[121.094639,31.056332],[121.093012,31.058443],[121.094542,31.061899],[121.092929,31.064539],[121.088202,31.064671],[121.085935,31.062847],[121.086519,31.061167],[121.08442,31.058779],[121.080972,31.056896],[121.082404,31.054208],[121.085866,31.050224],[121.087159,31.052948],[121.089926,31.05194],[121.090259,31.048136],[121.09621,31.044812],[121.09311,31.040719],[121.095863,31.040479],[121.097767,31.038871],[121.100284,31.03341],[121.099936,31.031202],[121.096975,31.031454],[121.096405,31.026437],[121.091177,31.025933],[121.089509,31.027901],[121.085532,31.0255],[121.093026,31.020207],[121.10205,31.011756],[121.104205,31.007998],[121.104107,30.99508],[121.100145,30.994935],[121.099227,30.981979],[121.099686,30.980994],[121.099172,30.973068],[121.095557,30.974245],[121.095779,30.968408],[121.097489,30.965634],[121.093555,30.964673],[121.088035,30.964168],[121.088174,30.962151],[121.081236,30.962283],[121.080736,30.960181],[121.078539,30.960025],[121.079109,30.958283],[121.076634,30.957574],[121.076495,30.955809],[121.07231,30.955088],[121.065344,30.95516],[121.060339,30.956517],[121.059505,30.959184],[121.056891,30.96191],[121.05735,30.965346],[121.053262,30.964445],[121.051024,30.969369],[121.047409,30.969033],[121.0467,30.970246],[121.043112,30.969429],[121.045949,30.963448],[121.042626,30.960433],[121.043516,30.957514],[121.040401,30.956493],[121.036258,30.957094],[121.034659,30.952974],[121.033213,30.947111],[121.027902,30.945826],[121.028041,30.94394],[121.019462,30.941165],[121.016932,30.941333],[121.017697,30.939219],[121.015291,30.940288],[121.013831,30.944168],[121.011607,30.943604],[121.011079,30.947184],[121.013345,30.946811],[121.015361,30.948169],[121.010175,30.950727],[121.00763,30.947628],[121.002653,30.947015],[121.002055,30.95104],[120.99673,30.950307],[120.995368,30.950367],[120.994797,30.954824],[120.992531,30.955028],[120.991683,30.958211],[120.994756,30.958703],[120.992601,30.962835],[120.993699,30.964024],[120.991433,30.968372],[120.993143,30.972119],[120.99737,30.972444],[121.000512,30.973933],[121.000567,30.977007],[121.002361,30.97762],[121.000832,30.980466],[120.999344,30.980106],[120.997133,30.989232],[120.994603,30.991922],[120.994839,30.99526],[120.990515,30.994551],[120.989834,30.996664],[120.992045,30.997109],[120.992086,31.003424],[120.991057,31.00747],[120.991933,31.008154],[120.989987,31.010495],[120.989514,31.014397],[120.983855,31.014445],[120.982993,31.016089],[120.970202,31.016149],[120.963209,31.016594],[120.964849,31.019751],[120.964293,31.020771],[120.960483,31.021659],[120.958301,31.028573],[120.952197,31.030254],[120.951085,31.029077],[120.949124,31.029953],[120.948735,31.025068],[120.951168,31.024012],[120.949972,31.017638],[120.936305,31.01711],[120.935749,31.015381],[120.940087,31.010027],[120.938085,31.009007],[120.933789,31.010027],[120.931383,31.01178],[120.92699,31.012068],[120.926155,31.010423],[120.918105,31.012788],[120.911014,31.010555],[120.909944,31.012644],[120.910055,31.016942],[120.901365,31.017494],[120.900559,31.020423],[120.901338,31.0255],[120.901977,31.037647],[120.899739,31.039603],[120.897027,31.04558],[120.897208,31.04822],[120.895442,31.050332],[120.894567,31.053896],[120.894622,31.058659],[120.895915,31.063075],[120.898863,31.070514],[120.899614,31.07836],[120.904619,31.078528],[120.90473,31.080495],[120.901671,31.084094],[120.902116,31.085653],[120.899294,31.086937],[120.896694,31.086649],[120.895415,31.090703],[120.892175,31.094194],[120.892842,31.096533],[120.891216,31.09718],[120.891021,31.094302],[120.887476,31.094074],[120.878077,31.095753],[120.878967,31.09838],[120.876005,31.097864],[120.876631,31.099939],[120.873169,31.100323],[120.872543,31.098884],[120.869818,31.098943],[120.869582,31.097216],[120.865744,31.097624],[120.863993,31.100299],[120.859766,31.100287],[120.856804,31.102829],[120.857917,31.108526],[120.860225,31.10933],[120.862241,31.112508],[120.865967,31.11475],[120.870597,31.119715],[120.871014,31.123804],[120.872349,31.127161],[120.876422,31.131489],[120.881289,31.134727],[120.89921,31.136057],[120.905397,31.134211],[120.916923,31.136189],[120.93034,31.141404],[120.952642,31.138251],[120.983911,31.131705],[120.991252,31.13318],[121.007269,31.13342],[121.018489,31.134103],[121.022813,31.138311],[121.022271,31.140457],[121.025677,31.140769],[121.02672,31.143766],[121.028375,31.143874],[121.028778,31.141249],[121.033088,31.142208],[121.036119,31.140325],[121.036258,31.137376],[121.038649,31.136909],[121.041819,31.138899],[121.044781,31.145528],[121.041541,31.146931],[121.041472,31.14982],[121.045254,31.151582],[121.04542,31.154028],[121.049133,31.154615],[121.050273,31.150719],[121.055834,31.150659],[121.057378,31.152781],[121.062564,31.153129],[121.064135,31.150839],[121.066067,31.150947],[121.06572,31.148597],[121.069126,31.148705],[121.067777,31.152289],[121.072046,31.153512],[121.073839,31.157072],[121.077023,31.158451],[121.07605,31.160536],[121.076787,31.162622],[121.0737,31.161711],[121.07313,31.163257],[121.077371,31.16454],[121.075466,31.170316],[121.072379,31.169609],[121.072532,31.172701],[121.075424,31.173444],[121.074229,31.176225],[121.071406,31.179472],[121.071225,31.181462],[121.075591,31.182852],[121.074993,31.184386],[121.069474,31.182888],[121.068751,31.184889],[121.071684,31.185955],[121.07035,31.188735],[121.070614,31.1913],[121.07256,31.191527],[121.072185,31.193169],[121.070113,31.193612],[121.069599,31.195314],[121.06679,31.194966],[121.066609,31.197183],[121.069209,31.196524],[121.067805,31.201005],[121.065608,31.211871],[121.062633,31.224664],[121.0628,31.226964],[121.064719,31.227275],[121.064649,31.230785],[121.06718,31.230917],[121.067388,31.232929],[121.06458,31.232965],[121.062605,31.234689],[121.061243,31.237827],[121.063898,31.238438],[121.063565,31.242222],[121.064343,31.246138],[121.061646,31.24524],[121.057669,31.246749],[121.060979,31.246486],[121.061952,31.257945],[121.063245,31.267907],[121.068695,31.268098],[121.072741,31.26914],[121.080416,31.270158],[121.082154,31.271535],[121.084545,31.275713],[121.081361,31.277257],[121.084698,31.2876],[121.087326,31.290664],[121.086909,31.291717],[121.090134,31.291909],[121.093096,31.28821],[121.095404,31.287001],[121.09881,31.276251],[121.105442,31.273654],[121.103829,31.27533],[121.106666,31.276706],[121.111115,31.281746],[121.114994,31.285265],[121.117719,31.285684],[121.131053,31.280106],[121.131678,31.281363],[121.138032,31.278753],[121.137601,31.277592],[121.140535,31.276491],[121.142885,31.277664],[121.142996,31.275473],[121.150392,31.275437],[121.153743,31.276646],[121.153924,31.272061],[121.151783,31.267632],[121.155537,31.266147],[121.157845,31.270541],[121.161057,31.26762],[121.162614,31.269176],[121.167661,31.263944],[121.168036,31.259622],[121.170386,31.259119],[121.16894,31.256197],[121.171415,31.254928],[121.174251,31.256856],[121.176768,31.254605],[121.178798,31.255862],[121.17934,31.253419],[121.181537,31.254413],[121.183928,31.252246],[121.186444,31.252329],[121.188377,31.25476],[121.193021,31.253623],[121.193368,31.251455],[121.19626,31.251228],[121.19608,31.253395],[121.199848,31.255239],[121.203143,31.255814],[121.202865,31.257131],[121.206368,31.260065],[121.208482,31.25749],[121.209816,31.258017],[121.209761,31.260831],[121.212625,31.259837],[121.214182,31.254353],[121.221273,31.256293],[121.220216,31.257406],[121.223859,31.259035],[121.223539,31.260532],[121.229198,31.261717],[121.229087,31.262711],[121.235177,31.262699],[121.237693,31.262088],[121.242253,31.25937],[121.246577,31.259801],[121.246758,31.258448],[121.254183,31.258688],[121.247314,31.253287],[121.24591,31.248821],[121.241683,31.247348],[121.239932,31.241061],[121.241391,31.240222],[121.247912,31.240917],[121.249692,31.236534],[121.251082,31.238198],[121.252792,31.236965],[121.254155,31.23312],[121.257158,31.230701],[121.258006,31.226868],[121.256588,31.226329],[121.258215,31.222772],[121.25745,31.220208],[121.259675,31.218148],[121.261218,31.215081],[121.259397,31.212769],[121.263846,31.208912],[121.26468,31.206731],[121.263053,31.205701],[121.264777,31.203317],[121.266724,31.203257],[121.271701,31.198309],[121.277388,31.193576],[121.284034,31.194391],[121.287329,31.196332],[121.292126,31.200621],[121.292431,31.202514],[121.294837,31.203077],[121.297506,31.201412],[121.300565,31.197027],[121.30856,31.188388],[121.310784,31.18423],[121.316304,31.176836],[121.318042,31.173624],[121.318584,31.170256],[121.323854,31.162933]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310120,\"name\":\"奉贤区\",\"center\":[121.458472,30.912345],\"centroid\":[121.56251,30.897998],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":14,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.570475,30.998345],[121.576746,30.999474],[121.582933,30.999498],[121.584309,31.000819],[121.594682,31.000699],[121.595585,31.002043],[121.604066,31.001131],[121.614717,31.001251],[121.61772,30.995692],[121.62057,30.992678],[121.646695,30.99335],[121.654536,30.993254],[121.663115,30.992714],[121.669525,30.991609],[121.673348,30.989832],[121.674558,30.991802],[121.683595,30.989808],[121.688086,30.990145],[121.69298,30.98934],[121.699459,30.987419],[121.705507,30.984981],[121.712792,30.980934],[121.73191,30.967784],[121.733954,30.964469],[121.737916,30.960637],[121.73686,30.958703],[121.739988,30.956721],[121.743742,30.956589],[121.747857,30.951893],[121.749234,30.953046],[121.751987,30.952721],[121.759286,30.949154],[121.761024,30.947604],[121.760927,30.944613],[121.764542,30.941766],[121.761677,30.940132],[121.761469,30.938414],[121.764277,30.938522],[121.763846,30.936852],[121.766432,30.936539],[121.76799,30.93833],[121.769769,30.935278],[121.773023,30.933932],[121.77337,30.931553],[121.777806,30.931025],[121.777653,30.926723],[121.781115,30.917567],[121.780239,30.911811],[121.77896,30.910116],[121.778334,30.903807],[121.778987,30.899468],[121.778807,30.894588],[121.776012,30.886426],[121.776679,30.881005],[121.773134,30.880596],[121.772481,30.875703],[121.771605,30.875427],[121.768143,30.863272],[121.769338,30.85043],[121.793767,30.816862],[121.77914,30.817222],[121.727071,30.817716],[121.68119,30.818401],[121.648419,30.8162],[121.601327,30.805084],[121.552832,30.789395],[121.517197,30.775387],[121.478767,30.756347],[121.465072,30.776483],[121.451711,30.798323],[121.44672,30.805577],[121.445427,30.804868],[121.441645,30.806829],[121.437029,30.818101],[121.425989,30.81869],[121.420525,30.819797],[121.419288,30.81602],[121.415131,30.815803],[121.41552,30.819941],[121.414171,30.821757],[121.41235,30.821505],[121.404786,30.823081],[121.400991,30.827399],[121.400685,30.830105],[121.403632,30.829877],[121.404202,30.833797],[121.399712,30.834182],[121.397376,30.833292],[121.396986,30.827988],[121.392051,30.82782],[121.391717,30.829913],[121.387588,30.829864],[121.387588,30.832799],[121.383764,30.833906],[121.379259,30.840112],[121.379065,30.843238],[121.385446,30.843178],[121.384918,30.848073],[121.383722,30.851765],[121.384376,30.856238],[121.383472,30.859232],[121.384001,30.863488],[121.381929,30.863765],[121.381873,30.867324],[121.38286,30.869043],[121.382791,30.874489],[121.381498,30.876605],[121.382207,30.878961],[121.377535,30.879983],[121.371751,30.883698],[121.370166,30.883914],[121.367233,30.886667],[121.36327,30.886955],[121.361185,30.892977],[121.360476,30.897785],[121.358418,30.900598],[121.35668,30.908614],[121.351814,30.913217],[121.355081,30.916341],[121.356054,30.919742],[121.355373,30.921388],[121.352161,30.923803],[121.352203,30.928213],[121.35116,30.930628],[121.355679,30.932058],[121.354706,30.933512],[121.357361,30.933632],[121.359336,30.935086],[121.362658,30.934761],[121.362408,30.939122],[121.361129,30.944048],[121.363868,30.945165],[121.365467,30.947232],[121.362478,30.948901],[121.362255,30.9517],[121.363117,30.956109],[121.362853,30.959544],[121.36099,30.965574],[121.361435,30.970438],[121.359961,30.976251],[121.35871,30.97786],[121.375227,30.982832],[121.394261,30.988247],[121.409333,30.990229],[121.413184,30.991069],[121.423973,30.994515],[121.431426,30.999174],[121.433636,31.001779],[121.436834,31.00406],[121.440811,31.005789],[121.448305,31.007458],[121.459942,31.007398],[121.465587,31.008755],[121.47144,31.011948],[121.476362,31.01334],[121.485872,31.014073],[121.489153,31.014949],[121.492879,31.012752],[121.491948,31.010039],[121.495924,30.998297],[121.498872,30.998213],[121.49883,30.999426],[121.503057,31.002716],[121.507881,31.004745],[121.510412,31.004553],[121.517002,31.007626],[121.520853,31.004445],[121.522105,31.002199],[121.520089,31.00256],[121.520325,30.999354],[121.522897,30.99981],[121.528612,30.99592],[121.531962,30.994815],[121.534507,30.995848],[121.537774,30.994683],[121.538233,30.993146],[121.543294,30.994203],[121.54613,30.99305],[121.549537,30.988307],[121.55279,30.98886],[121.553304,30.993026],[121.556224,30.993374],[121.555918,30.995152],[121.561494,30.995644],[121.570475,30.998345]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310151,\"name\":\"崇明区\",\"center\":[121.397516,31.626946],\"centroid\":[121.568484,31.635916],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":15,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.975181,31.617034],[121.98825,31.529597],[121.993867,31.51189],[121.995716,31.493104],[121.991698,31.476763],[121.981813,31.4641],[121.967284,31.456656],[121.934304,31.442364],[121.918051,31.434692],[121.901144,31.430126],[121.89055,31.428788],[121.882096,31.428656],[121.87299,31.429338],[121.857807,31.430043],[121.845377,31.431895],[121.834212,31.433975],[121.819183,31.438206],[121.763443,31.458233],[121.72988,31.471973],[121.682858,31.491061],[121.670609,31.494214],[121.638645,31.49972],[121.625784,31.501775],[121.617678,31.503673],[121.608794,31.50691],[121.547673,31.531125],[121.471176,31.57443],[121.43422,31.590336],[121.414797,31.591076],[121.403521,31.590002],[121.395457,31.585444],[121.37221,31.55321],[121.345585,31.571685],[121.289109,31.616283],[121.179868,31.720774],[121.145332,31.753927],[121.142064,31.755308],[121.118498,31.759084],[121.149225,31.787294],[121.181509,31.820411],[121.200334,31.835144],[121.225305,31.847043],[121.242073,31.853397],[121.252111,31.857727],[121.265584,31.864128],[121.281336,31.869041],[121.291166,31.870992],[121.3019,31.872716],[121.310367,31.872502],[121.315859,31.871479],[121.323061,31.868529],[121.369291,31.843283],[121.376381,31.838571],[121.385043,31.833525],[121.395388,31.821291],[121.399142,31.817483],[121.405468,31.809841],[121.411488,31.806341],[121.416312,31.79764],[121.410904,31.79558],[121.420915,31.779602],[121.425781,31.774267],[121.431481,31.769266],[121.445385,31.7643],[121.449751,31.761668],[121.455576,31.759346],[121.464141,31.757142],[121.476807,31.756142],[121.487749,31.753415],[121.498566,31.75326],[121.51304,31.743695],[121.514986,31.742873],[121.526693,31.740217],[121.528361,31.738347],[121.539429,31.735499],[121.540124,31.733307],[121.549509,31.726969],[121.551386,31.727386],[121.565025,31.716711],[121.578539,31.710527],[121.592262,31.706487],[121.593249,31.705379],[121.599659,31.703115],[121.60091,31.707],[121.602746,31.70694],[121.611755,31.704283],[121.627341,31.697776],[121.633278,31.696167],[121.642649,31.697454],[121.715267,31.673842],[121.817806,31.652025],[121.887616,31.63638],[121.975181,31.617034]]],[[[121.778862,31.310196],[121.770951,31.31168],[121.76425,31.315306],[121.76076,31.320344],[121.751166,31.337801],[121.744659,31.343675],[121.740766,31.346486],[121.727933,31.354799],[121.686682,31.376591],[121.641036,31.401115],[121.601425,31.421855],[121.590371,31.427545],[121.572255,31.436066],[121.558463,31.448793],[121.549773,31.457062],[121.54328,31.462403],[121.537413,31.466704],[121.529515,31.471172],[121.516849,31.477313],[121.510134,31.482581],[121.509105,31.485352],[121.509355,31.489795],[121.513457,31.493355],[121.516933,31.494298],[121.521132,31.493976],[121.549926,31.489747],[121.562356,31.486367],[121.567347,31.4835],[121.572811,31.469452],[121.575828,31.463813],[121.58303,31.456262],[121.585561,31.454672],[121.599812,31.450681],[121.606319,31.449403],[121.621752,31.444145],[121.673835,31.427748],[121.688294,31.425883],[121.697193,31.423995],[121.708316,31.419728],[121.723707,31.412364],[121.729296,31.410356],[121.737485,31.408814],[121.742185,31.407212],[121.753725,31.400362],[121.760857,31.395185],[121.76938,31.390749],[121.774135,31.386982],[121.780572,31.380154],[121.787886,31.37164],[121.790875,31.367059],[121.792377,31.363304],[121.793002,31.355074],[121.796005,31.345624],[121.796478,31.33542],[121.795866,31.329976],[121.794073,31.319542],[121.790986,31.314313],[121.7879,31.312003],[121.782004,31.310328],[121.778862,31.310196]]],[[[122.242018,31.419082],[122.245369,31.421318],[122.247149,31.419333],[122.243562,31.417839],[122.242018,31.419082]]],[[[121.801775,31.356976],[121.800566,31.363997],[121.797674,31.369642],[121.792808,31.377571],[121.793864,31.380477],[121.796756,31.381075],[121.803458,31.381219],[121.817445,31.380585],[121.824744,31.378588],[121.828401,31.376447],[121.831752,31.375526],[121.845586,31.374582],[121.852885,31.371376],[121.858516,31.369379],[121.870376,31.366007],[121.913074,31.350445],[121.951726,31.337274],[122.001556,31.329246],[122.04107,31.323814],[122.078012,31.323527],[122.116678,31.321229],[122.121975,31.315438],[122.122684,31.307205],[122.105207,31.262136],[122.097769,31.255658],[122.087285,31.257538],[122.072005,31.266829],[122.016447,31.282285],[121.975779,31.279998],[121.932261,31.283147],[121.900755,31.291167],[121.88959,31.292028],[121.865968,31.294937],[121.860782,31.294949],[121.856681,31.292818],[121.852885,31.292364],[121.840566,31.29544],[121.833601,31.299653],[121.832043,31.301711],[121.822617,31.307372],[121.81319,31.316228],[121.806642,31.324173],[121.80375,31.328445],[121.803152,31.332106],[121.802693,31.342789],[121.801775,31.356976]]],[[[121.627049,31.444993],[121.616872,31.446643],[121.613855,31.447885],[121.594153,31.458568],[121.58627,31.464076],[121.577886,31.472486],[121.57612,31.474768],[121.575814,31.478197],[121.577149,31.479343],[121.586896,31.479535],[121.595293,31.478292],[121.602134,31.476835],[121.608571,31.474446],[121.61366,31.471339],[121.625172,31.462212],[121.631609,31.456823],[121.635044,31.452988],[121.636295,31.449881],[121.634001,31.445937],[121.631512,31.445101],[121.627049,31.444993]]]]}}]}', 'admin', '2020-12-07 19:24:11', NULL, '2020-12-07 19:24:11', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1336859680042913794', '北京', 'beijing', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":110101,\"name\":\"东城区\",\"center\":[116.418757,39.917544],\"centroid\":[116.416739,39.912912],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":0,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.387658,39.96093],[116.389498,39.96314],[116.40788,39.962182],[116.407504,39.973995],[116.411101,39.97146],[116.411415,39.964928],[116.414196,39.962182],[116.424861,39.962279],[116.429002,39.957274],[116.429483,39.950155],[116.436698,39.949245],[116.435422,39.952121],[116.442239,39.9497],[116.440566,39.945295],[116.446338,39.946205],[116.443703,39.936663],[116.443682,39.928664],[116.434314,39.92868],[116.434983,39.913964],[116.436488,39.902042],[116.448722,39.903246],[116.446819,39.900042],[116.447154,39.894186],[116.450876,39.894088],[116.450939,39.890249],[116.444059,39.890038],[116.445648,39.879283],[116.44364,39.87284],[116.442574,39.87188],[116.423209,39.872824],[116.413652,39.871148],[116.41589,39.863645],[116.41246,39.858942],[116.406856,39.859967],[116.3955,39.858682],[116.394956,39.862734],[116.387888,39.867372],[116.380632,39.866054],[116.38059,39.871148],[116.399097,39.872205],[116.397612,39.898675],[116.396086,39.89944],[116.395563,39.907995],[116.392259,39.907881],[116.392175,39.92242],[116.399474,39.923574],[116.396692,39.928306],[116.396169,39.94006],[116.394266,39.940629],[116.393723,39.957371],[116.38678,39.957014],[116.387658,39.96093]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110102,\"name\":\"西城区\",\"center\":[116.366794,39.915309],\"centroid\":[116.365684,39.912236],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":1,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.380903,39.972712],[116.394099,39.972858],[116.394162,39.969397],[116.390084,39.968406],[116.387658,39.96093],[116.38678,39.957014],[116.393723,39.957371],[116.394266,39.940629],[116.396169,39.94006],[116.396692,39.928306],[116.399474,39.923574],[116.392175,39.92242],[116.392259,39.907881],[116.395563,39.907995],[116.396086,39.89944],[116.397612,39.898675],[116.399097,39.872205],[116.38059,39.871148],[116.35058,39.86869],[116.349472,39.873588],[116.344286,39.873653],[116.341567,39.876159],[116.335273,39.875183],[116.326636,39.876859],[116.321345,39.875004],[116.325799,39.896789],[116.337301,39.89739],[116.335356,39.898448],[116.334645,39.922664],[116.333056,39.938565],[116.327953,39.942369],[116.332889,39.944092],[116.341442,39.941979],[116.35171,39.94375],[116.351814,39.950854],[116.355265,39.951796],[116.35698,39.944466],[116.371974,39.948594],[116.370384,39.967902],[116.380401,39.968178],[116.380903,39.972712]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110105,\"name\":\"朝阳区\",\"center\":[116.486409,39.921489],\"centroid\":[116.513687,39.951064],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":2,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.595548,40.01751],[116.60132,40.013873],[116.61989,40.011794],[116.628129,40.007653],[116.625766,40.003122],[116.63273,39.999825],[116.637582,40.002359],[116.642684,39.996755],[116.643751,39.989608],[116.640321,39.990177],[116.639129,39.986879],[116.63365,39.986197],[116.634026,39.981696],[116.639819,39.982606],[116.641827,39.969575],[116.643081,39.952983],[116.645277,39.945977],[116.632228,39.950545],[116.630492,39.946156],[116.633441,39.940906],[116.629677,39.938727],[116.6293,39.931314],[116.624156,39.929981],[116.630576,39.921672],[116.620956,39.923103],[116.623006,39.913818],[116.620245,39.90767],[116.623361,39.904271],[116.621019,39.898854],[116.61531,39.895503],[116.615603,39.889794],[116.627585,39.890477],[116.628987,39.881594],[116.624323,39.881155],[116.62493,39.87725],[116.619994,39.868951],[116.626958,39.860683],[116.613449,39.850185],[116.604185,39.850071],[116.604666,39.846132],[116.608367,39.846539],[116.601905,39.840727],[116.60224,39.831675],[116.598977,39.831659],[116.599228,39.825585],[116.59147,39.826367],[116.591595,39.823875],[116.583732,39.824917],[116.587015,39.828223],[116.577479,39.827539],[116.577145,39.830682],[116.569386,39.833498],[116.558596,39.834687],[116.543664,39.835078],[116.542681,39.830209],[116.533187,39.832733],[116.538143,39.828207],[116.534944,39.82482],[116.525868,39.826904],[116.525366,39.829754],[116.516164,39.829835],[116.510602,39.827637],[116.510142,39.821449],[116.502801,39.819006],[116.505813,39.817866],[116.498201,39.8157],[116.495357,39.818795],[116.485632,39.816889],[116.485256,39.81272],[116.474256,39.809772],[116.468463,39.814511],[116.462775,39.815945],[116.452737,39.823012],[116.443912,39.82096],[116.44592,39.826692],[116.436677,39.827425],[116.43699,39.830649],[116.430068,39.830112],[116.425217,39.831903],[116.432055,39.832929],[116.436739,39.841329],[116.440587,39.839653],[116.442323,39.843674],[116.446694,39.84426],[116.445983,39.848329],[116.450479,39.848704],[116.451148,39.852008],[116.460308,39.848622],[116.467794,39.856012],[116.463319,39.856224],[116.456062,39.86122],[116.454222,39.859381],[116.448178,39.863645],[116.446359,39.860862],[116.442971,39.866087],[116.44364,39.87284],[116.445648,39.879283],[116.444059,39.890038],[116.450939,39.890249],[116.450876,39.894088],[116.447154,39.894186],[116.446819,39.900042],[116.448722,39.903246],[116.436488,39.902042],[116.434983,39.913964],[116.434314,39.92868],[116.443682,39.928664],[116.443703,39.936663],[116.446338,39.946205],[116.440566,39.945295],[116.442239,39.9497],[116.435422,39.952121],[116.436698,39.949245],[116.429483,39.950155],[116.429002,39.957274],[116.424861,39.962279],[116.414196,39.962182],[116.411415,39.964928],[116.411101,39.97146],[116.407504,39.973995],[116.40788,39.962182],[116.389498,39.96314],[116.387658,39.96093],[116.390084,39.968406],[116.394162,39.969397],[116.394099,39.972858],[116.380903,39.972712],[116.381196,39.977976],[116.376554,39.992971],[116.350873,40.0267],[116.378708,40.031181],[116.395103,40.032854],[116.390251,40.036587],[116.390649,40.041279],[116.39297,40.041733],[116.395333,40.036766],[116.405266,40.038974],[116.408884,40.043291],[116.406124,40.049768],[116.409595,40.055626],[116.415618,40.056],[116.433268,40.06228],[116.442867,40.061323],[116.451629,40.058759],[116.45142,40.06129],[116.459408,40.059992],[116.462127,40.06731],[116.458635,40.070377],[116.458823,40.075796],[116.462608,40.076786],[116.461855,40.080825],[116.466247,40.08235],[116.466832,40.090185],[116.471015,40.08939],[116.473545,40.085562],[116.482935,40.083745],[116.486657,40.081036],[116.49933,40.080387],[116.506775,40.074352],[116.513948,40.070426],[116.525993,40.071334],[116.534379,40.066791],[116.543183,40.059408],[116.547784,40.062718],[116.551757,40.059765],[116.552761,40.05488],[116.54655,40.048956],[116.550753,40.045499],[116.564242,40.039655],[116.570474,40.032431],[116.578797,40.033097],[116.577814,40.027512],[116.595548,40.01751]]],[[[116.603683,40.052949],[116.598517,40.052543],[116.601633,40.047658],[116.599417,40.047171],[116.599814,40.041408],[116.590006,40.043616],[116.591198,40.051796],[116.587957,40.05053],[116.590131,40.056162],[116.586597,40.074336],[116.58139,40.073817],[116.581411,40.067846],[116.578149,40.076461],[116.574322,40.096138],[116.574071,40.107815],[116.578316,40.102739],[116.580365,40.088352],[116.595903,40.090218],[116.598705,40.09351],[116.598392,40.103874],[116.602909,40.093883],[116.603473,40.086811],[116.608409,40.054912],[116.603683,40.052949]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110106,\"name\":\"丰台区\",\"center\":[116.286968,39.863642],\"centroid\":[116.250298,39.83569],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":3,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.167033,39.888752],[116.179099,39.882684],[116.19035,39.881529],[116.199426,39.883286],[116.20457,39.879885],[116.208126,39.874125],[116.212099,39.874679],[116.210907,39.878079],[116.219105,39.876713],[116.219523,39.881334],[116.222952,39.883986],[116.22772,39.883839],[116.227783,39.889078],[116.234642,39.88955],[116.233534,39.89212],[116.252899,39.896382],[116.259089,39.896658],[116.266199,39.896252],[116.294975,39.896496],[116.294995,39.886735],[116.29922,39.889566],[116.30656,39.890883],[116.30449,39.892478],[116.313189,39.896772],[116.325799,39.896789],[116.321345,39.875004],[116.326636,39.876859],[116.335273,39.875183],[116.341567,39.876159],[116.344286,39.873653],[116.349472,39.873588],[116.35058,39.86869],[116.38059,39.871148],[116.380632,39.866054],[116.387888,39.867372],[116.394956,39.862734],[116.3955,39.858682],[116.406856,39.859967],[116.41246,39.858942],[116.41589,39.863645],[116.413652,39.871148],[116.423209,39.872824],[116.442574,39.87188],[116.44364,39.87284],[116.442971,39.866087],[116.446359,39.860862],[116.448178,39.863645],[116.454222,39.859381],[116.456062,39.86122],[116.463319,39.856224],[116.467794,39.856012],[116.460308,39.848622],[116.451148,39.852008],[116.450479,39.848704],[116.445983,39.848329],[116.446694,39.84426],[116.442323,39.843674],[116.440587,39.839653],[116.436739,39.841329],[116.432055,39.832929],[116.425217,39.831903],[116.420072,39.826611],[116.415785,39.829428],[116.414426,39.824282],[116.418441,39.822915],[116.419759,39.815375],[116.41016,39.817052],[116.410013,39.811336],[116.415262,39.812525],[116.417772,39.81013],[116.422456,39.81044],[116.425719,39.805358],[116.429399,39.803583],[116.429274,39.794102],[116.421034,39.794134],[116.42024,39.787439],[116.396023,39.786738],[116.397905,39.781068],[116.398888,39.765864],[116.391903,39.765277],[116.390649,39.780465],[116.385609,39.778852],[116.379209,39.77939],[116.378478,39.785646],[116.367582,39.784962],[116.365742,39.794151],[116.368189,39.794819],[116.367039,39.79982],[116.356833,39.800471],[116.355704,39.805668],[116.341755,39.807589],[116.340124,39.802149],[116.328225,39.801416],[116.326824,39.798386],[116.322872,39.798386],[116.321784,39.783626],[116.317978,39.783447],[116.31068,39.772057],[116.307062,39.770085],[116.301541,39.774941],[116.295205,39.790958],[116.291148,39.793271],[116.296083,39.795568],[116.289182,39.795894],[116.287237,39.799103],[116.27423,39.796936],[116.262184,39.792782],[116.259298,39.797621],[116.251519,39.793059],[116.250933,39.801432],[116.25361,39.807231],[116.251644,39.81329],[116.244304,39.818567],[116.243007,39.825145],[116.23962,39.826872],[116.228306,39.827197],[116.227219,39.825048],[116.214127,39.824706],[116.214462,39.818974],[116.216762,39.816905],[116.207415,39.810814],[116.208063,39.806352],[116.201852,39.799657],[116.201852,39.788269],[116.200388,39.778151],[116.194449,39.778493],[116.194407,39.780579],[116.188008,39.781785],[116.183365,39.780204],[116.182989,39.783707],[116.16971,39.784278],[116.166113,39.775039],[116.159923,39.767494],[116.150554,39.766565],[116.143444,39.764381],[116.133427,39.766336],[116.12847,39.762409],[116.121465,39.761626],[116.117491,39.77336],[116.121486,39.779047],[116.124351,39.77675],[116.127467,39.779047],[116.132569,39.778624],[116.131503,39.783121],[116.125062,39.785353],[116.120754,39.784848],[116.119792,39.789654],[116.106366,39.788612],[116.107014,39.78532],[116.101368,39.78576],[116.094613,39.781557],[116.091581,39.784082],[116.091916,39.787927],[116.0856,39.795324],[116.087127,39.803289],[116.084826,39.811596],[116.086186,39.816401],[116.089594,39.816352],[116.088214,39.82692],[116.089741,39.829721],[116.085747,39.832163],[116.084366,39.828581],[116.078615,39.831593],[116.07619,39.837015],[116.068975,39.840792],[116.061488,39.841899],[116.05465,39.845953],[116.056553,39.85095],[116.070982,39.853717],[116.070188,39.860423],[116.067344,39.865761],[116.07046,39.868446],[116.078323,39.870318],[116.087169,39.866152],[116.095826,39.869032],[116.104149,39.868837],[116.105425,39.872547],[116.112242,39.873247],[116.119729,39.877477],[116.125898,39.877949],[116.13167,39.881268],[116.147605,39.885287],[116.150972,39.884051],[116.156137,39.889029],[116.163352,39.886881],[116.167033,39.888752]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110107,\"name\":\"石景山区\",\"center\":[116.195445,39.914601],\"centroid\":[116.176243,39.9332],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":4,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.259089,39.896658],[116.252899,39.896382],[116.233534,39.89212],[116.234642,39.88955],[116.227783,39.889078],[116.22772,39.883839],[116.222952,39.883986],[116.219523,39.881334],[116.219105,39.876713],[116.210907,39.878079],[116.212099,39.874679],[116.208126,39.874125],[116.20457,39.879885],[116.199426,39.883286],[116.19035,39.881529],[116.179099,39.882684],[116.167033,39.888752],[116.161094,39.896805],[116.153503,39.900985],[116.152792,39.906629],[116.146852,39.910077],[116.139282,39.922095],[116.13029,39.924518],[116.127341,39.926615],[116.127822,39.930338],[116.124769,39.934907],[116.119875,39.932761],[116.11195,39.942921],[116.114522,39.949196],[116.120545,39.951],[116.115254,39.957745],[116.120712,39.96119],[116.122971,39.967561],[116.116592,39.971932],[116.113455,39.981518],[116.118934,39.986115],[116.144678,39.989186],[116.151579,39.993442],[116.156117,39.989137],[116.158124,39.984133],[116.166845,39.987561],[116.169229,39.979357],[116.171487,39.977001],[116.178012,39.982216],[116.178911,39.988292],[116.186586,39.983906],[116.18531,39.977976],[116.185812,39.970274],[116.190685,39.968259],[116.190747,39.965367],[116.20112,39.961109],[116.212831,39.948952],[116.215466,39.94375],[116.216281,39.936386],[116.213186,39.933232],[116.216198,39.931233],[116.213061,39.928891],[116.215696,39.927103],[116.207707,39.9259],[116.206787,39.916663],[116.230899,39.919525],[116.232426,39.91694],[116.237696,39.918452],[116.250975,39.919834],[116.252983,39.915558],[116.252983,39.896951],[116.259089,39.896658]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110108,\"name\":\"海淀区\",\"center\":[116.310316,39.956074],\"centroid\":[116.233161,40.026971],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":5,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.259089,39.896658],[116.252983,39.896951],[116.252983,39.915558],[116.250975,39.919834],[116.237696,39.918452],[116.232426,39.91694],[116.230899,39.919525],[116.206787,39.916663],[116.207707,39.9259],[116.215696,39.927103],[116.213061,39.928891],[116.216198,39.931233],[116.213186,39.933232],[116.216281,39.936386],[116.215466,39.94375],[116.212831,39.948952],[116.20112,39.961109],[116.190747,39.965367],[116.190685,39.968259],[116.185812,39.970274],[116.18531,39.977976],[116.186586,39.983906],[116.178911,39.988292],[116.178012,39.982216],[116.171487,39.977001],[116.169229,39.979357],[116.166845,39.987561],[116.158124,39.984133],[116.156117,39.989137],[116.151579,39.993442],[116.154527,39.997275],[116.161658,39.999987],[116.172115,40.000637],[116.175335,40.006403],[116.164774,40.014328],[116.163938,40.016796],[116.157309,40.021034],[116.149278,40.022154],[116.140098,40.02873],[116.129558,40.0311],[116.123598,40.029655],[116.114522,40.033],[116.105488,40.032204],[116.098398,40.033811],[116.095073,40.031782],[116.084241,40.030905],[116.078176,40.032756],[116.075123,40.039915],[116.068055,40.051926],[116.071129,40.062037],[116.064981,40.067456],[116.064019,40.073022],[116.054587,40.07823],[116.051325,40.084345],[116.048878,40.085303],[116.051848,40.091661],[116.055905,40.09643],[116.061969,40.09956],[116.062931,40.10282],[116.069456,40.104912],[116.072676,40.109258],[116.073847,40.115436],[116.077883,40.115047],[116.08445,40.120252],[116.089783,40.119327],[116.096056,40.121257],[116.102246,40.115987],[116.105864,40.118014],[116.113309,40.115598],[116.127676,40.116393],[116.132214,40.115079],[116.132925,40.121354],[116.152708,40.121776],[116.169563,40.124564],[116.167409,40.128455],[116.17178,40.127936],[116.168622,40.135442],[116.167681,40.141844],[116.174122,40.143595],[116.180417,40.14729],[116.183094,40.153335],[116.182696,40.158099],[116.192065,40.155669],[116.194282,40.160076],[116.202166,40.160984],[116.203211,40.153773],[116.205658,40.150175],[116.206285,40.143092],[116.212224,40.140548],[116.215445,40.143174],[116.233785,40.136577],[116.247043,40.136204],[116.245036,40.118825],[116.241836,40.118403],[116.243363,40.113279],[116.240498,40.108009],[116.245956,40.10535],[116.252732,40.106517],[116.255868,40.104474],[116.25957,40.106907],[116.258022,40.11195],[116.263334,40.110588],[116.263899,40.10402],[116.258273,40.101522],[116.265237,40.094694],[116.27333,40.09557],[116.2731,40.092699],[116.279897,40.079754],[116.290353,40.083145],[116.302942,40.060803],[116.305995,40.063043],[116.309446,40.060609],[116.318292,40.061663],[116.325946,40.054799],[116.338828,40.058921],[116.340271,40.055091],[116.343366,40.055448],[116.342676,40.059635],[116.346963,40.06043],[116.34667,40.063659],[116.357293,40.066012],[116.363023,40.065931],[116.363149,40.068965],[116.372538,40.06843],[116.373354,40.065623],[116.381928,40.066402],[116.382848,40.061582],[116.379272,40.059002],[116.372267,40.05785],[116.372999,40.054344],[116.367394,40.053436],[116.36959,40.04696],[116.376114,40.045466],[116.376888,40.042756],[116.38519,40.042853],[116.390649,40.041279],[116.390251,40.036587],[116.395103,40.032854],[116.378708,40.031181],[116.350873,40.0267],[116.376554,39.992971],[116.381196,39.977976],[116.380903,39.972712],[116.380401,39.968178],[116.370384,39.967902],[116.371974,39.948594],[116.35698,39.944466],[116.355265,39.951796],[116.351814,39.950854],[116.35171,39.94375],[116.341442,39.941979],[116.332889,39.944092],[116.327953,39.942369],[116.333056,39.938565],[116.334645,39.922664],[116.335356,39.898448],[116.337301,39.89739],[116.325799,39.896789],[116.313189,39.896772],[116.30449,39.892478],[116.30656,39.890883],[116.29922,39.889566],[116.294995,39.886735],[116.294975,39.896496],[116.266199,39.896252],[116.259089,39.896658]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110109,\"name\":\"门头沟区\",\"center\":[116.105381,39.937183],\"centroid\":[115.791703,39.994114],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":6,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.853348,40.149332],[115.856547,40.147468],[115.865184,40.148635],[115.870768,40.144276],[115.874155,40.14387],[115.8816,40.139073],[115.900442,40.138716],[115.904457,40.136123],[115.906549,40.138181],[115.921438,40.134485],[115.933588,40.124824],[115.947913,40.107409],[115.943229,40.103339],[115.952681,40.10102],[115.956717,40.096041],[115.957449,40.100679],[115.962552,40.10235],[115.962092,40.094419],[115.960461,40.092456],[115.966588,40.084556],[115.968575,40.075488],[115.977232,40.079041],[115.979993,40.081669],[115.986434,40.083469],[115.99735,40.082074],[116.005129,40.079803],[116.007785,40.080614],[116.020856,40.074579],[116.030914,40.082188],[116.033926,40.079657],[116.037899,40.084524],[116.043775,40.083502],[116.048878,40.085303],[116.051325,40.084345],[116.054587,40.07823],[116.064019,40.073022],[116.064981,40.067456],[116.071129,40.062037],[116.068055,40.051926],[116.075123,40.039915],[116.078176,40.032756],[116.084241,40.030905],[116.095073,40.031782],[116.098398,40.033811],[116.105488,40.032204],[116.114522,40.033],[116.123598,40.029655],[116.129558,40.0311],[116.140098,40.02873],[116.149278,40.022154],[116.157309,40.021034],[116.163938,40.016796],[116.164774,40.014328],[116.175335,40.006403],[116.172115,40.000637],[116.161658,39.999987],[116.154527,39.997275],[116.151579,39.993442],[116.144678,39.989186],[116.118934,39.986115],[116.113455,39.981518],[116.116592,39.971932],[116.122971,39.967561],[116.120712,39.96119],[116.115254,39.957745],[116.120545,39.951],[116.114522,39.949196],[116.11195,39.942921],[116.119875,39.932761],[116.124769,39.934907],[116.127822,39.930338],[116.127341,39.926615],[116.13029,39.924518],[116.139282,39.922095],[116.146852,39.910077],[116.152792,39.906629],[116.153503,39.900985],[116.161094,39.896805],[116.167033,39.888752],[116.163352,39.886881],[116.156137,39.889029],[116.150972,39.884051],[116.147605,39.885287],[116.13167,39.881268],[116.125898,39.877949],[116.119729,39.877477],[116.112242,39.873247],[116.105425,39.872547],[116.104149,39.868837],[116.095826,39.869032],[116.087169,39.866152],[116.078323,39.870318],[116.07046,39.868446],[116.067344,39.865761],[116.070188,39.860423],[116.070982,39.853717],[116.056553,39.85095],[116.05465,39.845953],[116.045825,39.84732],[116.04181,39.844878],[116.033089,39.845904],[116.030308,39.843462],[116.021023,39.840662],[116.018367,39.841525],[116.016694,39.849225],[116.00789,39.849469],[115.991285,39.840222],[115.98428,39.849111],[115.98817,39.859837],[115.986789,39.864703],[115.992875,39.867356],[115.997245,39.875167],[115.990177,39.876338],[115.97627,39.870497],[115.976563,39.868251],[115.968742,39.867714],[115.967822,39.872059],[115.961318,39.867877],[115.954145,39.866786],[115.949837,39.871278],[115.92744,39.876192],[115.921856,39.884164],[115.935805,39.898236],[115.944965,39.901847],[115.945697,39.910972],[115.941159,39.917509],[115.935868,39.917753],[115.927858,39.914257],[115.903935,39.914029],[115.890112,39.917281],[115.87884,39.915964],[115.87311,39.912484],[115.868321,39.905572],[115.860897,39.901359],[115.845255,39.897049],[115.838772,39.900644],[115.835112,39.899586],[115.826914,39.910581],[115.8188,39.913948],[115.811084,39.913785],[115.806839,39.919656],[115.797344,39.92216],[115.792848,39.920859],[115.774257,39.920599],[115.769385,39.925233],[115.76148,39.920989],[115.749622,39.917655],[115.74889,39.9152],[115.731261,39.907865],[115.721621,39.906824],[115.719592,39.904612],[115.709178,39.905117],[115.691779,39.8997],[115.68929,39.896187],[115.682556,39.893047],[115.678144,39.886556],[115.671055,39.88597],[115.667541,39.883888],[115.654869,39.882505],[115.648867,39.875411],[115.644705,39.875964],[115.640021,39.871554],[115.630987,39.871977],[115.623103,39.866949],[115.621973,39.863271],[115.616369,39.857542],[115.613086,39.843755],[115.607586,39.84089],[115.604533,39.834443],[115.599325,39.829151],[115.596649,39.821498],[115.59117,39.818534],[115.587322,39.813762],[115.577367,39.812541],[115.569274,39.813274],[115.563461,39.816417],[115.548027,39.822703],[115.546396,39.825992],[115.534957,39.830714],[115.530482,39.829916],[115.526509,39.835241],[115.514505,39.83835],[115.510992,39.84509],[115.515948,39.847678],[115.522368,39.858779],[115.521929,39.868186],[115.527345,39.869862],[115.529185,39.875948],[115.526299,39.875655],[115.516659,39.880406],[115.51003,39.88148],[115.509026,39.884164],[115.523016,39.898919],[115.52013,39.902547],[115.50386,39.915818],[115.494994,39.917948],[115.487277,39.923835],[115.48069,39.93585],[115.472387,39.93876],[115.464462,39.940142],[115.456787,39.944271],[115.452312,39.948188],[115.447042,39.948806],[115.444595,39.951358],[115.438468,39.95256],[115.43577,39.950919],[115.42615,39.95035],[115.423745,39.955697],[115.426924,39.965302],[115.423411,39.969819],[115.427635,39.979471],[115.428513,39.984328],[115.436815,39.991427],[115.443905,39.994644],[115.450346,39.993247],[115.449196,40.001985],[115.442817,40.007345],[115.442169,40.010885],[115.452082,40.02079],[115.454528,40.029704],[115.460656,40.032172],[115.468414,40.031896],[115.478557,40.036165],[115.488992,40.043746],[115.488323,40.046132],[115.500954,40.052478],[115.510427,40.062913],[115.509695,40.065477],[115.514944,40.066937],[115.527324,40.076072],[115.537885,40.077775],[115.544263,40.07591],[115.552168,40.079252],[115.555472,40.082626],[115.553736,40.091661],[115.563419,40.097922],[115.567769,40.096543],[115.576196,40.100825],[115.578538,40.096365],[115.584038,40.094889],[115.590709,40.096397],[115.592403,40.110182],[115.594432,40.108982],[115.59485,40.116279],[115.599116,40.120008],[115.606979,40.120057],[115.616223,40.117138],[115.621388,40.118711],[115.625048,40.116295],[115.631468,40.117852],[115.635943,40.115793],[115.643722,40.117511],[115.641882,40.120819],[115.64458,40.126639],[115.654806,40.131276],[115.657734,40.128098],[115.678667,40.130935],[115.681197,40.13267],[115.68699,40.13053],[115.693096,40.131924],[115.697216,40.12672],[115.702172,40.128196],[115.712064,40.126899],[115.711039,40.128941],[115.704765,40.129655],[115.699746,40.132394],[115.708697,40.134291],[115.715891,40.133383],[115.724841,40.128812],[115.734126,40.129379],[115.741111,40.132216],[115.749246,40.137711],[115.75485,40.145459],[115.749539,40.152995],[115.754328,40.163252],[115.762212,40.16262],[115.768213,40.165553],[115.773023,40.176197],[115.787014,40.178708],[115.78693,40.170414],[115.789837,40.168939],[115.802091,40.156754],[115.806567,40.153254],[115.822272,40.152606],[115.829047,40.149981],[115.83576,40.145426],[115.834234,40.15024],[115.846384,40.147096],[115.853348,40.149332]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110111,\"name\":\"房山区\",\"center\":[116.139157,39.735535],\"centroid\":[115.853935,39.719211],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":7,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.05465,39.845953],[116.061488,39.841899],[116.068975,39.840792],[116.07619,39.837015],[116.078615,39.831593],[116.084366,39.828581],[116.085747,39.832163],[116.089741,39.829721],[116.088214,39.82692],[116.089594,39.816352],[116.086186,39.816401],[116.084826,39.811596],[116.087127,39.803289],[116.0856,39.795324],[116.091916,39.787927],[116.091581,39.784082],[116.094613,39.781557],[116.101368,39.78576],[116.107014,39.78532],[116.106366,39.788612],[116.119792,39.789654],[116.120754,39.784848],[116.125062,39.785353],[116.131503,39.783121],[116.132569,39.778624],[116.127467,39.779047],[116.124351,39.77675],[116.121486,39.779047],[116.117491,39.77336],[116.121465,39.761626],[116.12847,39.762409],[116.133427,39.766336],[116.143444,39.764381],[116.150554,39.766565],[116.159923,39.767494],[116.166113,39.775039],[116.16971,39.784278],[116.182989,39.783707],[116.183365,39.780204],[116.188008,39.781785],[116.194407,39.780579],[116.194449,39.778493],[116.200388,39.778151],[116.201852,39.788269],[116.201852,39.799657],[116.208063,39.806352],[116.207415,39.810814],[116.216762,39.816905],[116.214462,39.818974],[116.214127,39.824706],[116.227219,39.825048],[116.228306,39.827197],[116.23962,39.826872],[116.243007,39.825145],[116.244304,39.818567],[116.251644,39.81329],[116.25361,39.807231],[116.250933,39.801432],[116.251519,39.793059],[116.251602,39.782518],[116.253777,39.77952],[116.252481,39.771747],[116.254426,39.76324],[116.252481,39.758676],[116.251895,39.749092],[116.243948,39.741658],[116.248026,39.732641],[116.248466,39.728027],[116.245768,39.72408],[116.245036,39.718421],[116.236629,39.71286],[116.231945,39.706025],[116.23435,39.703823],[116.230941,39.692355],[116.221238,39.678453],[116.22565,39.67359],[116.221342,39.667486],[116.223162,39.664728],[116.216992,39.651572],[116.215487,39.64305],[116.218875,39.628011],[116.219502,39.618931],[116.21808,39.608102],[116.223141,39.597222],[116.222597,39.593938],[116.226089,39.591993],[116.225085,39.584085],[116.221175,39.578921],[116.208105,39.577728],[116.206243,39.583219],[116.201726,39.586373],[116.196394,39.586095],[116.196854,39.588987],[116.19058,39.587386],[116.190768,39.589396],[116.184432,39.590915],[116.177071,39.590016],[116.176924,39.585899],[116.165527,39.583562],[116.151788,39.583415],[116.149613,39.573087],[116.13878,39.571044],[116.138425,39.568887],[116.130373,39.567743],[116.130311,39.569459],[116.121528,39.570554],[116.121465,39.574917],[116.116634,39.574002],[116.11379,39.570668],[116.106282,39.570979],[116.105801,39.576568],[116.101368,39.580049],[116.102016,39.576143],[116.098817,39.575146],[116.039237,39.571943],[116.032964,39.572302],[116.032859,39.574607],[116.024766,39.575604],[116.02623,39.587402],[116.020667,39.585981],[116.014038,39.588072],[116.013703,39.583039],[116.010588,39.583023],[116.007618,39.577205],[115.995196,39.577075],[115.996953,39.583203],[115.990721,39.586471],[115.990993,39.593791],[115.978445,39.595686],[115.977086,39.590931],[115.978153,39.572842],[115.974576,39.570832],[115.968909,39.570995],[115.967592,39.564604],[115.963409,39.565503],[115.957554,39.560927],[115.954982,39.566092],[115.950423,39.56637],[115.949147,39.573299],[115.943083,39.574672],[115.943187,39.577385],[115.937938,39.577467],[115.938105,39.581699],[115.934969,39.581814],[115.934174,39.588072],[115.929991,39.589935],[115.930221,39.593382],[115.924178,39.59384],[115.923759,39.597287],[115.912488,39.599149],[115.910187,39.600832],[115.9068,39.590016],[115.909665,39.588284],[115.908744,39.58402],[115.915604,39.582958],[115.911777,39.574182],[115.91276,39.572842],[115.907866,39.566876],[115.896009,39.569916],[115.890028,39.567873],[115.893416,39.561875],[115.89306,39.556219],[115.888752,39.555614],[115.887686,39.55066],[115.883587,39.551102],[115.88296,39.54811],[115.873298,39.548829],[115.872315,39.546099],[115.866355,39.546361],[115.866041,39.549843],[115.862026,39.548551],[115.855481,39.554993],[115.851361,39.550448],[115.847555,39.550284],[115.846028,39.543287],[115.84216,39.54157],[115.828692,39.541309],[115.828399,39.535455],[115.824321,39.534212],[115.822753,39.530533],[115.819219,39.530762],[115.819804,39.524923],[115.824112,39.522405],[115.824447,39.518774],[115.819762,39.518528],[115.822146,39.514145],[115.829487,39.512885],[115.828692,39.507045],[115.821456,39.509499],[115.792681,39.510742],[115.785006,39.51035],[115.777917,39.513834],[115.776537,39.512722],[115.767419,39.515862],[115.770828,39.510971],[115.768736,39.508878],[115.765328,39.514848],[115.759451,39.513916],[115.752508,39.515453],[115.743934,39.526771],[115.741487,39.536289],[115.73879,39.539314],[115.739124,39.545363],[115.726765,39.548143],[115.726953,39.543908],[115.7216,39.543499],[115.72022,39.554747],[115.717104,39.560403],[115.710161,39.563019],[115.698722,39.563248],[115.692072,39.565781],[115.694393,39.56941],[115.698596,39.570586],[115.697906,39.579248],[115.693431,39.580327],[115.694226,39.587778],[115.689269,39.592941],[115.68929,39.599035],[115.685317,39.603675],[115.673271,39.608526],[115.667479,39.615256],[115.667583,39.609637],[115.665304,39.605325],[115.657273,39.600081],[115.650268,39.600996],[115.643576,39.598937],[115.641589,39.603332],[115.634688,39.603871],[115.632555,39.597695],[115.625947,39.599394],[115.618439,39.604067],[115.6125,39.601126],[115.605285,39.600032],[115.599785,39.600865],[115.598719,39.597761],[115.592445,39.59665],[115.586109,39.589412],[115.571867,39.591569],[115.573875,39.596552],[115.567267,39.599623],[115.564569,39.605619],[115.55451,39.609408],[115.551875,39.614064],[115.545978,39.618751],[115.539119,39.616285],[115.533263,39.611434],[115.533891,39.608608],[115.530586,39.602874],[115.524229,39.598937],[115.518311,39.597156],[115.518834,39.593072],[115.515948,39.591193],[115.512121,39.605129],[115.514358,39.613508],[115.523414,39.620384],[115.521699,39.622311],[115.520423,39.633416],[115.522452,39.639964],[115.515864,39.641237],[115.511493,39.644388],[115.506705,39.652127],[115.496771,39.652551],[115.494659,39.649237],[115.478515,39.650331],[115.477971,39.654216],[115.482593,39.66303],[115.491334,39.668694],[115.486733,39.673362],[115.489724,39.678012],[115.488783,39.681619],[115.494408,39.686481],[115.496395,39.685665],[115.499783,39.691278],[115.49926,39.696189],[115.492631,39.701719],[115.490247,39.701409],[115.493404,39.707494],[115.491229,39.714719],[115.488866,39.733163],[115.492108,39.73887],[115.482321,39.742473],[115.470568,39.742391],[115.46672,39.740451],[115.457728,39.744918],[115.439158,39.752678],[115.434411,39.763859],[115.435414,39.769938],[115.430918,39.772073],[115.427029,39.769775],[115.425209,39.77336],[115.431169,39.775756],[115.434076,39.782274],[115.443382,39.785646],[115.452751,39.781964],[115.45777,39.782143],[115.475859,39.791821],[115.483241,39.798679],[115.49238,39.796057],[115.497336,39.791088],[115.508712,39.784082],[115.513815,39.788693],[115.536275,39.792131],[115.539432,39.794754],[115.554866,39.795601],[115.56229,39.803713],[115.566577,39.804609],[115.566367,39.809788],[115.569274,39.813274],[115.577367,39.812541],[115.587322,39.813762],[115.59117,39.818534],[115.596649,39.821498],[115.599325,39.829151],[115.604533,39.834443],[115.607586,39.84089],[115.613086,39.843755],[115.616369,39.857542],[115.621973,39.863271],[115.623103,39.866949],[115.630987,39.871977],[115.640021,39.871554],[115.644705,39.875964],[115.648867,39.875411],[115.654869,39.882505],[115.667541,39.883888],[115.671055,39.88597],[115.678144,39.886556],[115.682556,39.893047],[115.68929,39.896187],[115.691779,39.8997],[115.709178,39.905117],[115.719592,39.904612],[115.721621,39.906824],[115.731261,39.907865],[115.74889,39.9152],[115.749622,39.917655],[115.76148,39.920989],[115.769385,39.925233],[115.774257,39.920599],[115.792848,39.920859],[115.797344,39.92216],[115.806839,39.919656],[115.811084,39.913785],[115.8188,39.913948],[115.826914,39.910581],[115.835112,39.899586],[115.838772,39.900644],[115.845255,39.897049],[115.860897,39.901359],[115.868321,39.905572],[115.87311,39.912484],[115.87884,39.915964],[115.890112,39.917281],[115.903935,39.914029],[115.927858,39.914257],[115.935868,39.917753],[115.941159,39.917509],[115.945697,39.910972],[115.944965,39.901847],[115.935805,39.898236],[115.921856,39.884164],[115.92744,39.876192],[115.949837,39.871278],[115.954145,39.866786],[115.961318,39.867877],[115.967822,39.872059],[115.968742,39.867714],[115.976563,39.868251],[115.97627,39.870497],[115.990177,39.876338],[115.997245,39.875167],[115.992875,39.867356],[115.986789,39.864703],[115.98817,39.859837],[115.98428,39.849111],[115.991285,39.840222],[116.00789,39.849469],[116.016694,39.849225],[116.018367,39.841525],[116.021023,39.840662],[116.030308,39.843462],[116.033089,39.845904],[116.04181,39.844878],[116.045825,39.84732],[116.05465,39.845953]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110112,\"name\":\"通州区\",\"center\":[116.658603,39.902486],\"centroid\":[116.73624,39.803923],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":8,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.534944,39.82482],[116.538143,39.828207],[116.533187,39.832733],[116.542681,39.830209],[116.543664,39.835078],[116.558596,39.834687],[116.569386,39.833498],[116.577145,39.830682],[116.577479,39.827539],[116.587015,39.828223],[116.583732,39.824917],[116.591595,39.823875],[116.59147,39.826367],[116.599228,39.825585],[116.598977,39.831659],[116.60224,39.831675],[116.601905,39.840727],[116.608367,39.846539],[116.604666,39.846132],[116.604185,39.850071],[116.613449,39.850185],[116.626958,39.860683],[116.619994,39.868951],[116.62493,39.87725],[116.624323,39.881155],[116.628987,39.881594],[116.627585,39.890477],[116.615603,39.889794],[116.61531,39.895503],[116.621019,39.898854],[116.623361,39.904271],[116.620245,39.90767],[116.623006,39.913818],[116.620956,39.923103],[116.630576,39.921672],[116.624156,39.929981],[116.6293,39.931314],[116.629677,39.938727],[116.633441,39.940906],[116.630492,39.946156],[116.632228,39.950545],[116.645277,39.945977],[116.643081,39.952983],[116.641827,39.969575],[116.639819,39.982606],[116.634026,39.981696],[116.63365,39.986197],[116.639129,39.986879],[116.640321,39.990177],[116.643751,39.989608],[116.642684,39.996755],[116.637582,40.002359],[116.63273,39.999825],[116.625766,40.003122],[116.628129,40.007653],[116.61989,40.011794],[116.60132,40.013873],[116.595548,40.01751],[116.600839,40.018858],[116.602762,40.028503],[116.610061,40.031214],[116.614055,40.03175],[116.614139,40.028178],[116.619388,40.026733],[116.620099,40.022512],[116.624239,40.023664],[116.627063,40.021505],[116.633504,40.023664],[116.636159,40.019703],[116.651195,40.025759],[116.651676,40.021911],[116.655629,40.018566],[116.660125,40.021651],[116.664705,40.019037],[116.668615,40.013938],[116.678465,40.015058],[116.683777,40.014458],[116.686286,40.00827],[116.688378,40.00918],[116.685575,40.016569],[116.697244,40.016098],[116.703936,40.020141],[116.708621,40.026587],[116.716337,40.023762],[116.717383,40.019605],[116.719725,40.022512],[116.724221,40.021278],[116.724828,40.024265],[116.732043,40.022219],[116.732335,40.025109],[116.737145,40.02761],[116.747058,40.025385],[116.747037,40.021976],[116.751763,40.019962],[116.75329,40.015919],[116.764791,40.016049],[116.771755,40.014474],[116.770459,40.011632],[116.775749,40.002943],[116.775373,39.992759],[116.766757,39.982281],[116.766443,39.976351],[116.759605,39.969933],[116.757326,39.961483],[116.762826,39.956006],[116.78058,39.949716],[116.782567,39.947554],[116.78332,39.936045],[116.782358,39.928273],[116.78217,39.910419],[116.78424,39.902221],[116.7847,39.89142],[116.787084,39.886833],[116.794738,39.881252],[116.804148,39.877933],[116.804253,39.88488],[116.808247,39.884913],[116.80831,39.889631],[116.812304,39.889712],[116.81312,39.881301],[116.817009,39.878649],[116.823681,39.879137],[116.827277,39.877071],[116.836897,39.864736],[116.839407,39.865777],[116.847249,39.858616],[116.85254,39.859056],[116.85829,39.84846],[116.865505,39.846913],[116.866049,39.843902],[116.871507,39.842062],[116.878638,39.842257],[116.878304,39.84522],[116.885665,39.844585],[116.897501,39.832587],[116.903357,39.830682],[116.907581,39.834117],[116.902896,39.841346],[116.902813,39.848248],[116.910383,39.850608],[116.917431,39.846913],[116.9259,39.835403],[116.92887,39.820912],[116.92818,39.814153],[116.92979,39.811368],[116.942881,39.801677],[116.934809,39.801139],[116.938301,39.793124],[116.950828,39.791528],[116.953797,39.78607],[116.948004,39.785369],[116.94974,39.778542],[116.945788,39.777369],[116.939284,39.781361],[116.933784,39.781801],[116.921718,39.780628],[116.91649,39.775935],[116.920902,39.769107],[116.910613,39.762278],[116.908292,39.766711],[116.901809,39.763615],[116.901558,39.755204],[116.907163,39.75597],[116.913185,39.745962],[116.914461,39.741755],[116.910718,39.740989],[116.912934,39.73569],[116.916364,39.73587],[116.916678,39.731353],[116.911533,39.731516],[116.90229,39.729413],[116.89976,39.726168],[116.887589,39.725515],[116.8828,39.71847],[116.887108,39.714311],[116.886376,39.707004],[116.893841,39.695879],[116.89336,39.693187],[116.887819,39.690952],[116.88991,39.687656],[116.902896,39.690576],[116.909024,39.682859],[116.905197,39.681651],[116.906661,39.677425],[116.891144,39.67408],[116.883239,39.675352],[116.87318,39.671387],[116.863979,39.670391],[116.860486,39.667258],[116.849946,39.667552],[116.85141,39.652845],[116.839135,39.647523],[116.840766,39.644241],[116.833572,39.644127],[116.834555,39.641841],[116.826901,39.638217],[116.82893,39.635163],[116.826357,39.633122],[116.838445,39.62223],[116.834116,39.621495],[116.835391,39.617004],[116.82504,39.613884],[116.823994,39.617183],[116.81954,39.618996],[116.809711,39.614521],[116.802078,39.6123],[116.790012,39.610535],[116.792835,39.602155],[116.789384,39.602596],[116.790702,39.596045],[116.785474,39.596209],[116.785055,39.593497],[116.778196,39.593382],[116.774892,39.599166],[116.774202,39.605439],[116.762616,39.613819],[116.748689,39.619943],[116.744004,39.616824],[116.737877,39.61537],[116.730516,39.619143],[116.730202,39.622932],[116.725518,39.624075],[116.721398,39.629415],[116.723489,39.639033],[116.716003,39.640356],[116.710419,39.639686],[116.70609,39.642903],[116.702891,39.649923],[116.702138,39.657644],[116.704857,39.667192],[116.703769,39.674145],[116.693543,39.674944],[116.692706,39.676789],[116.685554,39.676886],[116.680786,39.674896],[116.675203,39.676234],[116.668574,39.674602],[116.666022,39.679693],[116.669577,39.683642],[116.666566,39.687101],[116.65818,39.68857],[116.658097,39.686155],[116.651321,39.687868],[116.651509,39.694459],[116.647097,39.694786],[116.64626,39.700447],[116.647912,39.703579],[116.653098,39.703823],[116.652994,39.708619],[116.644587,39.709647],[116.638502,39.717166],[116.637623,39.723934],[116.631203,39.722971],[116.628129,39.727749],[116.621646,39.728076],[116.621876,39.725825],[116.616251,39.725581],[116.609141,39.719367],[116.604561,39.718731],[116.604017,39.714752],[116.598371,39.711963],[116.590194,39.711522],[116.590152,39.713349],[116.581202,39.712517],[116.579884,39.710234],[116.573464,39.709125],[116.573276,39.714507],[116.544961,39.715045],[116.535676,39.711881],[116.530552,39.713268],[116.53256,39.71529],[116.527332,39.716578],[116.52936,39.719808],[116.534609,39.718079],[116.536972,39.72152],[116.53783,39.728043],[116.531849,39.730016],[116.532413,39.73962],[116.537997,39.738071],[116.53624,39.740663],[116.527562,39.743304],[116.536408,39.753917],[116.540716,39.760502],[116.548119,39.765554],[116.561565,39.771111],[116.576957,39.771943],[116.594377,39.776685],[116.574677,39.798386],[116.565078,39.793988],[116.562423,39.796936],[116.555145,39.793548],[116.546634,39.803501],[116.538373,39.81513],[116.533375,39.819658],[116.539586,39.821563],[116.534944,39.82482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110113,\"name\":\"顺义区\",\"center\":[116.653525,40.128936],\"centroid\":[116.726467,40.152366],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":9,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.771755,40.014474],[116.764791,40.016049],[116.75329,40.015919],[116.751763,40.019962],[116.747037,40.021976],[116.747058,40.025385],[116.737145,40.02761],[116.732335,40.025109],[116.732043,40.022219],[116.724828,40.024265],[116.724221,40.021278],[116.719725,40.022512],[116.717383,40.019605],[116.716337,40.023762],[116.708621,40.026587],[116.703936,40.020141],[116.697244,40.016098],[116.685575,40.016569],[116.688378,40.00918],[116.686286,40.00827],[116.683777,40.014458],[116.678465,40.015058],[116.668615,40.013938],[116.664705,40.019037],[116.660125,40.021651],[116.655629,40.018566],[116.651676,40.021911],[116.651195,40.025759],[116.636159,40.019703],[116.633504,40.023664],[116.627063,40.021505],[116.624239,40.023664],[116.620099,40.022512],[116.619388,40.026733],[116.614139,40.028178],[116.614055,40.03175],[116.610061,40.031214],[116.603683,40.052949],[116.608409,40.054912],[116.603473,40.086811],[116.602909,40.093883],[116.598392,40.103874],[116.598705,40.09351],[116.595903,40.090218],[116.580365,40.088352],[116.578316,40.102739],[116.574071,40.107815],[116.574322,40.096138],[116.578149,40.076461],[116.551757,40.059765],[116.547784,40.062718],[116.543183,40.059408],[116.534379,40.066791],[116.525993,40.071334],[116.513948,40.070426],[116.506775,40.074352],[116.49933,40.080387],[116.486657,40.081036],[116.482935,40.083745],[116.473545,40.085562],[116.471015,40.08939],[116.466832,40.090185],[116.466498,40.094954],[116.473357,40.097516],[116.480885,40.096965],[116.489292,40.101668],[116.492199,40.111561],[116.487222,40.124678],[116.484754,40.140078],[116.482307,40.140629],[116.480781,40.14742],[116.490777,40.148992],[116.492303,40.156981],[116.484629,40.160465],[116.477916,40.159979],[116.476912,40.163576],[116.480802,40.171937],[116.483332,40.171742],[116.485151,40.176764],[116.490129,40.181316],[116.487975,40.184686],[116.488016,40.191796],[116.484503,40.196493],[116.472249,40.205092],[116.473712,40.221203],[116.477979,40.225201],[116.483771,40.225185],[116.481094,40.238248],[116.482098,40.245385],[116.493705,40.251179],[116.501024,40.251599],[116.503011,40.25969],[116.505959,40.261356],[116.509201,40.258056],[116.523965,40.257522],[116.526181,40.261324],[116.535717,40.261373],[116.540088,40.267165],[116.53693,40.277178],[116.540904,40.274946],[116.546236,40.276224],[116.552176,40.27383],[116.566187,40.27802],[116.565371,40.273377],[116.570516,40.273102],[116.570202,40.268863],[116.58254,40.268362],[116.585238,40.266226],[116.588396,40.269462],[116.590842,40.264139],[116.599647,40.265385],[116.600755,40.258978],[116.604624,40.256146],[116.603787,40.251324],[116.61324,40.251761],[116.622044,40.250467],[116.6238,40.252667],[116.623654,40.26058],[116.63526,40.261454],[116.637038,40.25846],[116.641492,40.259463],[116.643081,40.25715],[116.648519,40.260143],[116.666901,40.262085],[116.669494,40.253153],[116.673321,40.246777],[116.668783,40.238539],[116.670247,40.234865],[116.676311,40.238604],[116.678131,40.234379],[116.684007,40.234282],[116.69072,40.240886],[116.697265,40.243216],[116.696554,40.248072],[116.704585,40.251551],[116.704668,40.257101],[116.710837,40.256227],[116.738421,40.284392],[116.738965,40.284101],[116.741098,40.283001],[116.738337,40.278764],[116.74298,40.279087],[116.752788,40.275512],[116.762658,40.269058],[116.768597,40.270109],[116.771651,40.266501],[116.773512,40.269527],[116.782964,40.273248],[116.784073,40.279443],[116.787795,40.281449],[116.788025,40.289439],[116.794487,40.287417],[116.800572,40.289196],[116.809607,40.28601],[116.811823,40.282387],[116.825123,40.285347],[116.82458,40.290991],[116.827215,40.298333],[116.830101,40.299206],[116.828992,40.304413],[116.838382,40.310185],[116.848984,40.311204],[116.854547,40.303152],[116.857182,40.2929],[116.859462,40.290878],[116.871319,40.290943],[116.871737,40.281481],[116.876338,40.274348],[116.874247,40.268281],[116.879893,40.264139],[116.881273,40.259221],[116.886104,40.255256],[116.886585,40.251907],[116.892252,40.245709],[116.894343,40.240028],[116.901746,40.23684],[116.893946,40.233457],[116.900701,40.228763],[116.906598,40.228682],[116.908606,40.222401],[116.913917,40.220118],[116.915507,40.222271],[116.922031,40.220134],[116.92544,40.225768],[116.931065,40.230624],[116.935206,40.229847],[116.940978,40.223922],[116.938029,40.210549],[116.929685,40.211585],[116.930898,40.207084],[116.939556,40.192347],[116.945913,40.193141],[116.94997,40.186354],[116.945809,40.186224],[116.945349,40.1813],[116.951371,40.174788],[116.962037,40.175549],[116.961242,40.171937],[116.968749,40.163495],[116.972054,40.156301],[116.977763,40.151374],[116.970025,40.140321],[116.967829,40.129849],[116.96578,40.127823],[116.971594,40.124224],[116.969189,40.118776],[116.971301,40.114009],[116.976069,40.111188],[116.973329,40.103712],[116.967976,40.101214],[116.975462,40.095051],[116.979938,40.093867],[116.981862,40.089828],[116.981192,40.08149],[116.986274,40.078359],[116.982844,40.070685],[116.980816,40.071188],[116.978599,40.064893],[116.973476,40.066304],[116.970652,40.063805],[116.962288,40.063529],[116.961932,40.051358],[116.945265,40.041425],[116.945014,40.048631],[116.937632,40.046911],[116.938824,40.050887],[116.931693,40.052024],[116.928096,40.054929],[116.924164,40.047463],[116.917974,40.044704],[116.914252,40.052592],[116.906431,40.051423],[116.90137,40.047723],[116.890265,40.04597],[116.88075,40.046164],[116.873619,40.041522],[116.867826,40.041863],[116.857809,40.051894],[116.850197,40.054977],[116.849486,40.051926],[116.831502,40.051196],[116.831732,40.048485],[116.822739,40.046473],[116.823158,40.039834],[116.820816,40.038779],[116.82,40.028357],[116.815295,40.030905],[116.803375,40.032155],[116.800259,40.028844],[116.789531,40.032318],[116.790221,40.034477],[116.781542,40.034818],[116.77782,40.032448],[116.777485,40.027204],[116.771755,40.014474]]],[[[116.578149,40.076461],[116.581411,40.067846],[116.58139,40.073817],[116.586597,40.074336],[116.590131,40.056162],[116.587957,40.05053],[116.591198,40.051796],[116.590006,40.043616],[116.599814,40.041408],[116.599417,40.047171],[116.601633,40.047658],[116.598517,40.052543],[116.603683,40.052949],[116.610061,40.031214],[116.602762,40.028503],[116.600839,40.018858],[116.595548,40.01751],[116.577814,40.027512],[116.578797,40.033097],[116.570474,40.032431],[116.564242,40.039655],[116.550753,40.045499],[116.54655,40.048956],[116.552761,40.05488],[116.551757,40.059765],[116.578149,40.076461]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110114,\"name\":\"昌平区\",\"center\":[116.235906,40.218085],\"centroid\":[116.210635,40.215461],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":10,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.466832,40.090185],[116.466247,40.08235],[116.461855,40.080825],[116.462608,40.076786],[116.458823,40.075796],[116.458635,40.070377],[116.462127,40.06731],[116.459408,40.059992],[116.45142,40.06129],[116.451629,40.058759],[116.442867,40.061323],[116.433268,40.06228],[116.415618,40.056],[116.409595,40.055626],[116.406124,40.049768],[116.408884,40.043291],[116.405266,40.038974],[116.395333,40.036766],[116.39297,40.041733],[116.390649,40.041279],[116.38519,40.042853],[116.376888,40.042756],[116.376114,40.045466],[116.36959,40.04696],[116.367394,40.053436],[116.372999,40.054344],[116.372267,40.05785],[116.379272,40.059002],[116.382848,40.061582],[116.381928,40.066402],[116.373354,40.065623],[116.372538,40.06843],[116.363149,40.068965],[116.363023,40.065931],[116.357293,40.066012],[116.34667,40.063659],[116.346963,40.06043],[116.342676,40.059635],[116.343366,40.055448],[116.340271,40.055091],[116.338828,40.058921],[116.325946,40.054799],[116.318292,40.061663],[116.309446,40.060609],[116.305995,40.063043],[116.302942,40.060803],[116.290353,40.083145],[116.279897,40.079754],[116.2731,40.092699],[116.27333,40.09557],[116.265237,40.094694],[116.258273,40.101522],[116.263899,40.10402],[116.263334,40.110588],[116.258022,40.11195],[116.25957,40.106907],[116.255868,40.104474],[116.252732,40.106517],[116.245956,40.10535],[116.240498,40.108009],[116.243363,40.113279],[116.241836,40.118403],[116.245036,40.118825],[116.247043,40.136204],[116.233785,40.136577],[116.215445,40.143174],[116.212224,40.140548],[116.206285,40.143092],[116.205658,40.150175],[116.203211,40.153773],[116.202166,40.160984],[116.194282,40.160076],[116.192065,40.155669],[116.182696,40.158099],[116.183094,40.153335],[116.180417,40.14729],[116.174122,40.143595],[116.167681,40.141844],[116.168622,40.135442],[116.17178,40.127936],[116.167409,40.128455],[116.169563,40.124564],[116.152708,40.121776],[116.132925,40.121354],[116.132214,40.115079],[116.127676,40.116393],[116.113309,40.115598],[116.105864,40.118014],[116.102246,40.115987],[116.096056,40.121257],[116.089783,40.119327],[116.08445,40.120252],[116.077883,40.115047],[116.073847,40.115436],[116.072676,40.109258],[116.069456,40.104912],[116.062931,40.10282],[116.061969,40.09956],[116.055905,40.09643],[116.051848,40.091661],[116.048878,40.085303],[116.043775,40.083502],[116.037899,40.084524],[116.033926,40.079657],[116.030914,40.082188],[116.020856,40.074579],[116.007785,40.080614],[116.005129,40.079803],[115.99735,40.082074],[115.986434,40.083469],[115.979993,40.081669],[115.977232,40.079041],[115.968575,40.075488],[115.966588,40.084556],[115.960461,40.092456],[115.962092,40.094419],[115.962552,40.10235],[115.957449,40.100679],[115.956717,40.096041],[115.952681,40.10102],[115.943229,40.103339],[115.947913,40.107409],[115.933588,40.124824],[115.921438,40.134485],[115.906549,40.138181],[115.904457,40.136123],[115.900442,40.138716],[115.8816,40.139073],[115.874155,40.14387],[115.870768,40.144276],[115.865184,40.148635],[115.856547,40.147468],[115.853348,40.149332],[115.853557,40.154162],[115.84676,40.163171],[115.844418,40.168016],[115.846865,40.169458],[115.854205,40.179939],[115.848099,40.183843],[115.855502,40.188865],[115.863072,40.186095],[115.870308,40.186079],[115.873695,40.192687],[115.87633,40.193918],[115.877313,40.200849],[115.886326,40.206663],[115.883169,40.209594],[115.885072,40.212039],[115.883106,40.216119],[115.891366,40.225379],[115.891994,40.228147],[115.898476,40.234509],[115.898079,40.236419],[115.906695,40.23412],[115.911965,40.234477],[115.916628,40.242391],[115.916984,40.247068],[115.935826,40.25558],[115.942706,40.253557],[115.950276,40.256163],[115.960001,40.256648],[115.965605,40.259415],[115.968888,40.264269],[115.967006,40.265612],[115.976396,40.270983],[115.981812,40.276903],[115.978822,40.281627],[115.981227,40.28525],[115.978675,40.289633],[115.982732,40.297977],[115.990323,40.299498],[115.987919,40.303799],[115.975538,40.308698],[115.976417,40.311511],[115.973259,40.318997],[115.979658,40.320532],[115.982711,40.324202],[115.993398,40.328986],[115.999065,40.325463],[116.007597,40.33314],[116.01684,40.33466],[116.026481,40.324283],[116.026167,40.320484],[116.031144,40.312352],[116.040095,40.312724],[116.042479,40.316846],[116.051116,40.315812],[116.056971,40.322181],[116.053353,40.326853],[116.061802,40.336809],[116.06841,40.336971],[116.073429,40.339831],[116.077716,40.339346],[116.083342,40.33571],[116.086353,40.330813],[116.098649,40.330005],[116.102978,40.331524],[116.110381,40.330813],[116.116634,40.323668],[116.116237,40.321955],[116.122385,40.312805],[116.132737,40.31198],[116.141959,40.316879],[116.138383,40.324671],[116.13809,40.330974],[116.143904,40.336082],[116.137651,40.336534],[116.137567,40.340769],[116.140809,40.343047],[116.138404,40.345229],[116.144782,40.348541],[116.147543,40.340655],[116.144719,40.336631],[116.152603,40.337714],[116.155677,40.344906],[116.1507,40.349252],[116.145514,40.351046],[116.148651,40.35696],[116.148233,40.361807],[116.159295,40.366265],[116.168789,40.366718],[116.170713,40.369351],[116.177154,40.370934],[116.180354,40.367687],[116.192985,40.372775],[116.209129,40.376232],[116.211451,40.381756],[116.222221,40.382111],[116.226989,40.38111],[116.23184,40.374988],[116.23665,40.377427],[116.241962,40.377508],[116.24353,40.379818],[116.247796,40.374471],[116.252104,40.376297],[116.25338,40.381239],[116.258336,40.383193],[116.261264,40.380561],[116.270863,40.382693],[116.282845,40.375263],[116.290729,40.383177],[116.289872,40.391672],[116.293762,40.392415],[116.295581,40.384437],[116.302691,40.387473],[116.313106,40.389459],[116.32078,40.386859],[116.32398,40.387295],[116.337364,40.379769],[116.34506,40.373163],[116.355369,40.37137],[116.360033,40.366815],[116.357356,40.364084],[116.352797,40.364391],[116.348866,40.356427],[116.355641,40.356814],[116.363923,40.359028],[116.369673,40.356362],[116.367101,40.350351],[116.364508,40.349107],[116.369903,40.342401],[116.368231,40.334805],[116.365909,40.331702],[116.376135,40.334352],[116.375069,40.337375],[116.384563,40.339055],[116.391422,40.338393],[116.396358,40.334853],[116.408633,40.334886],[116.408989,40.333205],[116.417061,40.329843],[116.424359,40.331265],[116.427914,40.329213],[116.43423,40.329116],[116.438245,40.333221],[116.443745,40.322682],[116.449182,40.32113],[116.455184,40.316345],[116.44822,40.305982],[116.443766,40.302457],[116.448011,40.300484],[116.45096,40.293045],[116.449412,40.286722],[116.45533,40.284845],[116.460308,40.28711],[116.469634,40.283001],[116.472081,40.280122],[116.478794,40.280025],[116.484001,40.2759],[116.484273,40.267634],[116.493245,40.262489],[116.501839,40.262974],[116.505959,40.261356],[116.503011,40.25969],[116.501024,40.251599],[116.493705,40.251179],[116.482098,40.245385],[116.481094,40.238248],[116.483771,40.225185],[116.477979,40.225201],[116.473712,40.221203],[116.472249,40.205092],[116.484503,40.196493],[116.488016,40.191796],[116.487975,40.184686],[116.490129,40.181316],[116.485151,40.176764],[116.483332,40.171742],[116.480802,40.171937],[116.476912,40.163576],[116.477916,40.159979],[116.484629,40.160465],[116.492303,40.156981],[116.490777,40.148992],[116.480781,40.14742],[116.482307,40.140629],[116.484754,40.140078],[116.487222,40.124678],[116.492199,40.111561],[116.489292,40.101668],[116.480885,40.096965],[116.473357,40.097516],[116.466498,40.094954],[116.466832,40.090185]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110115,\"name\":\"大兴区\",\"center\":[116.338033,39.728908],\"centroid\":[116.421058,39.649884],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":11,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.534944,39.82482],[116.539586,39.821563],[116.533375,39.819658],[116.538373,39.81513],[116.546634,39.803501],[116.555145,39.793548],[116.562423,39.796936],[116.565078,39.793988],[116.574677,39.798386],[116.594377,39.776685],[116.576957,39.771943],[116.561565,39.771111],[116.548119,39.765554],[116.540716,39.760502],[116.536408,39.753917],[116.527562,39.743304],[116.53624,39.740663],[116.537997,39.738071],[116.532413,39.73962],[116.531849,39.730016],[116.53783,39.728043],[116.536972,39.72152],[116.534609,39.718079],[116.52936,39.719808],[116.527332,39.716578],[116.53256,39.71529],[116.530552,39.713268],[116.535676,39.711881],[116.544961,39.715045],[116.573276,39.714507],[116.573464,39.709125],[116.579884,39.710234],[116.581202,39.712517],[116.590152,39.713349],[116.590194,39.711522],[116.598371,39.711963],[116.604017,39.714752],[116.604561,39.718731],[116.609141,39.719367],[116.616251,39.725581],[116.621876,39.725825],[116.621646,39.728076],[116.628129,39.727749],[116.631203,39.722971],[116.637623,39.723934],[116.638502,39.717166],[116.644587,39.709647],[116.652994,39.708619],[116.653098,39.703823],[116.647912,39.703579],[116.64626,39.700447],[116.647097,39.694786],[116.651509,39.694459],[116.651321,39.687868],[116.658097,39.686155],[116.65818,39.68857],[116.666566,39.687101],[116.669577,39.683642],[116.666022,39.679693],[116.668574,39.674602],[116.675203,39.676234],[116.680786,39.674896],[116.685554,39.676886],[116.692706,39.676789],[116.693543,39.674944],[116.703769,39.674145],[116.704857,39.667192],[116.702138,39.657644],[116.702891,39.649923],[116.70609,39.642903],[116.710419,39.639686],[116.716003,39.640356],[116.723489,39.639033],[116.721398,39.629415],[116.725518,39.624075],[116.721858,39.621756],[116.716149,39.62156],[116.70929,39.618114],[116.705338,39.621462],[116.700737,39.62107],[116.702577,39.610421],[116.718282,39.603021],[116.718324,39.601077],[116.724953,39.598006],[116.727065,39.593055],[116.705108,39.587974],[116.700695,39.590964],[116.699127,39.595457],[116.696408,39.595392],[116.694087,39.601355],[116.6889,39.598496],[116.669975,39.603381],[116.670037,39.604916],[116.662384,39.60521],[116.6568,39.602776],[116.657678,39.60075],[116.646532,39.599117],[116.645549,39.60209],[116.635595,39.604818],[116.635407,39.599934],[116.628338,39.599558],[116.620517,39.601665],[116.620182,39.606893],[116.616857,39.607301],[116.616648,39.614096],[116.613177,39.613802],[116.611755,39.618882],[116.607781,39.619698],[116.607886,39.624696],[116.602177,39.624533],[116.600128,39.619649],[116.593561,39.618588],[116.591993,39.621299],[116.579194,39.623487],[116.579382,39.619666],[116.565936,39.61978],[116.565978,39.616138],[116.569637,39.61176],[116.566103,39.61114],[116.566605,39.604361],[116.562276,39.601714],[116.557132,39.601502],[116.549436,39.596143],[116.544187,39.596519],[116.544124,39.603609],[116.540883,39.60142],[116.541803,39.59348],[116.530866,39.596715],[116.530615,39.598774],[116.524446,39.596535],[116.525052,39.593807],[116.521267,39.590229],[116.52317,39.586242],[116.519699,39.581863],[116.520389,39.577156],[116.52614,39.577271],[116.527248,39.57294],[116.520389,39.57191],[116.519385,39.566484],[116.511564,39.565503],[116.510581,39.560502],[116.50805,39.560256],[116.508448,39.551053],[116.489773,39.550268],[116.48948,39.553472],[116.473378,39.553096],[116.470952,39.5546],[116.475134,39.545756],[116.47802,39.543205],[116.478188,39.535487],[116.468819,39.534359],[116.464595,39.531628],[116.464553,39.527638],[116.453846,39.528652],[116.45372,39.526477],[116.440985,39.527311],[116.436802,39.526346],[116.439876,39.523353],[116.440378,39.516271],[116.442741,39.516189],[116.443829,39.509875],[116.433017,39.507438],[116.431699,39.51053],[116.424631,39.509728],[116.423125,39.516337],[116.424046,39.522732],[116.421473,39.525103],[116.411247,39.524678],[116.402652,39.526886],[116.40282,39.51439],[116.407253,39.512116],[116.40857,39.508011],[116.418734,39.506391],[116.422895,39.496608],[116.418504,39.496575],[116.415827,39.48823],[116.411582,39.485105],[116.412376,39.482077],[116.423544,39.485154],[116.427329,39.487788],[116.429964,39.481325],[116.425342,39.481259],[116.428333,39.476219],[116.433644,39.478183],[116.436258,39.482912],[116.444142,39.482192],[116.444059,39.47887],[116.448764,39.476284],[116.448638,39.465122],[116.453992,39.45751],[116.454682,39.453302],[116.450667,39.452648],[116.450353,39.448522],[116.437241,39.445951],[116.434397,39.442758],[116.425635,39.446885],[116.408947,39.450257],[116.399787,39.450044],[116.391903,39.452893],[116.388557,39.450732],[116.373563,39.452058],[116.367791,39.451633],[116.362187,39.454874],[116.351124,39.455529],[116.350162,39.45291],[116.334499,39.457019],[116.325611,39.462961],[116.325088,39.466153],[116.320048,39.468543],[116.319944,39.473436],[116.314779,39.476104],[116.312708,39.480556],[116.306957,39.485023],[116.305284,39.489179],[116.283201,39.493941],[116.279269,39.491306],[116.275631,39.495201],[116.269315,39.495495],[116.257939,39.500518],[116.25706,39.505491],[116.253861,39.510055],[116.245831,39.514897],[116.246709,39.520098],[116.24353,39.524236],[116.246479,39.525299],[116.248256,39.530271],[116.245601,39.53014],[116.246521,39.539788],[116.242505,39.552966],[116.246186,39.557167],[116.243007,39.55836],[116.240644,39.564098],[116.234684,39.563934],[116.236462,39.568396],[116.229373,39.565471],[116.225817,39.568151],[116.221175,39.578921],[116.225085,39.584085],[116.226089,39.591993],[116.222597,39.593938],[116.223141,39.597222],[116.21808,39.608102],[116.219502,39.618931],[116.218875,39.628011],[116.215487,39.64305],[116.216992,39.651572],[116.223162,39.664728],[116.221342,39.667486],[116.22565,39.67359],[116.221238,39.678453],[116.230941,39.692355],[116.23435,39.703823],[116.231945,39.706025],[116.236629,39.71286],[116.245036,39.718421],[116.245768,39.72408],[116.248466,39.728027],[116.248026,39.732641],[116.243948,39.741658],[116.251895,39.749092],[116.252481,39.758676],[116.254426,39.76324],[116.252481,39.771747],[116.253777,39.77952],[116.251602,39.782518],[116.251519,39.793059],[116.259298,39.797621],[116.262184,39.792782],[116.27423,39.796936],[116.287237,39.799103],[116.289182,39.795894],[116.296083,39.795568],[116.291148,39.793271],[116.295205,39.790958],[116.301541,39.774941],[116.307062,39.770085],[116.31068,39.772057],[116.317978,39.783447],[116.321784,39.783626],[116.322872,39.798386],[116.326824,39.798386],[116.328225,39.801416],[116.340124,39.802149],[116.341755,39.807589],[116.355704,39.805668],[116.356833,39.800471],[116.367039,39.79982],[116.368189,39.794819],[116.365742,39.794151],[116.367582,39.784962],[116.378478,39.785646],[116.379209,39.77939],[116.385609,39.778852],[116.390649,39.780465],[116.391903,39.765277],[116.398888,39.765864],[116.397905,39.781068],[116.396023,39.786738],[116.42024,39.787439],[116.421034,39.794134],[116.429274,39.794102],[116.429399,39.803583],[116.425719,39.805358],[116.422456,39.81044],[116.417772,39.81013],[116.415262,39.812525],[116.410013,39.811336],[116.41016,39.817052],[116.419759,39.815375],[116.418441,39.822915],[116.414426,39.824282],[116.415785,39.829428],[116.420072,39.826611],[116.425217,39.831903],[116.430068,39.830112],[116.43699,39.830649],[116.436677,39.827425],[116.44592,39.826692],[116.443912,39.82096],[116.452737,39.823012],[116.462775,39.815945],[116.468463,39.814511],[116.474256,39.809772],[116.485256,39.81272],[116.485632,39.816889],[116.495357,39.818795],[116.498201,39.8157],[116.505813,39.817866],[116.502801,39.819006],[116.510142,39.821449],[116.510602,39.827637],[116.516164,39.829835],[116.525366,39.829754],[116.525868,39.826904],[116.534944,39.82482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110116,\"name\":\"怀柔区\",\"center\":[116.637122,40.324272],\"centroid\":[116.586079,40.63069],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":12,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.289872,40.391672],[116.286003,40.396032],[116.289746,40.402539],[116.287864,40.404719],[116.291608,40.408448],[116.288513,40.413437],[116.289433,40.418021],[116.291942,40.416617],[116.296648,40.420701],[116.294452,40.429304],[116.290667,40.435856],[116.289788,40.440907],[116.294368,40.449975],[116.293824,40.452831],[116.300955,40.458429],[116.306853,40.466092],[116.301646,40.468108],[116.294786,40.47535],[116.291691,40.485317],[116.29717,40.486768],[116.303779,40.485817],[116.31022,40.491702],[116.31321,40.491799],[116.323227,40.500151],[116.330567,40.500748],[116.336653,40.498636],[116.34232,40.500457],[116.348636,40.499071],[116.357042,40.501941],[116.365909,40.499635],[116.369632,40.500312],[116.377537,40.49683],[116.378603,40.491525],[116.376825,40.485736],[116.387344,40.482043],[116.38609,40.475802],[116.393702,40.47256],[116.4065,40.481995],[116.413673,40.481527],[116.416664,40.483011],[116.420971,40.480301],[116.433142,40.478189],[116.443201,40.481801],[116.455937,40.480914],[116.457903,40.488445],[116.465577,40.48701],[116.468212,40.48493],[116.483541,40.484994],[116.487347,40.481737],[116.492157,40.481027],[116.508322,40.483172],[116.511543,40.486929],[116.519092,40.491799],[116.519155,40.496604],[116.51194,40.501135],[116.506398,40.508212],[116.500459,40.510904],[116.497762,40.518093],[116.492073,40.518093],[116.488581,40.515853],[116.476306,40.514192],[116.470345,40.518963],[116.46587,40.518802],[116.460956,40.524363],[116.467125,40.530068],[116.470617,40.535418],[116.479651,40.541396],[116.484587,40.552867],[116.496277,40.555106],[116.499999,40.560921],[116.505144,40.562581],[116.509577,40.57276],[116.513153,40.572792],[116.517796,40.579749],[116.525136,40.583002],[116.531577,40.59131],[116.530929,40.595883],[116.535948,40.59944],[116.532915,40.606459],[116.535634,40.615698],[116.538938,40.619673],[116.539294,40.625612],[116.545003,40.627076],[116.551674,40.625209],[116.561231,40.628557],[116.568989,40.625483],[116.574092,40.631678],[116.573903,40.63628],[116.563886,40.636908],[116.55389,40.642877],[116.551151,40.642828],[116.550335,40.647606],[116.545023,40.650116],[116.544103,40.653767],[116.540046,40.656679],[116.529507,40.654588],[116.527039,40.6584],[116.518381,40.660925],[116.520096,40.66411],[116.517273,40.665734],[116.513488,40.672344],[116.505938,40.673067],[116.501568,40.671186],[116.492826,40.673984],[116.487138,40.674338],[116.483374,40.679403],[116.488811,40.69196],[116.496653,40.696879],[116.502676,40.697361],[116.501066,40.70228],[116.501923,40.706796],[116.506064,40.710879],[116.503115,40.715893],[116.504119,40.720135],[116.506858,40.720039],[116.510748,40.72645],[116.509493,40.73548],[116.513697,40.741456],[116.506461,40.743432],[116.501819,40.746581],[116.502906,40.756635],[116.50025,40.760811],[116.495482,40.759735],[116.491404,40.7633],[116.485193,40.765179],[116.4803,40.771586],[116.471517,40.771233],[116.465452,40.772742],[116.465849,40.774525],[116.460663,40.78244],[116.461416,40.78854],[116.457233,40.7983],[116.452152,40.798059],[116.450981,40.801927],[116.440002,40.809133],[116.439897,40.815038],[116.436823,40.820735],[116.422477,40.822772],[116.414991,40.829318],[116.406458,40.833361],[116.406145,40.837933],[116.399306,40.850492],[116.391778,40.854838],[116.389707,40.861814],[116.38174,40.863465],[116.374881,40.871531],[116.366599,40.876645],[116.365972,40.880188],[116.360514,40.884885],[116.353864,40.887786],[116.344683,40.894694],[116.342236,40.899887],[116.334436,40.90463],[116.33544,40.910495],[116.334122,40.920829],[116.338828,40.925732],[116.339894,40.929416],[116.35012,40.936048],[116.358925,40.93608],[116.364801,40.942999],[116.370343,40.943655],[116.379941,40.935775],[116.379732,40.933228],[116.384019,40.928535],[116.384877,40.922848],[116.39274,40.913123],[116.396316,40.911264],[116.398533,40.906024],[116.404764,40.905736],[116.413715,40.899758],[116.418922,40.902339],[116.430905,40.903364],[116.436614,40.89939],[116.448492,40.899919],[116.45073,40.901345],[116.458676,40.900592],[116.464344,40.896329],[116.474047,40.896008],[116.477581,40.901746],[116.473608,40.91974],[116.468422,40.925091],[116.467209,40.931322],[116.461541,40.932684],[116.462315,40.935231],[116.455372,40.945433],[116.454829,40.949533],[116.447446,40.95384],[116.453302,40.964584],[116.451713,40.968667],[116.455519,40.980481],[116.464135,40.984498],[116.474193,40.978608],[116.47894,40.979104],[116.485612,40.982465],[116.493726,40.977919],[116.496737,40.978432],[116.504516,40.975919],[116.51629,40.975198],[116.519573,40.981569],[116.524718,40.981073],[116.533417,40.985698],[116.535634,40.988675],[116.541991,40.99026],[116.547826,40.988003],[116.558617,40.988627],[116.561231,40.993461],[116.569177,40.991636],[116.574928,40.986307],[116.589692,40.976703],[116.597764,40.97475],[116.614515,40.983314],[116.617067,40.998725],[116.614892,41.003574],[116.619179,41.01423],[116.621897,41.015749],[116.62288,41.020693],[116.621228,41.028978],[116.617589,41.034704],[116.614118,41.036096],[116.613491,41.040782],[116.617736,41.048649],[116.61646,41.053382],[116.624093,41.054437],[116.630848,41.0608],[116.637937,41.060497],[116.641158,41.058322],[116.647431,41.059393],[116.653914,41.05626],[116.657009,41.051303],[116.665207,41.046682],[116.673279,41.046378],[116.67698,41.042732],[116.682878,41.041789],[116.688629,41.044651],[116.692246,41.040813],[116.691347,41.037503],[116.69509,41.033265],[116.695739,41.025396],[116.698855,41.021253],[116.693836,41.013686],[116.690866,41.012982],[116.69095,41.007254],[116.683066,41.000486],[116.682543,40.986259],[116.685304,40.982641],[116.681267,40.980737],[116.677921,40.975983],[116.677921,40.970972],[116.687248,40.962551],[116.689298,40.951118],[116.696178,40.94452],[116.702368,40.940628],[116.702786,40.936512],[116.70722,40.934029],[116.712197,40.934846],[116.713891,40.929416],[116.722318,40.92743],[116.717111,40.921695],[116.713347,40.910431],[116.716881,40.910175],[116.723678,40.906313],[116.726145,40.901185],[116.730432,40.897771],[116.739759,40.896665],[116.750257,40.891665],[116.759501,40.889854],[116.758539,40.881983],[116.762135,40.880765],[116.769392,40.882961],[116.772362,40.87852],[116.776795,40.878376],[116.797226,40.860034],[116.796996,40.854886],[116.802413,40.851198],[116.802496,40.842392],[116.805947,40.840836],[116.813622,40.848423],[116.820732,40.848263],[116.823471,40.842681],[116.828009,40.841109],[116.831815,40.842585],[116.837775,40.841542],[116.839741,40.839024],[116.84819,40.839313],[116.848587,40.837147],[116.855425,40.835447],[116.860633,40.830457],[116.861448,40.825356],[116.870378,40.821601],[116.876171,40.8212],[116.876735,40.818456],[116.882172,40.814172],[116.880207,40.804367],[116.886961,40.801076],[116.878575,40.797545],[116.873326,40.798781],[116.871277,40.794785],[116.862577,40.792858],[116.867471,40.784559],[116.858039,40.78305],[116.856806,40.77955],[116.851264,40.778924],[116.850448,40.775006],[116.834785,40.770221],[116.840076,40.760682],[116.831795,40.751303],[116.826211,40.749343],[116.818662,40.75042],[116.810527,40.749118],[116.802977,40.745986],[116.793629,40.748267],[116.783759,40.757631],[116.780727,40.751512],[116.782818,40.747817],[116.786352,40.736026],[116.790472,40.728973],[116.789091,40.712454],[116.786687,40.7103],[116.787105,40.704482],[116.783989,40.700496],[116.769246,40.70281],[116.762867,40.706427],[116.756155,40.705687],[116.754963,40.702891],[116.748668,40.700544],[116.747518,40.697072],[116.74252,40.69593],[116.735807,40.69167],[116.725581,40.689114],[116.725413,40.68466],[116.714915,40.680014],[116.713221,40.669867],[116.714309,40.666104],[116.709855,40.662598],[116.712636,40.653896],[116.711151,40.648218],[116.712197,40.641268],[116.70149,40.632917],[116.70195,40.628444],[116.705128,40.626947],[116.704689,40.620076],[116.701322,40.621379],[116.697955,40.618402],[116.702598,40.612785],[116.70655,40.610998],[116.707993,40.606507],[116.705609,40.60303],[116.711235,40.600213],[116.708495,40.595206],[116.711611,40.59189],[116.708955,40.590054],[116.714351,40.58028],[116.71456,40.570682],[116.710503,40.568685],[116.709855,40.565512],[116.699336,40.563563],[116.686349,40.564497],[116.679636,40.562001],[116.682397,40.556766],[116.66872,40.557507],[116.665771,40.552432],[116.67698,40.554462],[116.68225,40.548904],[116.690699,40.549468],[116.702138,40.545456],[116.701469,40.539913],[116.706948,40.532582],[116.712573,40.529955],[116.717216,40.524798],[116.712239,40.522058],[116.711402,40.516465],[116.701071,40.510549],[116.699106,40.50444],[116.698353,40.493266],[116.693376,40.490783],[116.694149,40.485462],[116.704334,40.479043],[116.69348,40.481704],[116.693397,40.476108],[116.695571,40.466721],[116.698667,40.468043],[116.706174,40.459929],[116.716902,40.457074],[116.719223,40.460397],[116.723594,40.458542],[116.7196,40.455735],[116.719265,40.448636],[116.725811,40.443085],[116.72098,40.440988],[116.716421,40.441714],[116.723552,40.435065],[116.722339,40.423832],[116.72556,40.418053],[116.73244,40.420604],[116.733235,40.418312],[116.741139,40.414631],[116.728801,40.40982],[116.724389,40.409191],[116.723427,40.405316],[116.718512,40.402055],[116.713242,40.40157],[116.713849,40.395806],[116.711716,40.386908],[116.716254,40.384114],[116.707115,40.377007],[116.706509,40.373809],[116.714079,40.368608],[116.719872,40.369044],[116.718094,40.361338],[116.726773,40.361193],[116.725769,40.355619],[116.729031,40.355619],[116.727484,40.346522],[116.723887,40.344033],[116.722967,40.339152],[116.731185,40.339023],[116.73129,40.335031],[116.744046,40.339136],[116.744653,40.333706],[116.751491,40.335742],[116.758559,40.333884],[116.759689,40.326853],[116.762846,40.326707],[116.768639,40.317816],[116.773324,40.315973],[116.762888,40.310428],[116.756845,40.302586],[116.754461,40.303686],[116.738965,40.284101],[116.738421,40.284392],[116.710837,40.256227],[116.704668,40.257101],[116.704585,40.251551],[116.696554,40.248072],[116.697265,40.243216],[116.69072,40.240886],[116.684007,40.234282],[116.678131,40.234379],[116.676311,40.238604],[116.670247,40.234865],[116.668783,40.238539],[116.673321,40.246777],[116.669494,40.253153],[116.666901,40.262085],[116.648519,40.260143],[116.643081,40.25715],[116.641492,40.259463],[116.637038,40.25846],[116.63526,40.261454],[116.623654,40.26058],[116.6238,40.252667],[116.622044,40.250467],[116.61324,40.251761],[116.603787,40.251324],[116.604624,40.256146],[116.600755,40.258978],[116.599647,40.265385],[116.590842,40.264139],[116.588396,40.269462],[116.585238,40.266226],[116.58254,40.268362],[116.570202,40.268863],[116.570516,40.273102],[116.565371,40.273377],[116.566187,40.27802],[116.552176,40.27383],[116.546236,40.276224],[116.540904,40.274946],[116.53693,40.277178],[116.540088,40.267165],[116.535717,40.261373],[116.526181,40.261324],[116.523965,40.257522],[116.509201,40.258056],[116.505959,40.261356],[116.501839,40.262974],[116.493245,40.262489],[116.484273,40.267634],[116.484001,40.2759],[116.478794,40.280025],[116.472081,40.280122],[116.469634,40.283001],[116.460308,40.28711],[116.45533,40.284845],[116.449412,40.286722],[116.45096,40.293045],[116.448011,40.300484],[116.443766,40.302457],[116.44822,40.305982],[116.455184,40.316345],[116.449182,40.32113],[116.443745,40.322682],[116.438245,40.333221],[116.43423,40.329116],[116.427914,40.329213],[116.424359,40.331265],[116.417061,40.329843],[116.408989,40.333205],[116.408633,40.334886],[116.396358,40.334853],[116.391422,40.338393],[116.384563,40.339055],[116.375069,40.337375],[116.376135,40.334352],[116.365909,40.331702],[116.368231,40.334805],[116.369903,40.342401],[116.364508,40.349107],[116.367101,40.350351],[116.369673,40.356362],[116.363923,40.359028],[116.355641,40.356814],[116.348866,40.356427],[116.352797,40.364391],[116.357356,40.364084],[116.360033,40.366815],[116.355369,40.37137],[116.34506,40.373163],[116.337364,40.379769],[116.32398,40.387295],[116.32078,40.386859],[116.313106,40.389459],[116.302691,40.387473],[116.295581,40.384437],[116.293762,40.392415],[116.289872,40.391672]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110117,\"name\":\"平谷区\",\"center\":[117.112335,40.144783],\"centroid\":[117.145392,40.208997],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":13,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.961932,40.051358],[116.962288,40.063529],[116.970652,40.063805],[116.973476,40.066304],[116.978599,40.064893],[116.980816,40.071188],[116.982844,40.070685],[116.986274,40.078359],[116.981192,40.08149],[116.981862,40.089828],[116.979938,40.093867],[116.975462,40.095051],[116.967976,40.101214],[116.973329,40.103712],[116.976069,40.111188],[116.971301,40.114009],[116.969189,40.118776],[116.971594,40.124224],[116.96578,40.127823],[116.967829,40.129849],[116.970025,40.140321],[116.977763,40.151374],[116.972054,40.156301],[116.968749,40.163495],[116.961242,40.171937],[116.962037,40.175549],[116.951371,40.174788],[116.945349,40.1813],[116.945809,40.186224],[116.94997,40.186354],[116.945913,40.193141],[116.939556,40.192347],[116.930898,40.207084],[116.929685,40.211585],[116.938029,40.210549],[116.940978,40.223922],[116.935206,40.229847],[116.936837,40.232259],[116.945641,40.233441],[116.946896,40.236095],[116.953567,40.236079],[116.956286,40.232615],[116.959924,40.23268],[116.974082,40.24456],[116.975881,40.249463],[116.969293,40.253962],[116.961786,40.252635],[116.954341,40.25715],[116.950953,40.261081],[116.960468,40.2704],[116.961995,40.273442],[116.970527,40.276531],[116.971343,40.281724],[116.983765,40.287886],[116.991042,40.287724],[116.990833,40.290603],[116.99834,40.29083],[117.004091,40.293918],[117.002,40.299675],[117.011306,40.307113],[117.007563,40.314599],[117.006998,40.319255],[117.01024,40.320726],[117.012686,40.32674],[117.020842,40.336179],[117.026133,40.338458],[117.032762,40.33752],[117.039266,40.340057],[117.048279,40.341528],[117.052817,40.337649],[117.060931,40.337795],[117.066933,40.342983],[117.072286,40.342999],[117.072705,40.345584],[117.085231,40.350432],[117.0946,40.358285],[117.100915,40.360546],[117.117457,40.353744],[117.125362,40.35641],[117.128122,40.358866],[117.142385,40.362824],[117.147466,40.369965],[117.155329,40.371402],[117.157609,40.374859],[117.16796,40.371467],[117.170491,40.374342],[117.179943,40.375021],[117.185799,40.377767],[117.199747,40.375861],[117.204536,40.373082],[117.211124,40.373825],[117.218527,40.377718],[117.223901,40.375538],[117.22618,40.369044],[117.237055,40.370627],[117.242283,40.369981],[117.247762,40.364101],[117.250188,40.358381],[117.254182,40.357105],[117.25437,40.351191],[117.257089,40.341463],[117.261125,40.338781],[117.259828,40.336195],[117.267127,40.335694],[117.274969,40.331944],[117.271288,40.325285],[117.271853,40.319853],[117.274697,40.314405],[117.274342,40.308552],[117.285739,40.302214],[117.293309,40.296748],[117.294647,40.290894],[117.292368,40.286236],[117.29632,40.2781],[117.304309,40.278181],[117.316835,40.281999],[117.316794,40.285104],[117.32336,40.284441],[117.331244,40.289665],[117.334005,40.285654],[117.337999,40.265903],[117.337622,40.263266],[117.342202,40.256502],[117.339881,40.246194],[117.343457,40.242909],[117.345464,40.234946],[117.348246,40.234574],[117.351613,40.229459],[117.355691,40.229556],[117.36027,40.23255],[117.373989,40.232777],[117.386829,40.227111],[117.390029,40.227969],[117.39373,40.221656],[117.377586,40.218612],[117.378443,40.21029],[117.385679,40.207894],[117.393145,40.203376],[117.379552,40.201319],[117.381455,40.194906],[117.384382,40.195278],[117.38409,40.187828],[117.388356,40.188249],[117.397704,40.192914],[117.4077,40.187504],[117.404751,40.183244],[117.401217,40.183617],[117.391618,40.177607],[117.393186,40.174901],[117.380597,40.17691],[117.381225,40.172455],[117.377021,40.176327],[117.372023,40.176538],[117.368844,40.17299],[117.364014,40.176683],[117.359413,40.173346],[117.353746,40.17367],[117.351111,40.171661],[117.357343,40.164273],[117.360626,40.156965],[117.351717,40.150564],[117.355272,40.148587],[117.350525,40.144827],[117.356883,40.145037],[117.35636,40.140904],[117.351404,40.139932],[117.349082,40.136528],[117.330617,40.133691],[117.33093,40.13575],[117.323276,40.14071],[117.318571,40.138522],[117.313761,40.139964],[117.307613,40.136982],[117.302991,40.125926],[117.297073,40.121273],[117.297094,40.118857],[117.285425,40.121322],[117.275659,40.113636],[117.276663,40.109307],[117.274362,40.105804],[117.269908,40.107198],[117.266834,40.112177],[117.260393,40.114155],[117.255541,40.113279],[117.249268,40.116474],[117.245357,40.113215],[117.238226,40.111755],[117.236009,40.108382],[117.229025,40.103533],[117.228606,40.100257],[117.224403,40.098619],[117.224487,40.094662],[117.211249,40.096608],[117.21104,40.090785],[117.213989,40.086243],[117.204285,40.079657],[117.203616,40.076704],[117.208175,40.076834],[117.205247,40.07028],[117.197572,40.067748],[117.198576,40.070101],[117.191842,40.072973],[117.189207,40.082853],[117.18538,40.083875],[117.181533,40.080095],[117.186426,40.076202],[117.183603,40.072081],[117.175593,40.071642],[117.172227,40.074157],[117.158466,40.077435],[117.160139,40.075553],[117.15625,40.069338],[117.139227,40.064049],[117.128896,40.06546],[117.119507,40.072421],[117.107775,40.071805],[117.103927,40.075585],[117.085608,40.075131],[117.085064,40.068592],[117.080986,40.065087],[117.081049,40.068819],[117.069652,40.06757],[117.070634,40.064179],[117.064382,40.062783],[117.061182,40.060105],[117.052022,40.059375],[117.053382,40.052884],[117.051437,40.051163],[117.038639,40.049378],[117.033159,40.04235],[117.027032,40.038828],[117.028517,40.033957],[117.023916,40.033746],[117.024836,40.03011],[117.020884,40.032448],[117.018061,40.030467],[117.011369,40.031246],[117.000683,40.029915],[117.00016,40.032253],[116.991837,40.036896],[116.985626,40.038828],[116.972095,40.036977],[116.969293,40.048583],[116.964902,40.047836],[116.961932,40.051358]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110118,\"name\":\"密云区\",\"center\":[116.843352,40.377362],\"centroid\":[116.994846,40.526834],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":14,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.886961,40.801076],[116.889073,40.798348],[116.896686,40.796438],[116.89495,40.790675],[116.895013,40.781733],[116.898589,40.77674],[116.904569,40.777286],[116.923391,40.773722],[116.923181,40.766897],[116.927908,40.757824],[116.923516,40.750596],[116.926548,40.744894],[116.940706,40.739786],[116.942714,40.729857],[116.946645,40.726916],[116.960134,40.721083],[116.96647,40.71525],[116.965111,40.709593],[116.969628,40.706362],[116.977533,40.705559],[116.979938,40.702826],[116.988177,40.703164],[116.990456,40.701203],[117.002481,40.697345],[117.005513,40.694853],[117.013418,40.694082],[117.018291,40.696011],[117.027848,40.694355],[117.031047,40.692136],[117.035585,40.694467],[117.036108,40.697265],[117.044494,40.700367],[117.054887,40.699804],[117.058338,40.70154],[117.076804,40.700029],[117.081153,40.702617],[117.086047,40.702055],[117.095144,40.705559],[117.110661,40.708243],[117.117792,40.700078],[117.128792,40.700913],[117.132493,40.698663],[117.142531,40.6972],[117.147571,40.698968],[117.159491,40.696332],[117.16474,40.699628],[117.169236,40.699097],[117.176639,40.693567],[117.180947,40.694082],[117.182453,40.697072],[117.193996,40.696268],[117.197802,40.694291],[117.202361,40.695577],[117.208405,40.694435],[117.210622,40.691976],[117.217335,40.69196],[117.218715,40.689484],[117.233207,40.683583],[117.234336,40.680577],[117.241635,40.676669],[117.256775,40.679467],[117.261397,40.681155],[117.267754,40.676669],[117.273401,40.670076],[117.278629,40.667551],[117.278608,40.664463],[117.290423,40.660185],[117.321164,40.658287],[117.331851,40.661504],[117.337622,40.664447],[117.336681,40.666956],[117.342411,40.673437],[117.359748,40.673919],[117.37058,40.679708],[117.378192,40.678808],[117.386996,40.684178],[117.397223,40.683776],[117.409226,40.687281],[117.414852,40.685947],[117.419348,40.68696],[117.426437,40.685304],[117.432711,40.681622],[117.437332,40.683599],[117.442226,40.676605],[117.453958,40.677618],[117.465188,40.673534],[117.471503,40.674338],[117.482399,40.679033],[117.484741,40.677087],[117.493357,40.67527],[117.502934,40.669674],[117.514583,40.660523],[117.513913,40.656196],[117.50283,40.653076],[117.505026,40.646142],[117.501972,40.644518],[117.500425,40.6362],[117.489948,40.636023],[117.486163,40.633496],[117.477986,40.635331],[117.475539,40.644421],[117.473093,40.644453],[117.467885,40.649521],[117.464309,40.648652],[117.462009,40.653076],[117.449106,40.651596],[117.456467,40.649167],[117.451448,40.646577],[117.45402,40.642844],[117.448876,40.62838],[117.442289,40.627977],[117.438002,40.625692],[117.431561,40.625596],[117.42857,40.631887],[117.428884,40.637632],[117.421188,40.635427],[117.42054,40.629232],[117.424701,40.621862],[117.422987,40.618305],[117.41918,40.617114],[117.412739,40.605123],[117.414747,40.600728],[117.421753,40.593178],[117.420623,40.590875],[117.423217,40.58144],[117.429804,40.579298],[117.429992,40.576126],[117.42123,40.569104],[117.413471,40.569893],[117.40358,40.574257],[117.400589,40.569345],[117.39465,40.567912],[117.389297,40.561244],[117.378422,40.56337],[117.375453,40.567799],[117.369221,40.57036],[117.365917,40.575965],[117.353014,40.578831],[117.350023,40.582197],[117.342767,40.581585],[117.334611,40.576464],[117.328442,40.575948],[117.325451,40.578155],[117.311837,40.578026],[117.299562,40.566801],[117.285592,40.565061],[117.279256,40.560342],[117.273191,40.561501],[117.268507,40.559842],[117.25964,40.552867],[117.24954,40.548179],[117.250606,40.542024],[117.247427,40.540236],[117.252007,40.53632],[117.255123,40.527973],[117.26146,40.51906],[117.264115,40.517271],[117.263133,40.513145],[117.255562,40.514934],[117.246821,40.511968],[117.239543,40.516723],[117.230405,40.511162],[117.219969,40.514321],[117.215013,40.513273],[117.212504,40.507906],[117.214449,40.506922],[117.208572,40.501102],[117.208426,40.498071],[117.212065,40.494685],[117.21792,40.494589],[117.22846,40.481301],[117.225783,40.47585],[117.230907,40.470463],[117.237243,40.468785],[117.233207,40.463204],[117.236532,40.456558],[117.243308,40.455428],[117.252154,40.450459],[117.252635,40.446038],[117.263342,40.442375],[117.257654,40.435372],[117.246737,40.426883],[117.243872,40.422848],[117.234085,40.417149],[117.237515,40.407786],[117.236616,40.400844],[117.240484,40.39763],[117.240694,40.394417],[117.23695,40.394078],[117.235382,40.389556],[117.229045,40.386843],[117.226661,40.378558],[117.223901,40.375538],[117.218527,40.377718],[117.211124,40.373825],[117.204536,40.373082],[117.199747,40.375861],[117.185799,40.377767],[117.179943,40.375021],[117.170491,40.374342],[117.16796,40.371467],[117.157609,40.374859],[117.155329,40.371402],[117.147466,40.369965],[117.142385,40.362824],[117.128122,40.358866],[117.125362,40.35641],[117.117457,40.353744],[117.100915,40.360546],[117.0946,40.358285],[117.085231,40.350432],[117.072705,40.345584],[117.072286,40.342999],[117.066933,40.342983],[117.060931,40.337795],[117.052817,40.337649],[117.048279,40.341528],[117.039266,40.340057],[117.032762,40.33752],[117.026133,40.338458],[117.020842,40.336179],[117.012686,40.32674],[117.01024,40.320726],[117.006998,40.319255],[117.007563,40.314599],[117.011306,40.307113],[117.002,40.299675],[117.004091,40.293918],[116.99834,40.29083],[116.990833,40.290603],[116.991042,40.287724],[116.983765,40.287886],[116.971343,40.281724],[116.970527,40.276531],[116.961995,40.273442],[116.960468,40.2704],[116.950953,40.261081],[116.954341,40.25715],[116.961786,40.252635],[116.969293,40.253962],[116.975881,40.249463],[116.974082,40.24456],[116.959924,40.23268],[116.956286,40.232615],[116.953567,40.236079],[116.946896,40.236095],[116.945641,40.233441],[116.936837,40.232259],[116.935206,40.229847],[116.931065,40.230624],[116.92544,40.225768],[116.922031,40.220134],[116.915507,40.222271],[116.913917,40.220118],[116.908606,40.222401],[116.906598,40.228682],[116.900701,40.228763],[116.893946,40.233457],[116.901746,40.23684],[116.894343,40.240028],[116.892252,40.245709],[116.886585,40.251907],[116.886104,40.255256],[116.881273,40.259221],[116.879893,40.264139],[116.874247,40.268281],[116.876338,40.274348],[116.871737,40.281481],[116.871319,40.290943],[116.859462,40.290878],[116.857182,40.2929],[116.854547,40.303152],[116.848984,40.311204],[116.838382,40.310185],[116.828992,40.304413],[116.830101,40.299206],[116.827215,40.298333],[116.82458,40.290991],[116.825123,40.285347],[116.811823,40.282387],[116.809607,40.28601],[116.800572,40.289196],[116.794487,40.287417],[116.788025,40.289439],[116.787795,40.281449],[116.784073,40.279443],[116.782964,40.273248],[116.773512,40.269527],[116.771651,40.266501],[116.768597,40.270109],[116.762658,40.269058],[116.752788,40.275512],[116.74298,40.279087],[116.738337,40.278764],[116.741098,40.283001],[116.738965,40.284101],[116.754461,40.303686],[116.756845,40.302586],[116.762888,40.310428],[116.773324,40.315973],[116.768639,40.317816],[116.762846,40.326707],[116.759689,40.326853],[116.758559,40.333884],[116.751491,40.335742],[116.744653,40.333706],[116.744046,40.339136],[116.73129,40.335031],[116.731185,40.339023],[116.722967,40.339152],[116.723887,40.344033],[116.727484,40.346522],[116.729031,40.355619],[116.725769,40.355619],[116.726773,40.361193],[116.718094,40.361338],[116.719872,40.369044],[116.714079,40.368608],[116.706509,40.373809],[116.707115,40.377007],[116.716254,40.384114],[116.711716,40.386908],[116.713849,40.395806],[116.713242,40.40157],[116.718512,40.402055],[116.723427,40.405316],[116.724389,40.409191],[116.728801,40.40982],[116.741139,40.414631],[116.733235,40.418312],[116.73244,40.420604],[116.72556,40.418053],[116.722339,40.423832],[116.723552,40.435065],[116.716421,40.441714],[116.72098,40.440988],[116.725811,40.443085],[116.719265,40.448636],[116.7196,40.455735],[116.723594,40.458542],[116.719223,40.460397],[116.716902,40.457074],[116.706174,40.459929],[116.698667,40.468043],[116.695571,40.466721],[116.693397,40.476108],[116.69348,40.481704],[116.704334,40.479043],[116.694149,40.485462],[116.693376,40.490783],[116.698353,40.493266],[116.699106,40.50444],[116.701071,40.510549],[116.711402,40.516465],[116.712239,40.522058],[116.717216,40.524798],[116.712573,40.529955],[116.706948,40.532582],[116.701469,40.539913],[116.702138,40.545456],[116.690699,40.549468],[116.68225,40.548904],[116.67698,40.554462],[116.665771,40.552432],[116.66872,40.557507],[116.682397,40.556766],[116.679636,40.562001],[116.686349,40.564497],[116.699336,40.563563],[116.709855,40.565512],[116.710503,40.568685],[116.71456,40.570682],[116.714351,40.58028],[116.708955,40.590054],[116.711611,40.59189],[116.708495,40.595206],[116.711235,40.600213],[116.705609,40.60303],[116.707993,40.606507],[116.70655,40.610998],[116.702598,40.612785],[116.697955,40.618402],[116.701322,40.621379],[116.704689,40.620076],[116.705128,40.626947],[116.70195,40.628444],[116.70149,40.632917],[116.712197,40.641268],[116.711151,40.648218],[116.712636,40.653896],[116.709855,40.662598],[116.714309,40.666104],[116.713221,40.669867],[116.714915,40.680014],[116.725413,40.68466],[116.725581,40.689114],[116.735807,40.69167],[116.74252,40.69593],[116.747518,40.697072],[116.748668,40.700544],[116.754963,40.702891],[116.756155,40.705687],[116.762867,40.706427],[116.769246,40.70281],[116.783989,40.700496],[116.787105,40.704482],[116.786687,40.7103],[116.789091,40.712454],[116.790472,40.728973],[116.786352,40.736026],[116.782818,40.747817],[116.780727,40.751512],[116.783759,40.757631],[116.793629,40.748267],[116.802977,40.745986],[116.810527,40.749118],[116.818662,40.75042],[116.826211,40.749343],[116.831795,40.751303],[116.840076,40.760682],[116.834785,40.770221],[116.850448,40.775006],[116.851264,40.778924],[116.856806,40.77955],[116.858039,40.78305],[116.867471,40.784559],[116.862577,40.792858],[116.871277,40.794785],[116.873326,40.798781],[116.878575,40.797545],[116.886961,40.801076]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110119,\"name\":\"延庆区\",\"center\":[115.985006,40.465325],\"centroid\":[116.16401,40.540016],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":15,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.967006,40.265612],[115.961611,40.269219],[115.960231,40.274914],[115.955212,40.276984],[115.951698,40.282015],[115.950088,40.289228],[115.946115,40.289034],[115.945885,40.296199],[115.939757,40.304397],[115.943814,40.310945],[115.937185,40.313047],[115.935721,40.316717],[115.929239,40.32105],[115.926792,40.319611],[115.922672,40.325899],[115.92721,40.329601],[115.922881,40.332898],[115.921417,40.338668],[115.924094,40.341059],[115.920581,40.346473],[115.918301,40.35389],[115.909539,40.357622],[115.892997,40.355554],[115.890927,40.357897],[115.88526,40.357024],[115.883169,40.359545],[115.878066,40.359367],[115.876226,40.362146],[115.872754,40.359593],[115.864452,40.359335],[115.861901,40.363422],[115.861859,40.373422],[115.855962,40.37712],[115.846865,40.375085],[115.840633,40.381094],[115.837454,40.381255],[115.836555,40.38568],[115.796445,40.426834],[115.796884,40.432531],[115.78992,40.432483],[115.786679,40.437066],[115.77043,40.444166],[115.773546,40.44812],[115.77248,40.452831],[115.77547,40.45204],[115.7734,40.457397],[115.779527,40.464075],[115.772856,40.462301],[115.770367,40.46493],[115.771559,40.47285],[115.776683,40.477511],[115.776202,40.482704],[115.782204,40.492073],[115.774529,40.493911],[115.768088,40.498345],[115.744039,40.498249],[115.743077,40.494959],[115.73605,40.503988],[115.743098,40.513854],[115.743788,40.518464],[115.748702,40.526087],[115.755624,40.531019],[115.752968,40.536288],[115.75506,40.540042],[115.759577,40.538914],[115.763885,40.540574],[115.770179,40.548002],[115.773902,40.548582],[115.776327,40.552158],[115.784713,40.558376],[115.7922,40.561292],[115.79908,40.5577],[115.804915,40.55865],[115.815036,40.55741],[115.819804,40.559343],[115.82154,40.563305],[115.820662,40.568234],[115.827374,40.587027],[115.846175,40.593049],[115.854895,40.590151],[115.86623,40.593371],[115.867777,40.595786],[115.885406,40.595223],[115.888146,40.597026],[115.894733,40.606878],[115.897849,40.608101],[115.907803,40.617291],[115.920372,40.616632],[115.928297,40.612753],[115.935031,40.613316],[115.944672,40.611095],[115.948331,40.608809],[115.955107,40.609534],[115.967404,40.605896],[115.965877,40.601002],[115.971983,40.60237],[115.97512,40.590779],[115.982147,40.579008],[115.995238,40.579862],[115.996116,40.58392],[116.005109,40.584097],[116.025268,40.60654],[116.028509,40.607328],[116.030036,40.597364],[116.032357,40.599875],[116.04457,40.602032],[116.050907,40.606121],[116.058289,40.607006],[116.062722,40.610322],[116.069811,40.610258],[116.073492,40.612125],[116.076691,40.619883],[116.08583,40.623825],[116.088507,40.626626],[116.098879,40.630584],[116.1044,40.626996],[116.118349,40.627961],[116.122071,40.629989],[116.120419,40.633287],[116.112744,40.640946],[116.111531,40.646287],[116.113225,40.648845],[116.125229,40.654089],[116.13694,40.667648],[116.142858,40.666972],[116.151432,40.663338],[116.162683,40.662437],[116.167597,40.672633],[116.168413,40.67892],[116.171487,40.68167],[116.173683,40.689034],[116.171341,40.695979],[116.176213,40.700544],[116.177907,40.707889],[116.181128,40.712438],[116.184913,40.713675],[116.192274,40.724779],[116.197753,40.7269],[116.2057,40.733038],[116.204717,40.739946],[116.210551,40.741713],[116.213249,40.740139],[116.220359,40.744669],[116.220485,40.749183],[116.223308,40.753793],[116.23366,40.759896],[116.229979,40.762417],[116.231757,40.77149],[116.235625,40.775135],[116.235019,40.78313],[116.245224,40.78838],[116.247943,40.791831],[116.257834,40.787898],[116.261013,40.782938],[116.269587,40.777158],[116.26988,40.770703],[116.274167,40.766335],[116.273456,40.762883],[116.277366,40.76163],[116.281402,40.763926],[116.290918,40.763814],[116.29786,40.756812],[116.304762,40.755656],[116.30794,40.752122],[116.311119,40.75511],[116.30794,40.763734],[116.313168,40.770205],[116.31756,40.77218],[116.330149,40.77377],[116.33314,40.772694],[116.342947,40.773096],[116.353111,40.770221],[116.361204,40.772646],[116.367687,40.77088],[116.37097,40.772453],[116.379837,40.772325],[116.392635,40.778394],[116.403217,40.778635],[116.407838,40.780417],[116.4143,40.777912],[116.416496,40.76937],[116.424861,40.767443],[116.431846,40.768246],[116.437722,40.766865],[116.444414,40.76921],[116.45395,40.76587],[116.465452,40.772742],[116.471517,40.771233],[116.4803,40.771586],[116.485193,40.765179],[116.491404,40.7633],[116.495482,40.759735],[116.50025,40.760811],[116.502906,40.756635],[116.501819,40.746581],[116.506461,40.743432],[116.513697,40.741456],[116.509493,40.73548],[116.510748,40.72645],[116.506858,40.720039],[116.504119,40.720135],[116.503115,40.715893],[116.506064,40.710879],[116.501923,40.706796],[116.501066,40.70228],[116.502676,40.697361],[116.496653,40.696879],[116.488811,40.69196],[116.483374,40.679403],[116.487138,40.674338],[116.492826,40.673984],[116.501568,40.671186],[116.505938,40.673067],[116.513488,40.672344],[116.517273,40.665734],[116.520096,40.66411],[116.518381,40.660925],[116.527039,40.6584],[116.529507,40.654588],[116.540046,40.656679],[116.544103,40.653767],[116.545023,40.650116],[116.550335,40.647606],[116.551151,40.642828],[116.55389,40.642877],[116.563886,40.636908],[116.573903,40.63628],[116.574092,40.631678],[116.568989,40.625483],[116.561231,40.628557],[116.551674,40.625209],[116.545003,40.627076],[116.539294,40.625612],[116.538938,40.619673],[116.535634,40.615698],[116.532915,40.606459],[116.535948,40.59944],[116.530929,40.595883],[116.531577,40.59131],[116.525136,40.583002],[116.517796,40.579749],[116.513153,40.572792],[116.509577,40.57276],[116.505144,40.562581],[116.499999,40.560921],[116.496277,40.555106],[116.484587,40.552867],[116.479651,40.541396],[116.470617,40.535418],[116.467125,40.530068],[116.460956,40.524363],[116.46587,40.518802],[116.470345,40.518963],[116.476306,40.514192],[116.488581,40.515853],[116.492073,40.518093],[116.497762,40.518093],[116.500459,40.510904],[116.506398,40.508212],[116.51194,40.501135],[116.519155,40.496604],[116.519092,40.491799],[116.511543,40.486929],[116.508322,40.483172],[116.492157,40.481027],[116.487347,40.481737],[116.483541,40.484994],[116.468212,40.48493],[116.465577,40.48701],[116.457903,40.488445],[116.455937,40.480914],[116.443201,40.481801],[116.433142,40.478189],[116.420971,40.480301],[116.416664,40.483011],[116.413673,40.481527],[116.4065,40.481995],[116.393702,40.47256],[116.38609,40.475802],[116.387344,40.482043],[116.376825,40.485736],[116.378603,40.491525],[116.377537,40.49683],[116.369632,40.500312],[116.365909,40.499635],[116.357042,40.501941],[116.348636,40.499071],[116.34232,40.500457],[116.336653,40.498636],[116.330567,40.500748],[116.323227,40.500151],[116.31321,40.491799],[116.31022,40.491702],[116.303779,40.485817],[116.29717,40.486768],[116.291691,40.485317],[116.294786,40.47535],[116.301646,40.468108],[116.306853,40.466092],[116.300955,40.458429],[116.293824,40.452831],[116.294368,40.449975],[116.289788,40.440907],[116.290667,40.435856],[116.294452,40.429304],[116.296648,40.420701],[116.291942,40.416617],[116.289433,40.418021],[116.288513,40.413437],[116.291608,40.408448],[116.287864,40.404719],[116.289746,40.402539],[116.286003,40.396032],[116.289872,40.391672],[116.290729,40.383177],[116.282845,40.375263],[116.270863,40.382693],[116.261264,40.380561],[116.258336,40.383193],[116.25338,40.381239],[116.252104,40.376297],[116.247796,40.374471],[116.24353,40.379818],[116.241962,40.377508],[116.23665,40.377427],[116.23184,40.374988],[116.226989,40.38111],[116.222221,40.382111],[116.211451,40.381756],[116.209129,40.376232],[116.192985,40.372775],[116.180354,40.367687],[116.177154,40.370934],[116.170713,40.369351],[116.168789,40.366718],[116.159295,40.366265],[116.148233,40.361807],[116.148651,40.35696],[116.145514,40.351046],[116.1507,40.349252],[116.155677,40.344906],[116.152603,40.337714],[116.144719,40.336631],[116.147543,40.340655],[116.144782,40.348541],[116.138404,40.345229],[116.140809,40.343047],[116.137567,40.340769],[116.137651,40.336534],[116.143904,40.336082],[116.13809,40.330974],[116.138383,40.324671],[116.141959,40.316879],[116.132737,40.31198],[116.122385,40.312805],[116.116237,40.321955],[116.116634,40.323668],[116.110381,40.330813],[116.102978,40.331524],[116.098649,40.330005],[116.086353,40.330813],[116.083342,40.33571],[116.077716,40.339346],[116.073429,40.339831],[116.06841,40.336971],[116.061802,40.336809],[116.053353,40.326853],[116.056971,40.322181],[116.051116,40.315812],[116.042479,40.316846],[116.040095,40.312724],[116.031144,40.312352],[116.026167,40.320484],[116.026481,40.324283],[116.01684,40.33466],[116.007597,40.33314],[115.999065,40.325463],[115.993398,40.328986],[115.982711,40.324202],[115.979658,40.320532],[115.973259,40.318997],[115.976417,40.311511],[115.975538,40.308698],[115.987919,40.303799],[115.990323,40.299498],[115.982732,40.297977],[115.978675,40.289633],[115.981227,40.28525],[115.978822,40.281627],[115.981812,40.276903],[115.976396,40.270983],[115.967006,40.265612]]]]}}]}', 'admin', '2020-12-10 10:26:00', NULL, '2020-12-10 10:26:00', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1338695077400154114', '无锡市', 'wuxi', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":320205,\"name\":\"锡山区\",\"center\":[120.357298,31.585559],\"centroid\":[120.482864,31.624824],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":0,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.581713,31.727632],[120.582451,31.721169],[120.58458,31.71792],[120.58509,31.714432],[120.589848,31.714115],[120.590836,31.712997],[120.596788,31.710822],[120.599079,31.710716],[120.600806,31.708849],[120.600231,31.706876],[120.595734,31.705608],[120.592802,31.700817],[120.587024,31.696166],[120.584917,31.69281],[120.578118,31.6937],[120.578367,31.689947],[120.575587,31.691824],[120.576836,31.689463],[120.572405,31.689692],[120.570059,31.688908],[120.568049,31.685199],[120.566235,31.685393],[120.566094,31.683112],[120.562858,31.680513],[120.564161,31.67891],[120.566626,31.678672],[120.566377,31.676143],[120.568766,31.668593],[120.568625,31.665174],[120.566789,31.659931],[120.558589,31.658504],[120.561066,31.655693],[120.571731,31.655781],[120.583429,31.651957],[120.586643,31.651816],[120.592128,31.650282],[120.595854,31.643761],[120.589587,31.636525],[120.595571,31.631395],[120.592107,31.62504],[120.6006,31.617115],[120.596266,31.613298],[120.591488,31.611499],[120.584482,31.613439],[120.577086,31.614162],[120.570026,31.609445],[120.567126,31.609172],[120.568343,31.606183],[120.566464,31.601933],[120.557058,31.600302],[120.553104,31.60561],[120.546251,31.604693],[120.54309,31.601739],[120.545078,31.585717],[120.547782,31.583283],[120.546848,31.579685],[120.548,31.576599],[120.550215,31.575011],[120.553072,31.575082],[120.563629,31.579597],[120.568256,31.576299],[120.573035,31.577472],[120.567419,31.583998],[120.570428,31.585665],[120.573838,31.585947],[120.584254,31.585144],[120.587045,31.583389],[120.594572,31.576008],[120.595962,31.571492],[120.597548,31.563862],[120.599264,31.54846],[120.60502,31.546078],[120.602805,31.541182],[120.602913,31.53827],[120.605118,31.535685],[120.60426,31.530867],[120.605759,31.525247],[120.602349,31.51899],[120.600035,31.51861],[120.598569,31.516166],[120.595636,31.517145],[120.593986,31.525502],[120.592758,31.52755],[120.589826,31.526967],[120.585775,31.524532],[120.576923,31.517498],[120.568549,31.512371],[120.559849,31.508964],[120.555201,31.507579],[120.551616,31.500632],[120.548499,31.497402],[120.548043,31.495089],[120.549086,31.489175],[120.553007,31.486738],[120.555244,31.480294],[120.555233,31.477866],[120.553441,31.477027],[120.551236,31.48213],[120.552062,31.483825],[120.547793,31.486244],[120.546197,31.487912],[120.542971,31.487612],[120.534999,31.487921],[120.533055,31.490675],[120.531024,31.495327],[120.528613,31.497887],[120.5253,31.499229],[120.525267,31.502583],[120.522389,31.504631],[120.519804,31.500888],[120.518295,31.501718],[120.519598,31.504604],[120.521118,31.504507],[120.521129,31.507402],[120.519196,31.508929],[120.518251,31.512759],[120.521542,31.512609],[120.523519,31.514524],[120.521455,31.515672],[120.52265,31.517869],[120.522606,31.521452],[120.528786,31.526588],[120.523888,31.529244],[120.518914,31.527453],[120.516959,31.529817],[120.513016,31.531547],[120.508096,31.534926],[120.506782,31.537476],[120.504544,31.538791],[120.505967,31.542099],[120.502774,31.544552],[120.504523,31.549493],[120.503295,31.552686],[120.498647,31.554697],[120.490707,31.557414],[120.486971,31.555941],[120.481334,31.554883],[120.481693,31.55954],[120.477033,31.558905],[120.47623,31.560511],[120.472819,31.561066],[120.473112,31.563986],[120.46614,31.564674],[120.466715,31.566791],[120.46085,31.565838],[120.457831,31.564171],[120.455116,31.568061],[120.45176,31.5665],[120.451477,31.568255],[120.448545,31.569631],[120.448968,31.571095],[120.444178,31.576475],[120.439237,31.574676],[120.434099,31.576466],[120.429288,31.577286],[120.422543,31.580823],[120.419404,31.581026],[120.415733,31.583425],[120.414267,31.580691],[120.399615,31.580197],[120.394522,31.57674],[120.394804,31.573635],[120.39374,31.573538],[120.39677,31.569516],[120.392588,31.567408],[120.388646,31.570919],[120.387321,31.573441],[120.385051,31.573776],[120.380435,31.575875],[120.37811,31.576025],[120.372028,31.573679],[120.369367,31.573397],[120.366913,31.57009],[120.362753,31.569031],[120.351881,31.568035],[120.348905,31.565847],[120.346135,31.569516],[120.348394,31.570857],[120.349557,31.574455],[120.345886,31.575858],[120.347135,31.581326],[120.34581,31.590876],[120.342334,31.598274],[120.340792,31.599958],[120.341096,31.60308],[120.349231,31.602762],[120.352848,31.603847],[120.352587,31.607479],[120.350013,31.610838],[120.340042,31.610486],[120.321741,31.613562],[120.31794,31.613792],[120.314432,31.612989],[120.314606,31.619072],[120.315779,31.632012],[120.317723,31.634551],[120.323903,31.636146],[120.329985,31.638737],[120.334123,31.637821],[120.334905,31.636199],[120.340683,31.635485],[120.343257,31.63664],[120.346668,31.636128],[120.345266,31.646017],[120.345288,31.65245],[120.357811,31.652714],[120.360461,31.655323],[120.362644,31.655349],[120.366326,31.653419],[120.368075,31.653499],[120.368716,31.655781],[120.374765,31.660962],[120.378751,31.665685],[120.382629,31.667377],[120.391176,31.674478],[120.390981,31.676689],[120.389373,31.677932],[120.383204,31.679491],[120.379349,31.682037],[120.378056,31.684407],[120.376981,31.690978],[120.3776,31.693383],[120.382857,31.694202],[120.384909,31.695171],[120.390307,31.699513],[120.394174,31.699231],[120.398106,31.697408],[120.399398,31.699998],[120.402982,31.699522],[120.411041,31.703538],[120.415375,31.704604],[120.41986,31.704498],[120.427376,31.70249],[120.430309,31.704604],[120.432948,31.705309],[120.44685,31.706084],[120.451173,31.707255],[120.452824,31.711456],[120.456701,31.710725],[120.458309,31.7132],[120.461339,31.714503],[120.46261,31.716132],[120.471907,31.712513],[120.485125,31.713728],[120.487297,31.715445],[120.491272,31.713719],[120.492163,31.711905],[120.491022,31.70965],[120.496312,31.710417],[120.498288,31.713402],[120.504827,31.713825],[120.507336,31.724119],[120.50853,31.724762],[120.518284,31.734896],[120.528504,31.725818],[120.535129,31.721653],[120.541755,31.723397],[120.546968,31.725977],[120.551953,31.726734],[120.562412,31.723062],[120.56806,31.722957],[120.576,31.726153],[120.580257,31.726329],[120.581713,31.727632]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320206,\"name\":\"惠山区\",\"center\":[120.303543,31.681019],\"centroid\":[120.210639,31.65177],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":1,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.074955,31.554424],[120.071827,31.554371],[120.069188,31.552492],[120.063899,31.555571],[120.058208,31.559523],[120.056155,31.563404],[120.05937,31.56904],[120.059457,31.57263],[120.055775,31.576669],[120.057067,31.5804],[120.061814,31.583072],[120.064692,31.586961],[120.068526,31.590127],[120.070622,31.590956],[120.07489,31.595364],[120.075585,31.607118],[120.084242,31.611808],[120.093962,31.618085],[120.10238,31.625877],[120.104476,31.628769],[120.116423,31.62995],[120.119486,31.630893],[120.121115,31.638147],[120.124482,31.648238],[120.125883,31.657843],[120.126024,31.673844],[120.126709,31.678725],[120.128533,31.684636],[120.143272,31.676073],[120.151037,31.682398],[120.151027,31.684829],[120.149365,31.686221],[120.143,31.688327],[120.143858,31.689965],[120.14527,31.697065],[120.147703,31.69821],[120.15359,31.699143],[120.153166,31.70212],[120.156837,31.703829],[120.155979,31.712601],[120.158912,31.713948],[120.159477,31.717206],[120.16141,31.718069],[120.158075,31.722393],[120.158108,31.725924],[120.155176,31.727086],[120.155979,31.729569],[120.157684,31.730696],[120.156131,31.737942],[120.154752,31.741429],[120.155968,31.742045],[120.156077,31.751509],[120.155241,31.752283],[120.155621,31.756843],[120.159998,31.759079],[120.169023,31.760962],[120.17239,31.75804],[120.178657,31.758401],[120.183121,31.753296],[120.183947,31.749915],[120.197056,31.752706],[120.201161,31.753269],[120.203779,31.740381],[120.202921,31.735372],[120.203942,31.728891],[120.206451,31.726065],[120.215357,31.724321],[120.220494,31.723969],[120.224991,31.724779],[120.228857,31.727306],[120.237361,31.728363],[120.248646,31.726928],[120.254446,31.724365],[120.256933,31.72013],[120.261104,31.721002],[120.264384,31.722692],[120.273714,31.724603],[120.276157,31.723168],[120.282435,31.70338],[120.283662,31.7019],[120.292558,31.69909],[120.298423,31.698932],[120.311336,31.700253],[120.319395,31.700746],[120.333862,31.698192],[120.336013,31.694396],[120.346624,31.691145],[120.349209,31.689128],[120.360135,31.687481],[120.366619,31.689137],[120.371322,31.691612],[120.3776,31.693383],[120.376981,31.690978],[120.378056,31.684407],[120.379349,31.682037],[120.383204,31.679491],[120.389373,31.677932],[120.390981,31.676689],[120.391176,31.674478],[120.382629,31.667377],[120.378751,31.665685],[120.374765,31.660962],[120.368716,31.655781],[120.368075,31.653499],[120.366326,31.653419],[120.362644,31.655349],[120.360461,31.655323],[120.357811,31.652714],[120.345288,31.65245],[120.345266,31.646017],[120.346668,31.636128],[120.343257,31.63664],[120.340683,31.635485],[120.334905,31.636199],[120.334123,31.637821],[120.329985,31.638737],[120.323903,31.636146],[120.317723,31.634551],[120.315779,31.632012],[120.314606,31.619072],[120.312553,31.618825],[120.305287,31.62288],[120.300258,31.624881],[120.290168,31.626538],[120.282935,31.626521],[120.283108,31.6292],[120.269728,31.630778],[120.266491,31.625578],[120.265481,31.621567],[120.262331,31.619583],[120.253012,31.626741],[120.248233,31.626627],[120.243878,31.625384],[120.246289,31.6208],[120.24516,31.618102],[120.241565,31.615969],[120.244106,31.608846],[120.246105,31.600523],[120.242531,31.59249],[120.240576,31.592331],[120.234787,31.594359],[120.228358,31.594553],[120.222156,31.592666],[120.215476,31.592578],[120.214043,31.590832],[120.220983,31.579562],[120.220266,31.576528],[120.217084,31.57681],[120.213684,31.574605],[120.197914,31.568634],[120.196947,31.566738],[120.199054,31.564974],[120.197371,31.561551],[120.194482,31.561269],[120.186336,31.565935],[120.184435,31.564991],[120.183697,31.560458],[120.181611,31.556991],[120.179157,31.555474],[120.176735,31.556585],[120.175323,31.561631],[120.173346,31.564118],[120.168144,31.5647],[120.165189,31.566844],[120.163061,31.573662],[120.16255,31.576987],[120.161551,31.59413],[120.153927,31.589501],[120.14956,31.587384],[120.135995,31.582146],[120.134018,31.582225],[120.132063,31.579227],[120.128913,31.577533],[120.122408,31.577128],[120.119301,31.575381],[120.118661,31.572859],[120.113762,31.572083],[120.111514,31.570733],[120.112882,31.568864],[120.102054,31.563545],[120.091562,31.559258],[120.085143,31.557194],[120.074955,31.554424]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320211,\"name\":\"滨湖区\",\"center\":[120.266053,31.550228],\"centroid\":[120.196866,31.446924],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":2,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.100153,31.335332],[120.100436,31.33939],[120.096145,31.352493],[120.093658,31.353138],[120.057252,31.356126],[120.044859,31.358805],[120.041905,31.361024],[120.040157,31.364498],[120.039711,31.378127],[120.044566,31.406228],[120.054786,31.434286],[120.060966,31.440424],[120.078757,31.450007],[120.087793,31.453416],[120.089987,31.45474],[120.091356,31.453186],[120.110069,31.461531],[120.105682,31.470493],[120.108733,31.480991],[120.111188,31.48514],[120.117607,31.493235],[120.123581,31.499202],[120.127501,31.501471],[120.129739,31.504701],[120.12319,31.511338],[120.12206,31.508479],[120.121984,31.505354],[120.118834,31.505504],[120.118378,31.51193],[120.120257,31.514983],[120.11626,31.516228],[120.117542,31.518037],[120.115771,31.519105],[120.111025,31.514039],[120.10743,31.511983],[120.102738,31.513545],[120.100501,31.516828],[120.103412,31.518557],[120.103955,31.521011],[120.10238,31.523146],[120.102358,31.527391],[120.103857,31.52815],[120.101587,31.529959],[120.102054,31.533523],[120.100729,31.533797],[120.10112,31.536841],[120.103151,31.538782],[120.101717,31.542002],[120.09948,31.542338],[120.096786,31.541138],[120.094169,31.541932],[120.095038,31.544173],[120.096732,31.543573],[120.099056,31.546299],[120.096949,31.547252],[120.097329,31.548743],[120.085339,31.550904],[120.082319,31.550286],[120.080191,31.55146],[120.081537,31.553418],[120.079561,31.555033],[120.074955,31.554424],[120.085143,31.557194],[120.091562,31.559258],[120.102054,31.563545],[120.112882,31.568864],[120.111514,31.570733],[120.113762,31.572083],[120.118661,31.572859],[120.119301,31.575381],[120.122408,31.577128],[120.128913,31.577533],[120.132063,31.579227],[120.134018,31.582225],[120.135995,31.582146],[120.14956,31.587384],[120.153927,31.589501],[120.161551,31.59413],[120.16255,31.576987],[120.163061,31.573662],[120.165189,31.566844],[120.168144,31.5647],[120.173346,31.564118],[120.175323,31.561631],[120.176735,31.556585],[120.179157,31.555474],[120.181611,31.556991],[120.183697,31.560458],[120.184435,31.564991],[120.186336,31.565935],[120.194482,31.561269],[120.197371,31.561551],[120.199054,31.564974],[120.196947,31.566738],[120.197914,31.568634],[120.213684,31.574605],[120.217084,31.57681],[120.220266,31.576528],[120.220983,31.579562],[120.214043,31.590832],[120.215476,31.592578],[120.222156,31.592666],[120.228358,31.594553],[120.234787,31.594359],[120.240576,31.592331],[120.242531,31.59249],[120.244454,31.587657],[120.250102,31.583045],[120.255489,31.580603],[120.25904,31.580259],[120.263189,31.578495],[120.269065,31.578856],[120.268011,31.580338],[120.271009,31.581229],[120.271954,31.579915],[120.27707,31.580497],[120.280643,31.577904],[120.279524,31.574755],[120.27985,31.570195],[120.283,31.565512],[120.289907,31.558191],[120.288267,31.554936],[120.285368,31.551451],[120.285096,31.549828],[120.287637,31.537626],[120.287855,31.535306],[120.291971,31.535262],[120.293046,31.532332],[120.297076,31.531432],[120.29675,31.528291],[120.295316,31.525847],[120.298227,31.523596],[120.303842,31.525114],[120.307937,31.524946],[120.310294,31.526605],[120.311532,31.521699],[120.310087,31.520269],[120.308241,31.520737],[120.307329,31.517401],[120.31126,31.514013],[120.313639,31.513227],[120.322121,31.513836],[120.323533,31.513077],[120.325695,31.516898],[120.330495,31.518805],[120.331679,31.522511],[120.334612,31.52657],[120.338055,31.529138],[120.347135,31.527338],[120.357453,31.518399],[120.362579,31.513439],[120.356269,31.509379],[120.351718,31.507879],[120.354031,31.500765],[120.354792,31.500879],[120.360429,31.491408],[120.359755,31.489907],[120.354998,31.488539],[120.357083,31.47384],[120.361221,31.471853],[120.359169,31.46795],[120.353293,31.461496],[120.355823,31.416459],[120.335546,31.407359],[120.308143,31.393266],[120.253121,31.366098],[120.209611,31.345668],[120.173715,31.30881],[120.110232,31.264001],[120.100153,31.335332]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320213,\"name\":\"梁溪区\",\"center\":[120.296595,31.575706],\"centroid\":[120.299797,31.580629],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":3,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.345886,31.575858],[120.342844,31.576228],[120.340346,31.575038],[120.336784,31.575187],[120.336762,31.573706],[120.334253,31.573812],[120.334156,31.576493],[120.332005,31.577992],[120.330593,31.576819],[120.332516,31.573873],[120.329844,31.574014],[120.330202,31.572427],[120.333015,31.571527],[120.333167,31.569746],[120.331332,31.568343],[120.326346,31.569349],[120.326879,31.570866],[120.329518,31.569657],[120.32967,31.574041],[120.327052,31.5742],[120.32702,31.575778],[120.323631,31.575461],[120.325673,31.573679],[120.323805,31.572321],[120.319189,31.578953],[120.321046,31.579553],[120.319015,31.581326],[120.317506,31.579624],[120.319091,31.577551],[120.316843,31.576475],[120.316571,31.578415],[120.315094,31.575919],[120.317017,31.574438],[120.313954,31.573891],[120.317332,31.572912],[120.317614,31.574755],[120.319656,31.573723],[120.31958,31.569993],[120.323718,31.569869],[120.320405,31.568687],[120.322491,31.567946],[120.323077,31.562248],[120.32122,31.559558],[120.323642,31.559911],[120.324391,31.556762],[120.334514,31.55677],[120.343073,31.545408],[120.33799,31.543652],[120.335502,31.538967],[120.346505,31.528573],[120.347135,31.527338],[120.338055,31.529138],[120.334612,31.52657],[120.331679,31.522511],[120.330495,31.518805],[120.325695,31.516898],[120.323533,31.513077],[120.322121,31.513836],[120.313639,31.513227],[120.31126,31.514013],[120.307329,31.517401],[120.308241,31.520737],[120.310087,31.520269],[120.311532,31.521699],[120.310294,31.526605],[120.307937,31.524946],[120.303842,31.525114],[120.298227,31.523596],[120.295316,31.525847],[120.29675,31.528291],[120.297076,31.531432],[120.293046,31.532332],[120.291971,31.535262],[120.287855,31.535306],[120.287637,31.537626],[120.285096,31.549828],[120.285368,31.551451],[120.288267,31.554936],[120.289907,31.558191],[120.283,31.565512],[120.27985,31.570195],[120.279524,31.574755],[120.280643,31.577904],[120.27707,31.580497],[120.271954,31.579915],[120.271009,31.581229],[120.268011,31.580338],[120.269065,31.578856],[120.263189,31.578495],[120.25904,31.580259],[120.255489,31.580603],[120.250102,31.583045],[120.244454,31.587657],[120.242531,31.59249],[120.246105,31.600523],[120.244106,31.608846],[120.241565,31.615969],[120.24516,31.618102],[120.246289,31.6208],[120.243878,31.625384],[120.248233,31.626627],[120.253012,31.626741],[120.262331,31.619583],[120.265481,31.621567],[120.266491,31.625578],[120.269728,31.630778],[120.283108,31.6292],[120.282935,31.626521],[120.290168,31.626538],[120.300258,31.624881],[120.305287,31.62288],[120.312553,31.618825],[120.314606,31.619072],[120.314432,31.612989],[120.31794,31.613792],[120.321741,31.613562],[120.340042,31.610486],[120.350013,31.610838],[120.352587,31.607479],[120.352848,31.603847],[120.349231,31.602762],[120.341096,31.60308],[120.340792,31.599958],[120.342334,31.598274],[120.34581,31.590876],[120.347135,31.581326],[120.345886,31.575858]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320214,\"name\":\"新吴区\",\"center\":[120.352782,31.550966],\"centroid\":[120.429487,31.506686],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":4,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.347135,31.527338],[120.346505,31.528573],[120.335502,31.538967],[120.33799,31.543652],[120.343073,31.545408],[120.334514,31.55677],[120.324391,31.556762],[120.323642,31.559911],[120.32122,31.559558],[120.323077,31.562248],[120.322491,31.567946],[120.320405,31.568687],[120.323718,31.569869],[120.31958,31.569993],[120.319656,31.573723],[120.317614,31.574755],[120.317332,31.572912],[120.313954,31.573891],[120.317017,31.574438],[120.315094,31.575919],[120.316571,31.578415],[120.316843,31.576475],[120.319091,31.577551],[120.317506,31.579624],[120.319015,31.581326],[120.321046,31.579553],[120.319189,31.578953],[120.323805,31.572321],[120.325673,31.573679],[120.323631,31.575461],[120.32702,31.575778],[120.327052,31.5742],[120.32967,31.574041],[120.329518,31.569657],[120.326879,31.570866],[120.326346,31.569349],[120.331332,31.568343],[120.333167,31.569746],[120.333015,31.571527],[120.330202,31.572427],[120.329844,31.574014],[120.332516,31.573873],[120.330593,31.576819],[120.332005,31.577992],[120.334156,31.576493],[120.334253,31.573812],[120.336762,31.573706],[120.336784,31.575187],[120.340346,31.575038],[120.342844,31.576228],[120.345886,31.575858],[120.349557,31.574455],[120.348394,31.570857],[120.346135,31.569516],[120.348905,31.565847],[120.351881,31.568035],[120.362753,31.569031],[120.366913,31.57009],[120.369367,31.573397],[120.372028,31.573679],[120.37811,31.576025],[120.380435,31.575875],[120.385051,31.573776],[120.387321,31.573441],[120.388646,31.570919],[120.392588,31.567408],[120.39677,31.569516],[120.39374,31.573538],[120.394804,31.573635],[120.394522,31.57674],[120.399615,31.580197],[120.414267,31.580691],[120.415733,31.583425],[120.419404,31.581026],[120.422543,31.580823],[120.429288,31.577286],[120.434099,31.576466],[120.439237,31.574676],[120.444178,31.576475],[120.448968,31.571095],[120.448545,31.569631],[120.451477,31.568255],[120.45176,31.5665],[120.455116,31.568061],[120.457831,31.564171],[120.46085,31.565838],[120.466715,31.566791],[120.46614,31.564674],[120.473112,31.563986],[120.472819,31.561066],[120.47623,31.560511],[120.477033,31.558905],[120.481693,31.55954],[120.481334,31.554883],[120.486971,31.555941],[120.490707,31.557414],[120.498647,31.554697],[120.503295,31.552686],[120.504523,31.549493],[120.502774,31.544552],[120.505967,31.542099],[120.504544,31.538791],[120.506782,31.537476],[120.508096,31.534926],[120.513016,31.531547],[120.516959,31.529817],[120.518914,31.527453],[120.523888,31.529244],[120.528786,31.526588],[120.522606,31.521452],[120.52265,31.517869],[120.521455,31.515672],[120.523519,31.514524],[120.521542,31.512609],[120.518251,31.512759],[120.519196,31.508929],[120.521129,31.507402],[120.521118,31.504507],[120.519598,31.504604],[120.518295,31.501718],[120.519804,31.500888],[120.522389,31.504631],[120.525267,31.502583],[120.5253,31.499229],[120.528613,31.497887],[120.531024,31.495327],[120.533055,31.490675],[120.534999,31.487921],[120.542971,31.487612],[120.546197,31.487912],[120.547793,31.486244],[120.552062,31.483825],[120.551236,31.48213],[120.553441,31.477027],[120.54636,31.473133],[120.543568,31.470264],[120.537312,31.468365],[120.53615,31.467094],[120.5311,31.466608],[120.526017,31.46833],[120.523845,31.468357],[120.516003,31.464427],[120.515981,31.460233],[120.517361,31.457831],[120.513852,31.456189],[120.512364,31.45708],[120.50853,31.45565],[120.505044,31.457964],[120.501406,31.457557],[120.495421,31.451093],[120.495758,31.447931],[120.487026,31.44862],[120.484799,31.447481],[120.485418,31.449901],[120.480552,31.449132],[120.474437,31.446571],[120.460177,31.445485],[120.438172,31.44877],[120.431721,31.448647],[120.437477,31.443047],[120.435001,31.442606],[120.430537,31.446395],[120.426584,31.445441],[120.422641,31.448991],[120.418818,31.448382],[120.355823,31.416459],[120.353293,31.461496],[120.359169,31.46795],[120.361221,31.471853],[120.357083,31.47384],[120.354998,31.488539],[120.359755,31.489907],[120.360429,31.491408],[120.354792,31.500879],[120.354031,31.500765],[120.351718,31.507879],[120.356269,31.509379],[120.362579,31.513439],[120.357453,31.518399],[120.347135,31.527338]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320281,\"name\":\"江阴市\",\"center\":[120.275891,31.910984],\"centroid\":[120.303787,31.832204],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":5,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.581713,31.727632],[120.580257,31.726329],[120.576,31.726153],[120.56806,31.722957],[120.562412,31.723062],[120.551953,31.726734],[120.546968,31.725977],[120.541755,31.723397],[120.535129,31.721653],[120.528504,31.725818],[120.518284,31.734896],[120.50853,31.724762],[120.507336,31.724119],[120.504827,31.713825],[120.498288,31.713402],[120.496312,31.710417],[120.491022,31.70965],[120.492163,31.711905],[120.491272,31.713719],[120.487297,31.715445],[120.485125,31.713728],[120.471907,31.712513],[120.46261,31.716132],[120.461339,31.714503],[120.458309,31.7132],[120.456701,31.710725],[120.452824,31.711456],[120.451173,31.707255],[120.44685,31.706084],[120.432948,31.705309],[120.430309,31.704604],[120.427376,31.70249],[120.41986,31.704498],[120.415375,31.704604],[120.411041,31.703538],[120.402982,31.699522],[120.399398,31.699998],[120.398106,31.697408],[120.394174,31.699231],[120.390307,31.699513],[120.384909,31.695171],[120.382857,31.694202],[120.3776,31.693383],[120.371322,31.691612],[120.366619,31.689137],[120.360135,31.687481],[120.349209,31.689128],[120.346624,31.691145],[120.336013,31.694396],[120.333862,31.698192],[120.319395,31.700746],[120.311336,31.700253],[120.298423,31.698932],[120.292558,31.69909],[120.283662,31.7019],[120.282435,31.70338],[120.276157,31.723168],[120.273714,31.724603],[120.264384,31.722692],[120.261104,31.721002],[120.256933,31.72013],[120.254446,31.724365],[120.248646,31.726928],[120.237361,31.728363],[120.228857,31.727306],[120.224991,31.724779],[120.220494,31.723969],[120.215357,31.724321],[120.206451,31.726065],[120.203942,31.728891],[120.202921,31.735372],[120.203779,31.740381],[120.201161,31.753269],[120.200043,31.757767],[120.196556,31.764774],[120.192527,31.767352],[120.186108,31.783633],[120.185098,31.787681],[120.181242,31.79399],[120.174248,31.801029],[120.176192,31.807267],[120.179244,31.812853],[120.177886,31.814137],[120.172217,31.814947],[120.17049,31.817251],[120.172043,31.823004],[120.165494,31.825564],[120.163919,31.830287],[120.164093,31.832697],[120.167079,31.835485],[120.16999,31.836065],[120.173194,31.838774],[120.172521,31.840867],[120.1768,31.844499],[120.180493,31.849002],[120.184251,31.856124],[120.185185,31.860415],[120.182719,31.864855],[120.175888,31.870209],[120.168795,31.870165],[120.158119,31.867835],[120.151657,31.864187],[120.146161,31.862481],[120.144228,31.858929],[120.122809,31.859342],[120.117401,31.855007],[120.114088,31.855342],[120.098665,31.855553],[120.085469,31.853055],[120.080299,31.84748],[120.060489,31.834517],[120.056405,31.833348],[120.056698,31.831976],[120.051887,31.829152],[120.047966,31.825713],[120.044979,31.821755],[120.032011,31.826074],[120.030251,31.831272],[120.028763,31.832116],[120.025277,31.831677],[120.02279,31.828669],[120.022225,31.826654],[120.019292,31.822802],[120.014557,31.824948],[120.011331,31.823849],[120.009811,31.826989],[120.006292,31.825317],[120.003359,31.828246],[120.003685,31.838598],[120.000709,31.837859],[120.001187,31.840559],[120.000459,31.845616],[119.997342,31.845941],[119.99681,31.848984],[119.992911,31.84945],[119.990152,31.852809],[119.990217,31.854867],[119.995029,31.855939],[120.003272,31.859158],[120.005097,31.862543],[120.007997,31.8638],[120.007997,31.866886],[120.010506,31.867809],[120.013199,31.871686],[120.010223,31.873814],[120.01069,31.875546],[120.014774,31.881787],[120.009018,31.882868],[120.008518,31.885496],[120.006324,31.889127],[120.002555,31.8891],[120.000188,31.892537],[119.997831,31.894348],[120.001915,31.901484],[120.000894,31.905571],[120.005477,31.911889],[120.014991,31.914754],[120.022409,31.919692],[120.014405,31.927073],[120.011342,31.929331],[120.007399,31.935929],[120.008192,31.94033],[120.007649,31.947999],[120.008779,31.951293],[120.010832,31.953805],[120.01485,31.955149],[120.022399,31.967752],[120.064909,31.955465],[120.134811,31.939381],[120.175247,31.933829],[120.205875,31.931519],[120.236601,31.932907],[120.262994,31.941841],[120.294165,31.954886],[120.353054,31.980635],[120.370703,31.99082],[120.368878,31.961086],[120.371594,31.954956],[120.373527,31.946435],[120.375341,31.941727],[120.385996,31.935621],[120.390307,31.932195],[120.391252,31.928602],[120.390481,31.925852],[120.381065,31.918884],[120.379349,31.914148],[120.379761,31.912188],[120.38265,31.910949],[120.385214,31.911722],[120.385138,31.909534],[120.38857,31.909218],[120.390905,31.907926],[120.392067,31.905307],[120.396411,31.908181],[120.39791,31.90616],[120.40131,31.90536],[120.402385,31.907381],[120.40774,31.905518],[120.424998,31.898399],[120.436847,31.895604],[120.449544,31.891948],[120.466498,31.889979],[120.466574,31.887791],[120.468822,31.879616],[120.471299,31.879203],[120.484593,31.87442],[120.490881,31.871335],[120.492261,31.86547],[120.496073,31.860881],[120.502057,31.85215],[120.503274,31.841711],[120.508292,31.84369],[120.514428,31.841527],[120.517393,31.837947],[120.521977,31.834183],[120.528808,31.831351],[120.531306,31.827851],[120.529319,31.821324],[120.530839,31.81704],[120.529959,31.814674],[120.523693,31.810531],[120.522541,31.80629],[120.523942,31.801293],[120.526516,31.795548],[120.531154,31.793207],[120.531556,31.787796],[120.544394,31.787136],[120.544502,31.789468],[120.546229,31.791922],[120.548923,31.792054],[120.555483,31.794069],[120.555852,31.786872],[120.558383,31.78571],[120.57071,31.793779],[120.580735,31.784795],[120.584243,31.782146],[120.58874,31.771603],[120.589402,31.766182],[120.588533,31.762556],[120.594833,31.760434],[120.597668,31.75503],[120.600024,31.744625],[120.598754,31.742802],[120.594822,31.741138],[120.593323,31.738171],[120.589435,31.73494],[120.585601,31.735407],[120.584352,31.734465],[120.581713,31.727632]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320282,\"name\":\"宜兴市\",\"center\":[119.820538,31.364384],\"centroid\":[119.787423,31.352315],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":6,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.100153,31.335332],[120.110232,31.264001],[119.920011,31.170918],[119.913103,31.169572],[119.900211,31.169182],[119.891305,31.16431],[119.885245,31.162875],[119.883463,31.161538],[119.878359,31.16082],[119.875242,31.162353],[119.86664,31.168314],[119.859406,31.168828],[119.856267,31.170121],[119.851304,31.167827],[119.8476,31.167579],[119.842148,31.168757],[119.837575,31.173673],[119.831808,31.172451],[119.82817,31.17447],[119.826464,31.173204],[119.823782,31.168226],[119.823445,31.165825],[119.82792,31.163363],[119.829744,31.161387],[119.829375,31.158269],[119.823304,31.154132],[119.813583,31.149614],[119.809858,31.148524],[119.806599,31.149392],[119.800995,31.156338],[119.798019,31.157436],[119.794066,31.156205],[119.791274,31.156612],[119.789233,31.159686],[119.789352,31.162158],[119.793392,31.168057],[119.792513,31.171459],[119.790492,31.173204],[119.786626,31.173762],[119.784606,31.176011],[119.779327,31.178784],[119.773039,31.178049],[119.765653,31.173779],[119.762286,31.173363],[119.755357,31.170777],[119.753163,31.171406],[119.747754,31.169661],[119.74467,31.169882],[119.74051,31.173416],[119.738609,31.173585],[119.732864,31.171494],[119.723708,31.169758],[119.715888,31.169572],[119.713107,31.167614],[119.710316,31.158862],[119.707937,31.154025],[119.703875,31.151899],[119.698727,31.153069],[119.693297,31.156958],[119.68275,31.160501],[119.679275,31.167118],[119.678048,31.16819],[119.672606,31.167995],[119.663733,31.165958],[119.66294,31.164798],[119.662516,31.159855],[119.660072,31.15896],[119.656401,31.155283],[119.649374,31.154105],[119.645768,31.150464],[119.641554,31.148116],[119.637775,31.140488],[119.638122,31.135526],[119.63078,31.131255],[119.621972,31.130032],[119.616052,31.130094],[119.613728,31.129181],[119.609775,31.123811],[119.602802,31.112139],[119.599782,31.10917],[119.592115,31.110056],[119.581992,31.108647],[119.576507,31.110269],[119.574096,31.113991],[119.571326,31.129013],[119.564039,31.135871],[119.560259,31.140718],[119.554188,31.143996],[119.545835,31.14785],[119.541382,31.152333],[119.534518,31.158109],[119.532596,31.159093],[119.536625,31.167889],[119.543022,31.17548],[119.546378,31.176038],[119.548963,31.177942],[119.552374,31.177969],[119.553579,31.179156],[119.553188,31.183168],[119.554296,31.191678],[119.552765,31.201083],[119.552971,31.208635],[119.552558,31.212389],[119.550745,31.21617],[119.553851,31.221048],[119.551233,31.224952],[119.544152,31.226864],[119.536115,31.233494],[119.534475,31.236761],[119.530793,31.237283],[119.529066,31.23931],[119.522593,31.242169],[119.528588,31.247506],[119.527122,31.25232],[119.531553,31.2564],[119.532183,31.258586],[119.530478,31.268965],[119.535669,31.272505],[119.535528,31.275964],[119.530956,31.277663],[119.530912,31.279946],[119.533041,31.285404],[119.531401,31.287864],[119.535094,31.290907],[119.533671,31.294269],[119.527187,31.29794],[119.523679,31.301142],[119.522929,31.310924],[119.51966,31.313418],[119.520029,31.318247],[119.52672,31.327152],[119.53051,31.330875],[119.530728,31.339293],[119.528523,31.344969],[119.527589,31.360334],[119.528164,31.36524],[119.530434,31.370826],[119.534833,31.378039],[119.535702,31.381733],[119.540687,31.390155],[119.541741,31.394715],[119.541111,31.398585],[119.539666,31.400732],[119.537364,31.40143],[119.535974,31.406078],[119.536484,31.408216],[119.546639,31.413243],[119.553351,31.411724],[119.553797,31.415399],[119.556034,31.415143],[119.553905,31.417263],[119.553004,31.421981],[119.554383,31.422051],[119.554818,31.426141],[119.554557,31.433888],[119.556914,31.433897],[119.567514,31.432369],[119.576703,31.430726],[119.578256,31.432228],[119.578343,31.434551],[119.582524,31.437501],[119.582589,31.444823],[119.583317,31.446059],[119.587868,31.445803],[119.589595,31.447658],[119.590029,31.45225],[119.588433,31.454873],[119.589519,31.458352],[119.59143,31.460878],[119.591745,31.463059],[119.588357,31.464577],[119.588335,31.466688],[119.58411,31.465822],[119.565146,31.464339],[119.563572,31.468507],[119.565179,31.471385],[119.571891,31.471103],[119.57301,31.472039],[119.57515,31.480797],[119.573118,31.482624],[119.571652,31.488566],[119.567981,31.490419],[119.566406,31.492812],[119.567025,31.494798],[119.567015,31.504719],[119.568883,31.506775],[119.574259,31.505805],[119.579266,31.503148],[119.583621,31.504542],[119.584783,31.507314],[119.58613,31.514171],[119.58852,31.520111],[119.59307,31.529279],[119.593603,31.532209],[119.595883,31.535306],[119.601227,31.539029],[119.605278,31.549219],[119.607863,31.55318],[119.613315,31.557899],[119.61779,31.559364],[119.627934,31.55992],[119.63078,31.563677],[119.637655,31.568211],[119.640653,31.569084],[119.644443,31.572956],[119.646789,31.577683],[119.642684,31.582357],[119.642488,31.588672],[119.640055,31.590797],[119.641131,31.592851],[119.641239,31.596176],[119.639382,31.600258],[119.644128,31.604711],[119.64982,31.60516],[119.657944,31.609304],[119.661148,31.610186],[119.666774,31.6106],[119.67303,31.609322],[119.674985,31.604226],[119.677885,31.603318],[119.684955,31.604023],[119.690342,31.595241],[119.694122,31.587966],[119.694567,31.584192],[119.698021,31.581414],[119.699791,31.576554],[119.707318,31.577472],[119.709968,31.575999],[119.710044,31.568555],[119.712694,31.560325],[119.712901,31.558305],[119.715247,31.555985],[119.721199,31.556867],[119.725619,31.561031],[119.727759,31.562125],[119.733265,31.563157],[119.737251,31.561481],[119.746114,31.560272],[119.74795,31.558773],[119.755976,31.557026],[119.763905,31.554442],[119.768553,31.553789],[119.778904,31.554689],[119.792176,31.553383],[119.804101,31.54989],[119.807403,31.548504],[119.820697,31.537247],[119.832351,31.529191],[119.84192,31.528467],[119.847796,31.5298],[119.852955,31.534282],[119.856202,31.538835],[119.860069,31.543052],[119.861882,31.546264],[119.864,31.546017],[119.87762,31.546925],[119.890121,31.546546],[119.897594,31.546749],[119.90247,31.547746],[119.911062,31.548257],[119.921369,31.549863],[119.935629,31.552712],[119.94157,31.547684],[119.942483,31.546325],[119.948359,31.543379],[119.958796,31.540264],[119.966171,31.537194],[119.971721,31.535967],[119.973795,31.528361],[119.973567,31.515857],[119.981539,31.511471],[119.989924,31.50373],[119.996115,31.497499],[119.996919,31.501338],[119.997157,31.508117],[120.005553,31.503316],[120.009083,31.504454],[120.015795,31.505443],[120.018489,31.50464],[120.022084,31.501736],[120.030979,31.500209],[120.036203,31.497878],[120.037626,31.494754],[120.045489,31.490252],[120.043361,31.486094],[120.046195,31.479782],[120.044251,31.46969],[120.037604,31.425894],[120.03453,31.418597],[120.027851,31.409047],[120.021074,31.383006],[120.020943,31.374203],[120.023702,31.364948],[120.032076,31.353377],[120.041764,31.34588],[120.060662,31.339143],[120.068743,31.336879],[120.089585,31.332449],[120.100153,31.335332]]]]}}]}', 'admin', '2020-12-15 11:59:13', NULL, '2020-12-15 11:59:13', '0', NULL); + +-- ---------------------------- +-- Table structure for rep_demo_dadong +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_dadong`; +CREATE TABLE `rep_demo_dadong` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `hnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品编码', + `hname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称', + `danwei` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '单位', + `num` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数量', + `danjia` int(11) NOT NULL COMMENT '单价', + `fanli` int(11) NOT NULL COMMENT '返利', + `beizhu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_dadong +-- ---------------------------- +INSERT INTO `rep_demo_dadong` VALUES (1, '5896', '冰箱', '件', '10', 1520, 300, '1'); +INSERT INTO `rep_demo_dadong` VALUES (2, '4596', '空调', '件', '8', 2000, 800, '2'); +INSERT INTO `rep_demo_dadong` VALUES (3, '3695', '洗衣机', '件', '7', 456, 500, '3'); +INSERT INTO `rep_demo_dadong` VALUES (4, '1258', '微波炉', '件', '1', 560, 400, '4'); +INSERT INTO `rep_demo_dadong` VALUES (5, '1258', '烤箱', '件', '5', 100, 800, '5'); +INSERT INTO `rep_demo_dadong` VALUES (6, '5623', '电饼铛', '件', '6', 80, 300, '6'); +INSERT INTO `rep_demo_dadong` VALUES (7, '5894', '早餐机', '件', '2', 145, 300, '7'); +INSERT INTO `rep_demo_dadong` VALUES (8, '4578', '电饭锅', '件', '1', 256, 800, '8'); +INSERT INTO `rep_demo_dadong` VALUES (9, '2589', '豆浆机', '件', '2', 145, 400, '9'); +INSERT INTO `rep_demo_dadong` VALUES (10, '1456', '榨汁机', '件', '3', 56, 300, '10'); +INSERT INTO `rep_demo_dadong` VALUES (11, '2578', '热水壶', '件', '6', 12, 300, '11'); +INSERT INTO `rep_demo_dadong` VALUES (12, '1369', '热水器', '件', '9', 6356, 800, '12'); +INSERT INTO `rep_demo_dadong` VALUES (13, '5642', '吸尘器', '件', '45', 100, 400, '13'); +INSERT INTO `rep_demo_dadong` VALUES (14, '1356', '挂烫机', '件', '2', 20, 400, '14'); +INSERT INTO `rep_demo_dadong` VALUES (15, '2587', '破壁机', '件', '7', 500, 400, '15'); + +-- ---------------------------- +-- Table structure for rep_demo_daibu +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_daibu`; +CREATE TABLE `rep_demo_daibu` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '法院名称', + `shiyou` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '什么罪', + `fname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '犯罪人姓名', + `fsex` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '犯罪人性别', + `fdata` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '出生日期', + `fadress` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '住址', + `riqi` date NULL DEFAULT NULL COMMENT '待遇', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_daibu +-- ---------------------------- +INSERT INTO `rep_demo_daibu` VALUES (1, '兰州市人民检查院检察院', '盗窃罪', '张三', '男', '315504000', '兰州市东城区单枫家园3号楼102', '2020-07-17'); +INSERT INTO `rep_demo_daibu` VALUES (8, '兰州市人民检查院检察院', '故意伤人罪', '赵六', '男', '473356800', '兰州市东城区单枫家园3号楼102', '2020-07-17'); + +-- ---------------------------- +-- Table structure for rep_demo_deliveryorder +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_deliveryorder`; +CREATE TABLE `rep_demo_deliveryorder` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称', + `specifications` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '单位', + `num` int(11) NOT NULL COMMENT '返利', + `price` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注', + `total` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `remarks` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_deliveryorder +-- ---------------------------- +INSERT INTO `rep_demo_deliveryorder` VALUES (1, '冰箱', 'H2563', 300, '1', '1000', '1'); +INSERT INTO `rep_demo_deliveryorder` VALUES (2, '空调', 'M79', 800, '2', '2560', '2'); +INSERT INTO `rep_demo_deliveryorder` VALUES (3, '洗衣机', 'H90', 500, '3', '259', '3'); +INSERT INTO `rep_demo_deliveryorder` VALUES (4, '微波炉', 'J89', 400, '4', '259', '4'); +INSERT INTO `rep_demo_deliveryorder` VALUES (5, '烤箱', 'K56', 800, '5', '368', '5'); +INSERT INTO `rep_demo_deliveryorder` VALUES (6, '电饼铛', 'H56', 300, '6', '456', '6'); +INSERT INTO `rep_demo_deliveryorder` VALUES (7, '早餐机', 'K67', 300, '7', '147', '7'); +INSERT INTO `rep_demo_deliveryorder` VALUES (8, '电饭锅', 'M45', 800, '8', '148', '8'); +INSERT INTO `rep_demo_deliveryorder` VALUES (9, '豆浆机', 'H56', 400, '9', '258', '9'); +INSERT INTO `rep_demo_deliveryorder` VALUES (10, '榨汁机', 'H45', 300, '10', '456', '10'); +INSERT INTO `rep_demo_deliveryorder` VALUES (11, '热水壶', 'U78', 300, '11', '258', '11'); +INSERT INTO `rep_demo_deliveryorder` VALUES (12, '热水器', 'J78', 800, '12', '158', '12'); +INSERT INTO `rep_demo_deliveryorder` VALUES (13, '吸尘器', 'R45', 400, '13', '125', '13'); +INSERT INTO `rep_demo_deliveryorder` VALUES (14, '挂烫机', 'U67', 400, '14', '120', '14'); +INSERT INTO `rep_demo_deliveryorder` VALUES (15, '破壁机', 'H56', 400, '15', '258', '15'); + +-- ---------------------------- +-- Table structure for rep_demo_employee +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_employee`; +CREATE TABLE `rep_demo_employee` ( + `id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `num` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名', + `sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别', + `birthday` datetime(0) NULL DEFAULT NULL COMMENT '出生日期', + `nation` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '民族', + `political` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '政治面貌', + `native_place` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯', + `height` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身高', + `weight` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '体重', + `health` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '健康状况', + `id_card` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号', + `education` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学历', + `school` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '毕业学校', + `major` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业', + `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系地址', + `zip_code` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮编', + `email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email', + `phone` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', + `foreign_language` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外语语种', + `foreign_language_level` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外语水平', + `computer_level` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计算机水平', + `graduation_time` datetime(0) NULL DEFAULT NULL COMMENT '毕业时间', + `arrival_time` datetime(0) NULL DEFAULT NULL COMMENT '到职时间', + `positional_titles` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职称', + `education_experience` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '教育经历', + `work_experience` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '工作经历', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_employee +-- ---------------------------- +INSERT INTO `rep_demo_employee` VALUES ('1', '001', '张三', '男', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月:北京语言文化大学比较文学研究所攻读博士学位,获得比较文学博士学位', '2019年5月---至今 XX公司     网络系统工程师  \n2019年5月---至今 XX公司     网络系统工程师', NULL, '2020-02-04 15:18:03', NULL, NULL, NULL); +INSERT INTO `rep_demo_employee` VALUES ('2', '002', '王红', '女', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月:北京语言文化大学比较文学研究所攻读博士学位,获得比较文学博士学位', '2019年5月---至今 XX公司     网络系统工程师  \n2019年5月---至今 XX公司     网络系统工程师', NULL, '2020-02-04 18:39:27', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for rep_demo_gongsi +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_gongsi`; +CREATE TABLE `rep_demo_gongsi` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `gname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称', + `gdata` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '返利', + `tdata` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注', + `didian` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `zhaiyao` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `num` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_gongsi +-- ---------------------------- +INSERT INTO `rep_demo_gongsi` VALUES (1, '北京天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661'); +INSERT INTO `rep_demo_gongsi` VALUES (2, 'dd天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661'); + +-- ---------------------------- +-- Table structure for rep_demo_huizong +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_huizong`; +CREATE TABLE `rep_demo_huizong` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '村(社区)名称', + `hname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '户主名称', + `num` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '保障编号', + `Jtotal` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '家庭人口', + `Jaddress` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '家庭住址', + `snum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '身份证号码', + `hushu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '户数', + `renkou` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '人口', + `money` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '金额', + `shouru` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '核减后月人均收入', + `bkey` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '保障类型', + `brenkou` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `cbuzhu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '差额补助', + `qbuzhu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '全额补助', + `zbuzhu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '增发补助', + `hbuzhu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '合计补助', + `sxinzeng` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '是否新增对象', + `schaobiao` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收入超标', + `jchaobiao` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '机动车超标', + `die` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '死亡', + `qita` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '其他', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_huizong +-- ---------------------------- +INSERT INTO `rep_demo_huizong` VALUES (1, '李家村', '张三', '2563933', '2', '北京市朝阳区李家村201号', '18034596978', '2', '20', '1000', '1', '1', '2', '1000', '1000', '1000', '1000', '是', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (2, '李家村', '赵四', '2563934', '3', '北京市朝阳区李家村202号', '18034596978', '3', '10', '2560', '2', '1', '3', '1000', '1000', '1000', '1000', '是', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (3, '李家村', '王五', '2563935', '4', '北京市朝阳区李家村203号', '18034596978', '4', '50', '259', '3', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (4, '李家村', '丽丽', '2563936', '4', '北京市朝阳区李家村204号', '18034596978', '4', '20', '259', '4', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (5, '李家村', '张三枫', '2563937', '4', '北京市朝阳区李家村101号', '18034596978', '4', '50', '368', '5', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (6, '赵家村', '李易峰', '2563938', '4', '北京市朝阳区赵家村101号', '18034596978', '4', '40', '456', '6', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (7, '赵家村', '踩踩', '2563939', '4', '北京市朝阳区赵家村102号', '18034596978', '4', '30', '147', '7', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (8, '赵家村', '赵丽颖', '2563940', '4', '北京市朝阳区赵家村103号', '18034596978', '4', '50', '148', '8', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (9, '赵家村', '韩泽', '2563941', '4', '北京市朝阳区赵家村104号', '18034596978', '4', '20', '258', '9', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (10, '葛家村', '杨兵', '2563942', '4', '北京市朝阳区葛家村101号', '18034596978', '4', '10', '456', '10', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (11, '葛家村', '杨玉', '2563943', '4', '北京市朝阳区葛家村102号', '18034596978', '4', '50', '258', '11', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (12, '葛家村', '杨杰', '2563944', '4', '北京市朝阳区葛家村103号', '18034596978', '4', '80', '158', '12', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (13, '葛家村', '杨清', '2563945', '4', '北京市朝阳区葛家村104号', '18034596978', '4', '90', '125', '13', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (14, '葛家村', '王一', '2563946', '4', '北京市朝阳区葛家村105号', '18034596978', '4', '50', '120', '14', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); +INSERT INTO `rep_demo_huizong` VALUES (15, '葛家村', '王二', '2563947', '4', '北京市朝阳区葛家村106号', '18034596978', '4', '15', '258', '15', '1', '4', '1000', '1000', '1000', '1000', '否', '', '', '', ''); + +-- ---------------------------- +-- Table structure for rep_demo_income +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_income`; +CREATE TABLE `rep_demo_income` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `month` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '月份', + `main_operating_income` decimal(10, 2) NULL DEFAULT NULL COMMENT '佣金/主营业收入', + `cumulative` decimal(10, 2) NULL DEFAULT NULL COMMENT '累计', + `lowest_level_in_history` decimal(10, 2) NULL DEFAULT NULL COMMENT '历史最低水平', + `historical_average` decimal(10, 2) NULL DEFAULT NULL COMMENT '历史平均水平', + `record_high` decimal(10, 2) NULL DEFAULT NULL COMMENT '历史最高水平', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_income +-- ---------------------------- +INSERT INTO `rep_demo_income` VALUES (1, '1', 483835.11, 483835.00, 57570.00, 216798.00, 483835.00); +INSERT INTO `rep_demo_income` VALUES (2, '2', 11666579.00, 12150413.00, 22140.00, 4985362.00, 11666579.00); +INSERT INTO `rep_demo_income` VALUES (3, '3', 27080982.00, 17428381.00, 73106.00, 16192642.00, 27080982.00); +INSERT INTO `rep_demo_income` VALUES (4, '4', 0.11, 39231395.00, 73106.00, 8513415.00, 17428381.00); + +-- ---------------------------- +-- Table structure for rep_demo_jianpiao +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_jianpiao`; +CREATE TABLE `rep_demo_jianpiao` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `bnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ftime` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `sfkong` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `kaishi` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jieshu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `hezairen` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jpnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `shihelv` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `s_id` int(11) NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_jianpiao +-- ---------------------------- +INSERT INTO `rep_demo_jianpiao` VALUES (1, 'K7725', '21:13', '否', '秦皇岛', '邯郸', '300', '258', '86', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (2, 'k99', '16:55', '否', '包头', '广州', '800', '700', '88', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (3, 'G6737', '05:34', '否', '北京西', '邯郸东', '500', '256', '51', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (4, 'K7705', '07:03', '否', '北京', '邯郸', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (5, 'G437', '06:27', '否', '北京西', '兰州西', '800', '586', '73', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (6, 'G673', '06:32', '否', '北京西', '邯郸东', '300', '289', '87', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (7, 'G507', '06:43', '否', '北京西', '邯郸东', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (8, 'G89', '06:53', '否', '北京西', '成都东', '800', '500', '62', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (9, 'K7712', '09:43', '否', '北京西', '西安北', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (10, 'G405', '10:05', '否', '北京西', '昆明南', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (11, 'G6701', '10:38', '否', '北京西', '石家庄', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (12, 'G487', '10:52', '否', '北京西', '南昌西', '800', '700', '88', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (13, 'G607', '11:14', '否', '北京西', '太原南', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (14, 'G667', '11:19', '否', '北京西', '西安北', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (15, 'Z49', '11:28', '否', '北京西', '成都', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (16, 'Z49', '11:28', '否', '北京西', '上海', '300', '200', '80', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (17, 'Z49', '11:56', '否', '北京西', '上海', '200', '180', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (18, 'Z49', '11:36', '否', '北京南', '大晒', '200', '180', '96', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (19, 'Z123', '12:00', '否', '北京南', '重庆', '1000', '1000', '100', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (20, 'G78', '13:56', '否', '北京东', '厦门北', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (21, 'G56', '18:36', '否', '上海西', '深圳', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (22, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (23, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (24, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (25, 'H78', '12:00', '否', '北京西', '南昌', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (26, 'G70', '7:23', '是', '北京西', '厦门', '500', '450', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (27, 'G14', '9:50', '是', '北京西', '上海', '800', '700', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (28, 'G90', '8:30', '是', '北京南', '武昌', '1000', '1000', '100', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (29, 'G25', '7:56', '是', '厦门北', '福州', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (30, 'G50', '14:23', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (31, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (32, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (33, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (34, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (35, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (36, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (37, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (38, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (39, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (40, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (41, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (42, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (43, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (44, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (45, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (46, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (47, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (48, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (49, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (50, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (51, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (52, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (53, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (54, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (55, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (56, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (57, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (58, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (59, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (60, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (61, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (62, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (63, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (64, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (65, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (66, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (67, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (68, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (69, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (70, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (71, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (72, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (73, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (74, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (75, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (76, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (77, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (78, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (79, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (80, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (81, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (82, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (83, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (84, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (85, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (86, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); + +-- ---------------------------- +-- Table structure for rep_demo_jiehsao +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_jiehsao`; +CREATE TABLE `rep_demo_jiehsao` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '到的公司', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '去的人', + `num` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '几个人', + `yaunyin` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '去的目的', + `data` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '时间', + `kdata` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '开始时间', + `jdata` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '结束时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_jiehsao +-- ---------------------------- +INSERT INTO `rep_demo_jiehsao` VALUES (1, '北京文化局', '张科和赵四', '2', '去调查钱多多的问题', '2020年5月6日', '2020年5月6日', '2020年6月6日'); +INSERT INTO `rep_demo_jiehsao` VALUES (2, '北京市旅游局', '赵武和张九龄', '2', '去调查贪污问题', '2020年4月1日', '2020年4月7日', '2020年4月7日'); + +-- ---------------------------- +-- Table structure for rep_demo_kaoqin +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_kaoqin`; +CREATE TABLE `rep_demo_kaoqin` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `day` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `zcdaka` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `cdday` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ztday` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `kgday` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `bcnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `wqday` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ccday` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `qjnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `qknum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_kaoqin +-- ---------------------------- +INSERT INTO `rep_demo_kaoqin` VALUES (1, '王小丽', '20', '20', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (2, '张三丰', '20', '14', '3', '0', '0', '3', '0', '0', '3', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (3, '李嘉怡', '20', '20', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (4, '杨子轩', '20', '10', '2', '0', '0', '2', '1', '1', '1', '1'); +INSERT INTO `rep_demo_kaoqin` VALUES (5, '赵四', '20', '12', '2', '0', '0', '0', '2', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (6, '王安石', '20', '20', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (7, '高圆圆', '20', '19', '0', '0', '0', '1', '1', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (8, '刘能', '20', '20', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (9, '宋小宝', '20', '20', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (10, '宋祖儿', '20', '15', '0', '0', '0', '10', '0', '5', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (11, '黄渤', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (12, '章成', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (13, '李易峰', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (14, '赵丽颖', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0'); +INSERT INTO `rep_demo_kaoqin` VALUES (15, '范冰冰', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0'); + +-- ---------------------------- +-- Table structure for rep_demo_salesrate +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_salesrate`; +CREATE TABLE `rep_demo_salesrate` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `bname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称', + `stotal` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '单位', + `starget` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `srate` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注', + `jtotal` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jtarget` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jrate` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_salesrate +-- ---------------------------- +INSERT INTO `rep_demo_salesrate` VALUES (1, '营销部', '235.25', '352.12', '66.99%', '452.20', '485.00', '93.24%'); +INSERT INTO `rep_demo_salesrate` VALUES (2, '广告部', '914.20', '687.20', '130.04%', '380.21', '875.20', '77.59%'); +INSERT INTO `rep_demo_salesrate` VALUES (3, '技术部', '1985.24', '2589.63', '125.36%', '3695.12', '2856.34', '82.35%'); + +-- ---------------------------- +-- Table structure for rep_demo_xiaoshou +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_xiaoshou`; +CREATE TABLE `rep_demo_xiaoshou` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `hnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品编码', + `hname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称', + `xinghao` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '单位', + `fahuocangku` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数量', + `danwei` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '单价', + `num` int(11) NOT NULL COMMENT '返利', + `danjia` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注', + `zhekoulv` int(11) NOT NULL, + `xiaoshoujine` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `beizhu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `s_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_xiaoshou +-- ---------------------------- +INSERT INTO `rep_demo_xiaoshou` VALUES (1, '5896', '冰箱', 'H2563', '上海', '件', 300, '1', 20, '1000', '晚上送', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (2, '4596', '空调', 'M79', '上海', '件', 800, '2', 10, '2560', '上门安装', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (3, '3695', '洗衣机', 'H90', '杭州', '件', 500, '3', 50, '259', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (4, '1258', '微波炉', 'J89', '广州', '件', 400, '4', 20, '259', '多个排水管', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (5, '1258', '烤箱', 'K56', '广州', '件', 800, '5', 50, '368', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (6, '5623', '电饼铛', 'H56', '上海', '件', 300, '6', 40, '456', '中午送', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (7, '5894', '早餐机', 'K67', '杭州', '件', 300, '7', 30, '147', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (8, '4578', '电饭锅', 'M45', '广州', '件', 800, '8', 50, '148', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (9, '2589', '豆浆机', 'H56', '上海', '件', 400, '9', 20, '258', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (10, '1456', '榨汁机', 'H45', '杭州', '件', 300, '10', 10, '456', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (11, '2578', '热水壶', 'U78', '广州', '件', 300, '11', 50, '258', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (12, '1369', '热水器', 'J78', '上海', '件', 800, '12', 80, '158', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (13, '5642', '吸尘器', 'R45', '上海', '件', 400, '13', 90, '125', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (14, '1356', '挂烫机', 'U67', '上海', '件', 400, '14', 50, '120', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (15, '2587', '破壁机', 'H56', '杭州', '件', 400, '15', 15, '258', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (16, '2578', '热水壶11', 'U78', '广州', '件', 300, '11', 50, '258', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (17, '2578', '热水壶22', 'U78', '广州', '件', 300, '11', 50, '258', '', '1'); +INSERT INTO `rep_demo_xiaoshou` VALUES (18, '2589', '电脑', 'XXP', '北京', '台', 56, '1220', 20, '1000', '', '1'); + + +-- ---------------------------- +-- Table structure for xianlu_wxtl +-- ---------------------------- +DROP TABLE IF EXISTS `xianlu_wxtl`; +CREATE TABLE `xianlu_wxtl` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of xianlu_wxtl +-- ---------------------------- +INSERT INTO `xianlu_wxtl` VALUES ('1338685051105185794', '江苏', '500', '1'); +INSERT INTO `xianlu_wxtl` VALUES ('1338685110702051329', '广东', '300', '2'); +INSERT INTO `xianlu_wxtl` VALUES ('1338685208198647810', '浙江', '100', '1'); +INSERT INTO `xianlu_wxtl` VALUES ('1338685268005228546', '湖北', '1000', '1'); +INSERT INTO `xianlu_wxtl` VALUES ('1338685322132721666', '湖南', '888', '1'); + +-- ---------------------------- +-- Table structure for xianlu1_wxtl +-- ---------------------------- +DROP TABLE IF EXISTS `xianlu1_wxtl`; +CREATE TABLE `xianlu1_wxtl` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `from_name` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '从哪里', + `to_name` varchar(152) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '到哪里', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of xianlu1_wxtl +-- ---------------------------- +INSERT INTO `xianlu1_wxtl` VALUES ('1338686722493386754', '江苏', '广东'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338686814369615874', '广东', '湖北'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338686866899079169', '湖南', '江苏'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338686931281645569', '广东', '浙江'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338686989267898370', '浙江', '广东'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338687041906413570', '浙江', '湖北'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338687079105695746', '浙江', '湖南'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338687103751426050', '湖南', '浙江'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338694238950395905', '湖南', '湖北'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338694293467959297', '湖南', '广东'); +INSERT INTO `xianlu1_wxtl` VALUES ('1338694536653705218', '湖北', '江苏'); + +-- ---------------------------- +-- Table structure for yanshi_duozu +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_duozu`; +CREATE TABLE `yanshi_duozu` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `value` int(10) NULL DEFAULT NULL COMMENT '值', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_duozu +-- ---------------------------- +INSERT INTO `yanshi_duozu` VALUES ('1340965548325879812', '一月', 1000, '三星'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548325879815', '一月', 1500, '小米'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548325879818', '二月', 2000, '三星'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074114', '二月', 2500, '小米'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074117', '三月', 3000, '三星'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074120', '三月', 3500, '小米'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074123', '四月', 4000, '三星'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074126', '四月', 4500, '小米'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074129', '五月', 5000, '三星'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074132', '五月', 5500, '小米'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074135', '六月', 6000, '三星'); +INSERT INTO `yanshi_duozu` VALUES ('1340965548330074138', '六月', 6500, '小米'); + +-- ---------------------------- +-- Table structure for yanshi_dxtj +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_dxtj`; +CREATE TABLE `yanshi_dxtj` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `gtime` datetime(0) NULL DEFAULT NULL COMMENT '雇佣日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职务', + `jphone` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '家庭电话', + `birth` datetime(0) NULL DEFAULT NULL COMMENT '出生日期', + `hukou` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户口所在地', + `laddress` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址', + `jperson` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人', + `sex` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'xingbie', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_dxtj +-- ---------------------------- +INSERT INTO `yanshi_dxtj` VALUES ('1338808084247613441', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809169074982920', '张小哲', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809448658898952', '闫妮', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809620973490184', '陌生', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809652606930952', '贺江', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809685200867336', '村子明', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809710203113481', '尚德', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809749470187528', '郑恺', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809774971555849', '未名园', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809805199904777', '韩寒', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809830017601544', '迪丽热拉', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1338809864356368393', '张一山', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157602480137', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157602480146', '张大大', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674439', '郭美美', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674448', '莫愁', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674457', '鲁与', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674466', '高尚', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674475', '尚北京', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674484', '杨颖花', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674493', '李丽', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674502', '韩露露', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674511', '李凯泽', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `yanshi_dxtj` VALUES ('1339160157606674520', '王明阳', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); + +-- ---------------------------- +-- Table structure for yanshi_jdcx +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_jdcx`; +CREATE TABLE `yanshi_jdcx` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `region` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发货地区', + `city` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发货城市', + `company` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发货公司', + `freight` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '运费', + `ftime` datetime(0) NULL DEFAULT NULL COMMENT '发货日期', + `customer` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户ID', + `address` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户地址', + `dtime` datetime(0) NULL DEFAULT NULL COMMENT '订购日期', + `ttime` datetime(0) NULL DEFAULT NULL COMMENT '到货日期', + `code1` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮政编码', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_jdcx +-- ---------------------------- +INSERT INTO `yanshi_jdcx` VALUES ('1338749873113010177', '华南', '上海', '上海海鲜批发有限公司', '50', '2020-12-14 00:00:00', '001', '北京市朝阳区奥林佳泰大厦', '2020-12-14 00:00:00', '2020-12-15 00:00:00', '050000'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945546', '华南', '上海', '上海海鲜批发有限公司', '50', '2020-11-11 00:00:00', '001', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-15 00:00:00', '050000'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945556', '华南', '杭州', '杭州嘻嘻服装', '0', '2020-11-11 00:00:00', '002', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-16 00:00:00', '050001'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945566', '华北', '北京', '北京极品公司', '52', '2020-11-11 00:00:00', '003', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-17 00:00:00', '050002'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945576', '华北', '河北', '河北包包', '53', '2020-11-11 00:00:00', '004', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-18 00:00:00', '050003'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945586', '华北', '山西', '山西刀削面有限公司', '54', '2020-11-11 00:00:00', '005', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-19 00:00:00', '050004'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945596', '华北', '内蒙古', '内蒙古牛肉有限公司', '55', '2020-11-11 00:00:00', '006', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-20 00:00:00', '050005'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945606', '华北', '河北', '河北牛奶加工厂', '53', '2020-11-11 00:00:00', '007', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-18 00:00:00', '050003'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945616', '华北', '山西', '陕西米粉有限公司', '54', '2020-11-11 00:00:00', '008', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-19 00:00:00', '050004'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945626', '华北', '内蒙古', '内蒙古牛奶有限公司', '55', '2020-11-11 00:00:00', '009', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-20 00:00:00', '050005'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945636', '华中', '湖北', '湖北老干妈有限公司', '56', '2020-11-11 00:00:00', '010', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-21 00:00:00', '050006'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945646', '华中', '湖南', '湖南面面有限公司', '57', '2020-11-11 00:00:00', '011', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-22 00:00:00', '050007'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202170945656', '华中', '河南', '河南面面有限公司', '58', '2020-11-11 00:00:00', '012', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-23 00:00:00', '050008'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139843', '西北', '宁夏', '宁夏枸杞有限公司', '59', '2020-11-11 00:00:00', '013', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-24 00:00:00', '050009'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139853', '西北', '新疆', '新疆奶酪片有限公司', '60', '2020-11-11 00:00:00', '014', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-25 00:00:00', '050010'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139863', '西北', '青海', '青海云石有限公司', '61', '2020-11-11 00:00:00', '015', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-26 00:00:00', '050011'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139873', '西北', '陕西', '陕西牛肉有限公司', '62', '2020-11-11 00:00:00', '016', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-27 00:00:00', '050012'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139883', '西北', '甘肃', '甘肃素衣有限公司', '63', '2020-11-11 00:00:00', '017', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-28 00:00:00', '050013'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139893', '西北', '陕西', '陕西刀具有限公司', '62', '2020-11-11 00:00:00', '018', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-27 00:00:00', '050012'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139903', '西北', '甘肃', '甘肃水果有限公司', '63', '2020-11-11 00:00:00', '019', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-28 00:00:00', '050013'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139913', '西北', '甘肃', '甘肃水果有限公司', '63', '2020-11-11 00:00:00', '020', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-28 00:00:00', '050013'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139923', '东北', '辽宁', '辽宁饮用水有限公司', '64', '2020-11-11 00:00:00', '021', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-29 00:00:00', '050014'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139933', '东北', '吉林', '吉林饮用水有限公司', '65', '2020-11-11 00:00:00', '022', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-30 00:00:00', '050015'); +INSERT INTO `yanshi_jdcx` VALUES ('1338756202175139943', '东北', '黑龙江', '黑龙江饮用水有限公司', '66', '2020-11-11 00:00:00', '023', '北京市朝阳区奥林佳泰大厦', '2020-11-11 00:00:00', '2020-12-31 00:00:00', '050016'); + +-- ---------------------------- +-- Table structure for yanshi_qipaosandian +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_qipaosandian`; +CREATE TABLE `yanshi_qipaosandian` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_qipaosandian +-- ---------------------------- +INSERT INTO `yanshi_qipaosandian` VALUES ('1348516823330459650', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for yanshi_sandian +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_sandian`; +CREATE TABLE `yanshi_sandian` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_sandian +-- ---------------------------- +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599363', '100', '80.4'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599365', '80', '69.5'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599367', '130', '75.8'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599369', '90', '88.1'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599371', '110', '83.3'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599373', '140', '99.6'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599375', '60', '72.4'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599377', '40', '42.6'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599379', '120', '108.4'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599381', '70', '48.2'); +INSERT INTO `yanshi_sandian` VALUES ('1340970999507599383', '50', '56.8'); + +-- ---------------------------- +-- Table structure for yanshi_tima +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_tima`; +CREATE TABLE `yanshi_tima` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `sex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `nation` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '汉', + `birth` datetime(0) NULL DEFAULT NULL COMMENT '出生日期', + `address` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址', + `card` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '公民身份证', + `date` datetime(0) NULL DEFAULT NULL COMMENT '有效日期', + `orga` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '签发机关', + `reason` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申领原因', + `time` datetime(0) NULL DEFAULT NULL COMMENT '受理时间', + `num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '受理号', + `undertaker` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '承办人', + `leader` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '受理单位领导', + `autograph` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申请(监护)人签名', + `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申请(监护)人联系电话', + `qianming` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '领证人签名', + `ltime` datetime(0) NULL DEFAULT NULL COMMENT '领证时间', + `os` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否通过邮政特快专递方式领取二代', + `taddress` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '投递地址', + `addressee` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收件人', + `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮政编码', + `remarks` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_tima +-- ---------------------------- +INSERT INTO `yanshi_tima` VALUES ('1', '张三丰', '1', '汉', '2020-12-16 19:06:30', '北京市朝阳区奥林佳泰大厦', '130631199508151236', '2020-12-15 00:00:00', '北京市朝阳区亚运村办事处', '签证', '2020-12-15 00:00:00', '56963', '张三', '李四', '李四', '18034596985', '张三', '2020-12-15 00:00:00', '是', '北京市朝阳区', '张三', '0500000', '113'); + +-- ---------------------------- +-- Table structure for yanshi_wxtl +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_wxtl`; +CREATE TABLE `yanshi_wxtl` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_wxtl +-- ---------------------------- +INSERT INTO `yanshi_wxtl` VALUES ('1338669173307346946', '宾馆', '4.5'); +INSERT INTO `yanshi_wxtl` VALUES ('1338669288306774017', '景区', '4.4'); +INSERT INTO `yanshi_wxtl` VALUES ('1338669340353892353', '餐饮', '3.2'); +INSERT INTO `yanshi_wxtl` VALUES ('1338669402618335233', '商城', '2.3'); +INSERT INTO `yanshi_wxtl` VALUES ('1338669463217639426', '商业街', '2'); +INSERT INTO `yanshi_wxtl` VALUES ('1338669516091035650', '其他', '1.8'); + +-- ---------------------------- +-- Table structure for yanshi_yipan +-- ---------------------------- +DROP TABLE IF EXISTS `yanshi_yipan`; +CREATE TABLE `yanshi_yipan` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of yanshi_yipan +-- ---------------------------- +INSERT INTO `yanshi_yipan` VALUES ('1340968006737477634', '出勤率', '60'); +INSERT INTO `yanshi_yipan` VALUES ('1340968084172718082', '迟到率', '5'); +INSERT INTO `yanshi_yipan` VALUES ('1340968147338936322', '满勤率', '10'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/增量SQL/版本升级说明.txt b/db/增量SQL/版本升级说明.txt new file mode 100644 index 00000000..771e46b4 --- /dev/null +++ b/db/增量SQL/版本升级说明.txt @@ -0,0 +1,10 @@ +版本升级方法? + + JeroBoot属于平台级产品,每次升级改动内容较多,目前做不到平滑升级。 + + 这里给用户的升级建议是这样的: + 1.代码升级 => 本地版本通过svn或者git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比代码进行提交; + 2.数据库升级 => 针对数据库我们每次发布会提供增量升级SQL,可以通过增量SQL实现数据库的升级。 + 3.兼容问题 => 每次版本发布会针对不兼容地方标注说明,需要手工修改不兼容的代码。 + + 注意: 升级sql目前只提供mysql版本,执行完脚步后,新菜单需要手工进行角色授权,刷新首页才会出现。 \ No newline at end of file diff --git a/docker-compose-server.yml b/docker-compose-server.yml new file mode 100644 index 00000000..2a179e29 --- /dev/null +++ b/docker-compose-server.yml @@ -0,0 +1,51 @@ +#### 镜像上传 +# 仓库私服: 81.70.17.111:5000 +# 第一步:上传镜像到docker仓库 +#docker tag jero-boot-mysql 81.70.17.111:5000/jero-boot-mysql:1.1 +#docker tag jero-boot-system 81.70.17.111:5000/jero-boot-system:1.0 +#docker tag nginxhtml:jeroboot 81.70.17.111:5000/nginxhtml:1.2 + +#docker push 81.70.17.111:5000/jero-boot-mysql:1.1 +#docker push 81.70.17.111:5000/jero-boot-system:1.0 +#docker push 81.70.17.111:5000/nginxhtml:1.2 + +# 第二步:将此yml文件上传服务器,执行启动命令 docker-compose -f ./docker-compose-server.yml up +version: '2' +services: + jero-boot-mysql: + image: 81.70.17.111:5000/jero-boot-mysql:1.0 + environment: + MYSQL_ROOT_PASSWORD: root + restart: always + container_name: jero-boot-mysql + command: + --character-set-server=utf8mb4 + --collation-server=utf8mb4_general_ci + --explicit_defaults_for_timestamp=true + --lower_case_table_names=1 + --max_allowed_packet=128M + ports: + - 3306:3306 + + jero-boot-redis: + image: redis:5.0 + ports: + - 6379:6379 + restart: always + container_name: jero-boot-redis + + jero-boot-system: + image: 81.70.17.111:5000/jero-boot-system:1.0 + restart: always + container_name: jero-boot-system + volumes: + - /data/config:/jero-boot/config + ports: + - 8080:8080 + + jero-boot-nginx: + image: 81.70.17.111:5000/nginxhtml + restart: always + container_name: jero-boot-nginx + ports: + - 80:80 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..0c1dfbee --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,35 @@ +version: '2' +services: + jero-boot-mysql: + build: + context: ./db + environment: + MYSQL_ROOT_PASSWORD: root + restart: always + container_name: jero-boot-mysql + image: jero-boot-mysql + command: + --character-set-server=utf8mb4 + --collation-server=utf8mb4_general_ci + --explicit_defaults_for_timestamp=true + --lower_case_table_names=1 + --max_allowed_packet=128M + ports: + - 3306:3306 + + jero-boot-redis: + image: redis:5.0 + ports: + - 6379:6379 + restart: always + container_name: jero-boot-redis + + + jero-boot-system: + build: + context: ./jero-boot-module-system + restart: always + container_name: jero-boot-system + image: jero-boot-system + ports: + - 8080:8080 \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-api/pom.xml b/jero-boot-base/jero-boot-base-api/pom.xml new file mode 100644 index 00000000..938cf1e9 --- /dev/null +++ b/jero-boot-base/jero-boot-base-api/pom.xml @@ -0,0 +1,20 @@ + + + + jero-boot-base + com.jero.boot + 2.4.2 + + 4.0.0 + + jero-boot-base-api + + + + com.jero.boot + jero-boot-base-core + + + \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java b/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java new file mode 100644 index 00000000..cd6aa1ee --- /dev/null +++ b/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java @@ -0,0 +1,302 @@ +package com.jero.common.system.api; + +import com.alibaba.fastjson.JSONObject; +import com.jero.common.api.CommonAPI; +import com.jero.common.api.dto.OnlineAuthDTO; +import com.jero.common.api.dto.message.*; +import com.jero.common.system.vo.*; + +import java.util.List; +import java.util.Set; + +/** + * @Description 底层共通业务API,提供其他独立模块调用 + * @Author scott + * @Date 2019-4-20 + * @Version V1.0 + */ +public interface ISysBaseAPI extends CommonAPI { + + + /** + * 1发送系统消息 + * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息 + */ + void sendSysAnnouncement(MessageDTO message); + + /** + * 2发送消息 附带业务参数 + * @param message 使用构造器赋值参数 + */ + void sendBusAnnouncement(BusMessageDTO message); + + /** + * 3通过模板发送消息 + * @param message 使用构造器赋值参数 + */ + void sendTemplateAnnouncement(TemplateMessageDTO message); + + /** + * 4通过模板发送消息 附带业务参数 + * @param message 使用构造器赋值参数 + */ + void sendBusTemplateAnnouncement(BusTemplateMessageDTO message); + + /** + * 5通过消息中心模板,生成推送内容 + * @param templateDTO 使用构造器赋值参数 + * @return + */ + String parseTemplateByCode(TemplateDTO templateDTO); + + /** + * 6根据用户id查询用户信息 + * @param id + * @return + */ + LoginUser getUserById(String id); + + /** + * 7通过用户账号查询角色集合 + * @param username + * @return + */ + List getRolesByUsername(String username); + + /** + * 8通过用户账号查询部门集合 + * @param username + * @return 部门 id + */ + List getDepartIdsByUsername(String username); + + /** + * 9通过用户账号查询部门 name + * @param username + * @return 部门 name + */ + List getDepartNamesByUsername(String username); + + + + /** 11查询所有的父级字典,按照create_time排序 */ + public List queryAllDict(); + + /** + * 12查询所有分类字典 + * @return + */ + public List queryAllDSysCategory(); + + + /** + * 14查询所有部门 作为字典信息 id -->value,departName -->text + * @return + */ + public List queryAllDepartBackDictModel(); + + /** + * 15根据业务类型及业务id修改消息已读 + * @param busType + * @param busId + */ + public void updateSysAnnounReadFlag(String busType, String busId); + + /** + * 16查询表字典 支持过滤数据 + * @param table + * @param text + * @param code + * @param filterSql + * @return + */ + public List queryFilterTableDictInfo(String table, String text, String code, String filterSql); + + /** + * 17查询指定table的 text code 获取字典,包含text和value + * @param table + * @param text + * @param code + * @param keyArray + * @return + */ + @Deprecated + public List queryTableDictByKeys(String table, String text, String code, String[] keyArray); + + /** + * 18查询所有用户 返回ComboModel + * @return + */ + public List queryAllUserBackCombo(); + + /** + * 19分页查询用户 返回JSONObject + * @return + */ + public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize); + + /** + * 20获取所有角色 + * @return + */ + public List queryAllRole(); + + /** + * 21获取所有角色 带参 + * roleIds 默认选中角色 + * @return + */ + public List queryAllRole(String[] roleIds ); + + /** + * 22通过用户账号查询角色Id集合 + * @param username + * @return + */ + public List getRoleIdsByUsername(String username); + + /** + * 23通过部门编号查询部门id + * @param orgCode + * @return + */ + public String getDepartIdsByOrgCode(String orgCode); + + /** + * 24查询所有部门 + * @return + */ + public List getAllSysDepart(); + + /** + * 25查找父级部门 + * @param departId + * @return + */ + DictModel getParentDepartId(String departId); + + /** + * 26根据部门Id获取部门负责人 + * @param deptId + * @return + */ + public List getDeptHeadByDepId(String deptId); + + /** + * 27给指定用户发消息 + * @param userIds + * @param cmd + */ + public void sendWebSocketMsg(String[] userIds, String cmd); + + /** + * 28根据id获取所有参与用户 + * userIds + * @return + */ + public List queryAllUserByIds(String[] userIds); + + /** + * 29将会议签到信息推动到预览 + * userIds + * @return + * @param userId + */ + void meetingSignWebsocket(String userId); + + /** + * 30根据name获取所有参与用户 + * userNames + * @return + */ + List queryUserByNames(String[] userNames); + + + /** + * 31获取用户的角色集合 + * @param username + * @return + */ + Set getUserRoleSet(String username); + + /** + * 32获取用户的权限集合 + * @param username + * @return + */ + Set getUserPermissionSet(String username); + + /** + * 33判断是否有online访问的权限 + * @param onlineAuthDTO + * @return + */ + boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO); + + /** + * 34通过部门id获取部门全部信息 + */ + SysDepartModel selectAllById(String id); + + /** + * 35根据用户id查询用户所属公司下所有用户ids + * @param userId + * @return + */ + List queryDeptUsersByUserId(String userId); + + /** + * 36根据多个用户账号(逗号分隔),查询返回多个用户信息 + * @param usernames + * @return + */ + List queryUsersByUsernames(String usernames); + + /** + * 37根据多个用户ID(逗号分隔),查询返回多个用户信息 + * @param ids + * @return + */ + List queryUsersByIds(String ids); + + /** + * 38根据多个部门编码(逗号分隔),查询返回多个部门信息 + * @param orgCodes + * @return + */ + List queryDepartsByOrgcodes(String orgCodes); + + /** + * 39根据多个部门id(逗号分隔),查询返回多个部门信息 + * @param ids + * @return + */ + List queryDepartsByIds(String ids); + + /** + * 40发送邮件消息 + * @param email + * @param title + * @param content + */ + void sendEmailMsg(String email,String title,String content); + + /** + * 41根据部门id查询部门所有的父级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:50 + * @param departId 部门id + * @return JSONObject + */ + List listParentDepartsByDepId(String departId); + + /** + * 42根据部门id查询部门所有的子级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:54 + * @param departId 部门id + * @return JSONObject + */ + List listSonDepartsByDepId(String departId); + +} diff --git a/jero-boot-base/jero-boot-base-core/pom.xml b/jero-boot-base/jero-boot-base-core/pom.xml new file mode 100644 index 00000000..65a97511 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/pom.xml @@ -0,0 +1,244 @@ + + + com.jero.boot + jero-boot-base + 2.4.2 + + 4.0.0 + + jero-boot-base-core + + + + aliyun + aliyun Repository + http://maven.aliyun.com/nexus/content/groups/public + + false + + + + jeecg + jeecg Repository + http://maven.jeecg.org/nexus/content/repositories/jeecg + + false + + + + + + + + + com.jero.boot + jero-boot-base-tools + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-validation + + + + + commons-io + commons-io + ${commons.version} + + + commons-lang + commons-lang + ${commons.version} + + + + org.springframework.boot + spring-boot-starter-freemarker + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-datasource-spring-boot-starter.version} + + + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + runtime + + + + com.microsoft.sqlserver + sqljdbc4 + ${sqljdbc4.version} + runtime + + + + com.oracle + ojdbc6 + ${ojdbc6.version} + runtime + + + + org.postgresql + postgresql + ${postgresql.version} + runtime + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + com.auth0 + java-jwt + ${java-jwt.version} + + + + + org.apache.shiro + shiro-spring-boot-starter + ${shiro.version} + + + org.hibernate + hibernate-core + + + commons-collections + commons-collections + + + + + + org.crazycake + shiro-redis + ${shiro-redis.version} + + + org.apache.shiro + shiro-core + + + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j-spring-boot-starter.version} + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.apache.commons + commons-pool2 + + + + + org.jeecgframework + autopoi-web + ${autopoi-web.version} + + + commons-codec + commons-codec + + + + + + + io.minio + minio + + + com.google.guava + guava + ${guava.version} + + + + + com.aliyun + aliyun-java-sdk-dysmsapi + ${aliyun-java-sdk-dysmsapi.version} + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.oss.version} + + + + com.xkcoding.justauth + justauth-spring-boot-starter + + + com.squareup.okhttp3 + okhttp + + + p6spy + p6spy + + + + \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/CommonAPI.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/CommonAPI.java new file mode 100644 index 00000000..e76148d0 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/CommonAPI.java @@ -0,0 +1,97 @@ +package com.jero.common.api; + +import com.jero.common.system.vo.*; + +import java.util.List; +import java.util.Set; + +public interface CommonAPI { + + /** + * 1查询用户角色信息 + * @param username + * @return + */ + Set queryUserRoles(String username); + + + /** + * 2查询用户权限信息 + * @param username + * @return + */ + Set queryUserAuths(String username); + + /** + * 3根据 id 查询数据库中存储的 DynamicDataSourceModel + * + * @param dbSourceId + * @return + */ + DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId); + + /** + * 4根据 code 查询数据库中存储的 DynamicDataSourceModel + * + * @param dbSourceCode + * @return + */ + DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode); + + /** + * 5根据用户账号查询用户信息 + * @param username + * @return + */ + public LoginUser getUserByName(String username); + + + /** + * 6字典表的 翻译 + * @param table + * @param text + * @param code + * @param key + * @return + */ + String translateDictFromTable(String table, String text, String code, String key); + + /** + * 7普通字典的翻译 + * @param code + * @param key + * @return + */ + String translateDict(String code, String key); + + /** + * 8查询数据权限 + * @return + */ + List queryPermissionDataRule(String component, String requestPath, String username); + + + /** + * 9查询用户信息 + * @param username + * @return + */ + SysUserCacheInfo getCacheUser(String username); + + /** + * 10获取数据字典 + * @param code + * @return + */ + public List queryDictItemsByCode(String code); + + /** + * 13获取表数据字典 + * @param table + * @param text + * @param code + * @return + */ + List queryTableDictItemsByCode(String table, String text, String code); + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/IWpsBaseAPI.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/IWpsBaseAPI.java new file mode 100644 index 00000000..c81a9412 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/IWpsBaseAPI.java @@ -0,0 +1,24 @@ +package com.jero.common.api; + +import com.jero.common.api.vo.OaWpsModel; + +/** + * @Description: WPS通用接口 + * @Author: wangshuai + * @Date:20200709 + * @Version:V1.0 + */ +public interface IWpsBaseAPI { + + /*根据模板id获取模板信息*/ + OaWpsModel getById(String id); + + /*根据文件路径下载文件*/ + void downloadOosFiles(String objectName, String basePath,String fileName); + + /*WPS 设置数据存储,用于逻辑判断*/ + void context(String type,String text); + + /*删除WPS模板相关信息*/ + void deleteById(String id); +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileDownDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileDownDTO.java new file mode 100644 index 00000000..470020f6 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileDownDTO.java @@ -0,0 +1,30 @@ +package com.jero.common.api.dto; + +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.io.Serializable; + +/** + * 文件下载 + * cloud api 用到的接口传输对象 + */ +@Data +public class FileDownDTO implements Serializable { + + private static final long serialVersionUID = 6749126258686446019L; + + private String filePath; + private String uploadpath; + private String uploadType; + private HttpServletResponse response; + + public FileDownDTO(){} + + public FileDownDTO(String filePath, String uploadpath, String uploadType,HttpServletResponse response){ + this.filePath = filePath; + this.uploadpath = uploadpath; + this.uploadType = uploadType; + this.response = response; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileUploadDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileUploadDTO.java new file mode 100644 index 00000000..b5afc12a --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/FileUploadDTO.java @@ -0,0 +1,55 @@ +package com.jero.common.api.dto; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.io.Serializable; + +/** + * 文件上传 + * cloud api 用到的接口传输对象 + */ +@Data +public class FileUploadDTO implements Serializable { + + private static final long serialVersionUID = -4111953058578954386L; + + private MultipartFile file; + + private String bizPath; + + private String uploadType; + + private String customBucket; + + public FileUploadDTO(){ + + } + + /** + * 简单上传 构造器1 + * @param file + * @param bizPath + * @param uploadType + */ + public FileUploadDTO(MultipartFile file,String bizPath,String uploadType){ + this.file = file; + this.bizPath = bizPath; + this.uploadType = uploadType; + } + + /** + * 申明桶 文件上传 构造器2 + * @param file + * @param bizPath + * @param uploadType + * @param customBucket + */ + public FileUploadDTO(MultipartFile file,String bizPath,String uploadType,String customBucket){ + this.file = file; + this.bizPath = bizPath; + this.uploadType = uploadType; + this.customBucket = customBucket; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/LogDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/LogDTO.java new file mode 100644 index 00000000..b3250617 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/LogDTO.java @@ -0,0 +1,68 @@ +package com.jero.common.api.dto; +import lombok.Data; +import com.jero.common.system.vo.LoginUser; +import java.io.Serializable; +import java.util.Date; + +/** + * 日志对象 + * cloud api 用到的接口传输对象 + */ +@Data +public class LogDTO implements Serializable { + + private static final long serialVersionUID = 8482720462943906924L; + + /**内容*/ + private String logContent; + + /**日志类型(0:操作日志;1:登录日志;2:定时任务) */ + private Integer logType; + + /**操作类型(1:添加;2:修改;3:删除;) */ + private Integer operateType; + + /**登录用户 */ + private LoginUser loginUser; + + private String id; + private String createBy; + private Date createTime; + private Long costTime; + private String ip; + + /**请求参数 */ + private String requestParam; + + /**请求类型*/ + private String requestType; + + /**请求路径*/ + private String requestUrl; + + /**请求方法 */ + private String method; + + /**操作人用户名称*/ + private String username; + + /**操作人用户账户*/ + private String userid; + + public LogDTO(){ + + } + + public LogDTO(String logContent, Integer logType, Integer operatetype){ + this.logContent = logContent; + this.logType = logType; + this.operateType = operatetype; + } + + public LogDTO(String logContent, Integer logType, Integer operatetype, LoginUser loginUser){ + this.logContent = logContent; + this.logType = logType; + this.operateType = operatetype; + this.loginUser = loginUser; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/OnlineAuthDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/OnlineAuthDTO.java new file mode 100644 index 00000000..a5fa8f19 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/OnlineAuthDTO.java @@ -0,0 +1,41 @@ +package com.jero.common.api.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * online 拦截器权限判断 + * cloud api 用到的接口传输对象 + */ +@Data +public class OnlineAuthDTO implements Serializable { + private static final long serialVersionUID = 1771827545416418203L; + + + /** + * 用户名 + */ + private String username; + + /** + * 可能的请求地址 + */ + private List possibleUrl; + + /** + * online开发的菜单地址 + */ + private String onlineFormUrl; + + public OnlineAuthDTO(){ + + } + + public OnlineAuthDTO(String username, List possibleUrl, String onlineFormUrl){ + this.username = username; + this.possibleUrl = possibleUrl; + this.onlineFormUrl = onlineFormUrl; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusMessageDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusMessageDTO.java new file mode 100644 index 00000000..1a77d2ba --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusMessageDTO.java @@ -0,0 +1,43 @@ +package com.jero.common.api.dto.message; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 带业务参数的消息 + */ +@Data +public class BusMessageDTO extends MessageDTO implements Serializable { + + private static final long serialVersionUID = 9104793287983367669L; + /** + * 业务类型 + */ + private String busType; + + /** + * 业务id + */ + private String busId; + + public BusMessageDTO(){ + + } + + /** + * 构造 带业务参数的消息 + * @param fromUser + * @param toUser + * @param title + * @param msgContent + * @param msgCategory + * @param busType + * @param busId + */ + public BusMessageDTO(String fromUser, String toUser, String title, String msgContent, String msgCategory, String busType, String busId){ + super(fromUser, toUser, title, msgContent, msgCategory); + this.busId = busId; + this.busType = busType; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusTemplateMessageDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusTemplateMessageDTO.java new file mode 100644 index 00000000..90114376 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/BusTemplateMessageDTO.java @@ -0,0 +1,45 @@ +package com.jero.common.api.dto.message; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * 带业务参数的模板消息 + */ +@Data +public class BusTemplateMessageDTO extends TemplateMessageDTO implements Serializable { + + private static final long serialVersionUID = -4277810906346929459L; + + /** + * 业务类型 + */ + private String busType; + + /** + * 业务id + */ + private String busId; + + public BusTemplateMessageDTO(){ + + } + + /** + * 构造 带业务参数的模板消息 + * @param fromUser + * @param toUser + * @param title + * @param templateParam + * @param templateCode + * @param busType + * @param busId + */ + public BusTemplateMessageDTO(String fromUser, String toUser, String title, Map templateParam, String templateCode, String busType, String busId){ + super(fromUser, toUser, title, templateParam, templateCode); + this.busId = busId; + this.busType = busType; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/MessageDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/MessageDTO.java new file mode 100644 index 00000000..5b6bd389 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/MessageDTO.java @@ -0,0 +1,69 @@ +package com.jero.common.api.dto.message; + +import lombok.Data; +import com.jero.common.constant.CommonConstant; + +import java.io.Serializable; + +/** + * 普通消息 + */ +@Data +public class MessageDTO implements Serializable { + + private static final long serialVersionUID = -5690444483968058442L; + + /** + * 发送人(用户登录账户) + */ + protected String fromUser; + + /** + * 发送给(用户登录账户) + */ + protected String toUser; + + /** + * 消息主题 + */ + protected String title; + + /** + * 消息内容 + */ + protected String content; + + /** + * 消息类型 1:消息 2:系统消息 + */ + protected String category; + + + public MessageDTO(){ + + } + + /** + * 构造器1 系统消息 + */ + public MessageDTO(String fromUser,String toUser,String title, String content){ + this.fromUser = fromUser; + this.toUser = toUser; + this.title = title; + this.content = content; + //默认 都是2系统消息 + this.category = CommonConstant.MSG_CATEGORY_2; + } + + /** + * 构造器2 支持设置category 1:消息 2:系统消息 + */ + public MessageDTO(String fromUser,String toUser,String title, String content, String category){ + this.fromUser = fromUser; + this.toUser = toUser; + this.title = title; + this.content = content; + this.category = category; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateDTO.java new file mode 100644 index 00000000..f2999de3 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateDTO.java @@ -0,0 +1,37 @@ +package com.jero.common.api.dto.message; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * 消息模板dto + */ +@Data +public class TemplateDTO implements Serializable { + + private static final long serialVersionUID = 5848247133907528650L; + + /** + * 模板编码 + */ + protected String templateCode; + + /** + * 模板参数 + */ + protected Map templateParam; + + /** + * 构造器 通过设置模板参数和模板编码 作为参数获取消息内容 + */ + public TemplateDTO(String templateCode, Map templateParam){ + this.templateCode = templateCode; + this.templateParam = templateParam; + } + + public TemplateDTO(){ + + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateMessageDTO.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateMessageDTO.java new file mode 100644 index 00000000..e0944a0b --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/dto/message/TemplateMessageDTO.java @@ -0,0 +1,48 @@ +package com.jero.common.api.dto.message; + +import lombok.Data; +import java.io.Serializable; +import java.util.Map; + +/** + * 模板消息 + */ +@Data +public class TemplateMessageDTO extends TemplateDTO implements Serializable { + + private static final long serialVersionUID = 411137565170647585L; + + + /** + * 发送人(用户登录账户) + */ + protected String fromUser; + + /** + * 发送给(用户登录账户) + */ + protected String toUser; + + /** + * 消息主题 + */ + protected String title; + + + public TemplateMessageDTO(){ + + } + + /** + * 构造器1 发模板消息用 + */ + public TemplateMessageDTO(String fromUser, String toUser,String title, Map templateParam, String templateCode){ + super(templateCode, templateParam); + this.fromUser = fromUser; + this.toUser = toUser; + this.title = title; + } + + + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/OaWpsModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/OaWpsModel.java new file mode 100644 index 00000000..f970c269 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/OaWpsModel.java @@ -0,0 +1,107 @@ +package com.jero.common.api.vo; + +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 com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: 文档 + * @Author: jero-boot + * @Date: 2020-06-09 + * @Version: V1.0 + */ +@Data +@TableName("oa_wps_file") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "oa_wps_file对象", description = "文档") +public class OaWpsModel implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /** + * name + */ + @Excel(name = "name", width = 15) + @ApiModelProperty(value = "name") + private String name; + /** + * version + */ + @Excel(name = "version", width = 15) + @ApiModelProperty(value = "version") + private Integer version; + /** + * size + */ + @Excel(name = "size", width = 15) + @ApiModelProperty(value = "size") + private Integer size; + /** + * downloadUrl + */ + @Excel(name = "downloadUrl", width = 15) + @ApiModelProperty(value = "downloadUrl") + private String downloadUrl; + /** + * deleted + */ + @Excel(name = "deleted", width = 15) + @ApiModelProperty(value = "deleted") + private String deleted; + /** + * canDelete + */ + @Excel(name = "canDelete", width = 15) + @ApiModelProperty(value = "canDelete") + private String canDelete; + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + private String createBy; + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty(value = "创建时间") + private Date createTime; + /** + * 更新人 + */ + @ApiModelProperty(value = "更新人") + private String updateBy; + /** + * 更新时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty(value = "更新时间") + private Date updateTime; + /** + * 组织机构编码 + */ + @ApiModelProperty(value = "组织机构编码") + private String sysOrgCode; + + @TableField(exist = false) + private String userId; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/Result.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/Result.java new file mode 100644 index 00000000..2bb004d0 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/api/vo/Result.java @@ -0,0 +1,143 @@ +package com.jero.common.api.vo; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import com.jero.common.constant.CommonConstant; +import lombok.Data; + +/** + * 接口返回数据格式 + * @author scott + * @date 2019年1月19日 + */ +@Data +@ApiModel(value="接口返回对象", description="接口返回对象") +public class Result implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 成功标志 + */ + @ApiModelProperty(value = "成功标志") + private boolean success = true; + + /** + * 返回处理消息 + */ + @ApiModelProperty(value = "返回处理消息") + private String message = "操作成功!"; + + /** + * 返回代码 + */ + @ApiModelProperty(value = "返回代码") + private Integer code = 0; + + /** + * 返回数据对象 data + */ + @ApiModelProperty(value = "返回数据对象") + private T result; + + /** + * 时间戳 + */ + @ApiModelProperty(value = "时间戳") + private long timestamp = System.currentTimeMillis(); + + public Result() { + + } + + public Result success(String message) { + this.message = message; + this.code = CommonConstant.SC_OK_200; + this.success = true; + return this; + } + + @Deprecated + public static Result ok() { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage("成功"); + return r; + } + + @Deprecated + public static Result ok(String msg) { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage(msg); + return r; + } + + @Deprecated + public static Result ok(Object data) { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setResult(data); + return r; + } + + public static Result OK() { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage("成功"); + return r; + } + + public static Result OK(T data) { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setResult(data); + return r; + } + + public static Result OK(String msg, T data) { + Result r = new Result(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage(msg); + r.setResult(data); + return r; + } + + public static Result error(String msg) { + return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg); + } + + public static Result error(int code, String msg) { + Result r = new Result(); + r.setCode(code); + r.setMessage(msg); + r.setSuccess(false); + return r; + } + + public Result error500(String message) { + this.message = message; + this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500; + this.success = false; + return this; + } + /** + * 无权限访问返回结果 + */ + public static Result noauth(String msg) { + return error(CommonConstant.SC_JERO_NO_AUTHZ, msg); + } + + @JsonIgnore + private String onlTable; + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/AutoLogAspect.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/AutoLogAspect.java new file mode 100644 index 00000000..866e6227 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/AutoLogAspect.java @@ -0,0 +1,268 @@ +package com.jero.common.aspect; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.PropertyFilter; +import org.apache.shiro.SecurityUtils; +import org.aspectj.lang.JoinPoint; +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 com.jero.common.api.dto.LogDTO; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.AutoLog; +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.enums.ModuleType; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.IPUtils; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Date; + + +/** + * 系统日志,切面处理类 + * + * @Author scott + * @Date 2018年1月14日 + */ +@Aspect +@Component +public class AutoLogAspect { + + @Resource + private BaseCommonService baseCommonService; + + @Pointcut("@annotation(com.jero.common.aspect.annotation.AutoLog)") + public void logPointCut() { + + } + + @Around("logPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + long beginTime = System.currentTimeMillis(); + //执行方法 + Object result = point.proceed(); + //执行时长(毫秒) + long time = System.currentTimeMillis() - beginTime; + + //保存日志 + saveSysLog(point, time, result); + + return result; + } + + private void saveSysLog(ProceedingJoinPoint joinPoint, long time, Object obj) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogDTO dto = new LogDTO(); + AutoLog syslog = method.getAnnotation(AutoLog.class); + if(syslog != null){ + //update-begin-author:taoyan date: + String content = syslog.value(); + if(syslog.module()== ModuleType.ONLINE){ + content = getOnlineLogContent(obj, content); + } + //注解上的描述,操作日志内容 + dto.setLogType(syslog.logType()); + dto.setLogContent(content); + } + + //请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = signature.getName(); + dto.setMethod(className + "." + methodName + "()"); + + + //设置操作类型 + if (dto.getLogType() == CommonConstant.LOG_TYPE_2) { + dto.setOperateType(getOperateType(methodName, syslog.operateType())); + } + + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //请求的参数 + dto.setRequestParam(getReqestParams(request,joinPoint)); + //设置IP地址 + dto.setIp(IPUtils.getIpAddr(request)); + //获取登录用户信息 + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser!=null){ + dto.setUserid(sysUser.getUsername()); + dto.setUsername(sysUser.getRealname()); + + } + //耗时 + dto.setCostTime(time); + dto.setCreateTime(new Date()); + //保存系统日志 + baseCommonService.addLog(dto); + } + + + /** + * 获取操作类型 + */ + private int getOperateType(String methodName,int operateType) { + if (operateType > 0) { + return operateType; + } + if (methodName.startsWith("list")) { + return CommonConstant.OPERATE_TYPE_1; + } + if (methodName.startsWith("add")) { + return CommonConstant.OPERATE_TYPE_2; + } + if (methodName.startsWith("edit")) { + return CommonConstant.OPERATE_TYPE_3; + } + if (methodName.startsWith("delete")) { + return CommonConstant.OPERATE_TYPE_4; + } + if (methodName.startsWith("import")) { + return CommonConstant.OPERATE_TYPE_5; + } + if (methodName.startsWith("export")) { + return CommonConstant.OPERATE_TYPE_6; + } + return CommonConstant.OPERATE_TYPE_1; + } + + /** + * @Description: 获取请求参数 + * @author: scott + * @date: 2020/4/16 0:10 + * @param request: request + * @param joinPoint: joinPoint + * @Return: java.lang.String + */ + private String getReqestParams(HttpServletRequest request, JoinPoint joinPoint) { + String httpMethod = request.getMethod(); + String params = ""; + if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) || "PATCH".equals(httpMethod)) { + Object[] paramsArray = joinPoint.getArgs(); + // java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false) + // https://my.oschina.net/mengzhang6/blog/2395893 + Object[] arguments = new Object[paramsArray.length]; + for (int i = 0; i < paramsArray.length; i++) { + if (paramsArray[i] instanceof ServletRequest || paramsArray[i] instanceof ServletResponse || paramsArray[i] instanceof MultipartFile) { + //ServletRequest不能序列化,从入参里排除,否则报异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false) + //ServletResponse不能序列化 从入参里排除,否则报异常:java.lang.IllegalStateException: getOutputStream() has already been called for this response + continue; + } + arguments[i] = paramsArray[i]; + } + //update-begin-author:taoyan date:20200724 for:日志数据太长的直接过滤掉 + PropertyFilter profilter = new PropertyFilter() { + @Override + public boolean apply(Object o, String name, Object value) { + if(value!=null && value.toString().length()>500){ + return false; + } + return true; + } + }; + params = JSONObject.toJSONString(arguments, profilter); + //update-end-author:taoyan date:20200724 for:日志数据太长的直接过滤掉 + } else { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + // 请求的方法参数值 + Object[] args = joinPoint.getArgs(); + // 请求的方法参数名称 + LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); + String[] paramNames = u.getParameterNames(method); + if (args != null && paramNames != null) { + for (int i = 0; i < args.length; i++) { + params += " " + paramNames[i] + ": " + args[i]; + } + } + } + return params; + } + + /** + * online日志内容拼接 + * @param obj + * @param content + * @return + */ + private String getOnlineLogContent(Object obj, String content){ + if (Result.class.isInstance(obj)){ + Result res = (Result)obj; + String msg = res.getMessage(); + String tableName = res.getOnlTable(); + if(oConvertUtils.isNotEmpty(tableName)){ + content+=",表名:"+tableName; + } + if(res.isSuccess()){ + content+= ","+(oConvertUtils.isEmpty(msg)?"操作成功":msg); + }else{ + content+= ","+(oConvertUtils.isEmpty(msg)?"操作失败":msg); + } + } + return content; + } + + + /* private void saveSysLog(ProceedingJoinPoint joinPoint, long time, Object obj) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + SysLog sysLog = new SysLog(); + AutoLog syslog = method.getAnnotation(AutoLog.class); + if(syslog != null){ + //update-begin-author:taoyan date: + String content = syslog.value(); + if(syslog.module()== ModuleType.ONLINE){ + content = getOnlineLogContent(obj, content); + } + //注解上的描述,操作日志内容 + sysLog.setLogContent(content); + sysLog.setLogType(syslog.logType()); + } + + //请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = signature.getName(); + sysLog.setMethod(className + "." + methodName + "()"); + + + //设置操作类型 + if (sysLog.getLogType() == CommonConstant.LOG_TYPE_2) { + sysLog.setOperateType(getOperateType(methodName, syslog.operateType())); + } + + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //请求的参数 + sysLog.setRequestParam(getReqestParams(request,joinPoint)); + + //设置IP地址 + sysLog.setIp(IPUtils.getIpAddr(request)); + + //获取登录用户信息 + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + if(sysUser!=null){ + sysLog.setUserid(sysUser.getUsername()); + sysLog.setUsername(sysUser.getRealname()); + + } + //耗时 + sysLog.setCostTime(time); + sysLog.setCreateTime(new Date()); + //保存系统日志 + sysLogService.save(sysLog); + }*/ +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/DictAspect.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/DictAspect.java new file mode 100644 index 00000000..938942c4 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/DictAspect.java @@ -0,0 +1,212 @@ +package com.jero.common.aspect; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import com.jero.common.api.CommonAPI; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.Dict; +import com.jero.common.constant.CommonConstant; +import com.jero.common.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @Description: 字典aop类 + * @Author: dangzhenghui + * @Date: 2019-3-17 21:50 + * @Version: 1.0 + */ +@Aspect +@Component +@Slf4j +public class DictAspect { + + @Autowired + private CommonAPI commonAPI; + + // 定义切点Pointcut + @Pointcut("execution(public * com.jero.modules..*.*Controller.*(..))") + public void excudeService() { + } + + @Pointcut("@annotation(com.jero.common.aspect.annotation.DictPoint)") + public void dictPointCut() { + } + + @Around("excudeService()") + public Object doAround(ProceedingJoinPoint pjp) throws Throwable { + long time1 = System.currentTimeMillis(); + Object result = pjp.proceed(); + long time2 = System.currentTimeMillis(); + log.debug("获取JSON数据 耗时:" + (time2 - time1) + "ms"); + long start = System.currentTimeMillis(); + this.parseDictText(result); + long end = System.currentTimeMillis(); + log.debug("解析注入JSON数据 耗时" + (end - start) + "ms"); + return result; + } + + @Around("dictPointCut()") + public Object arround(ProceedingJoinPoint point) throws Throwable { + long time1 = System.currentTimeMillis(); + Object result = point.proceed(); + long time2 = System.currentTimeMillis(); + log.debug("获取JSON数据 耗时:" + (time2 - time1) + "ms"); + long start = System.currentTimeMillis(); + this.parseMethodDictText(result); + long end = System.currentTimeMillis(); + log.debug("解析注入JSON数据 耗时" + (end - start) + "ms"); + return result; + } + + /** + * 本方法针对返回对象为Result 的IPage的分页列表数据进行动态字典注入 + * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可 ,table字典 code table text配合使用与原来jero的用法相同 + * 示例为SysUser 字段为sex 添加了注解@Dict(dicCode = "sex") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text,已字段名称加_dictText形式返回到前端 + * 例输入当前返回值的就会多出一个sex_dictText字段 + * { + * sex:1, + * sex_dictText:"男" + * } + * 前端直接取值sext_dictText在table里面无需再进行前端的字典转换了 + * customRender:function (text) { + * if(text==1){ + * return "男"; + * }else if(text==2){ + * return "女"; + * }else{ + * return text; + * } + * } + * 目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用 + * @param result + */ + private void parseDictText(Object result) { + if (result instanceof Result) { + if (((Result) result).getResult() instanceof IPage) { + List items = new ArrayList<>(); + for (Object record : ((IPage) ((Result) result).getResult()).getRecords()) { + JSONObject item = translate(record); + items.add(item); + } + ((IPage) ((Result) result).getResult()).setRecords(items); + } + } + } + + /** + * @param result + */ + private void parseMethodDictText(Object result) { + if (result instanceof Result) { + Object result1 = ((Result) result).getResult(); + String jsonStr = JSONUtil.toJsonStr(result1); + if (JSONUtil.isJsonObj(jsonStr)) { + JSONObject translate = translate(result1); + ((Result) result).setResult(translate); + } else { + List items = new ArrayList<>(); + for (Object o : (List) result1) { + JSONObject translate = translate(o); + items.add(translate); + } + ((Result) result).setResult(items); + } + } + } + + /** + * @param record + * @return + */ + private JSONObject translate(Object record) { + ObjectMapper mapper = new ObjectMapper(); + String json = "{}"; + try { + //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat + json = mapper.writeValueAsString(record); + } catch (JsonProcessingException e) { + log.error("json解析失败" + e.getMessage(), e); + } + JSONObject item = JSONObject.parseObject(json); + //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ + //for (Field field : record.getClass().getDeclaredFields()) { + for (Field field : oConvertUtils.getAllFields(record)) { + //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ + if (field.getAnnotation(Dict.class) != null) { + String code = field.getAnnotation(Dict.class).dicCode(); + String text = field.getAnnotation(Dict.class).dicText(); + String table = field.getAnnotation(Dict.class).dictTable(); + String key = String.valueOf(item.get(field.getName())); + + //翻译字典值对应的txt + String textValue = translateDictValue(code, text, table, key); + + log.debug(" 字典Val : " + textValue); + log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue); + item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue); + } + //date类型默认转换string格式化日期 + if (field.getType().getName().equals("java.util.Date") && field.getAnnotation(JsonFormat.class) == null && item.get(field.getName()) != null) { + SimpleDateFormat aDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName())))); + } + } + return item; + } + + /** + * 翻译字典文本 + * + * @param code + * @param text + * @param table + * @param key + * @return + */ + private String translateDictValue(String code, String text, String table, String key) { + if (oConvertUtils.isEmpty(key)) { + return null; + } + StringBuffer textValue = new StringBuffer(); + String[] keys = key.split(","); + for (String k : keys) { + String tmpValue = null; + log.debug(" 字典 key : " + k); + if (k.trim().length() == 0) { + continue; //跳过循环 + } + if (!StringUtils.isEmpty(table)) { + log.debug("--DictAspect------dicTable=" + table + " ,dicText= " + text + " ,dicCode=" + code); + tmpValue = commonAPI.translateDictFromTable(table, text, code, k.trim()); + } else { + tmpValue = commonAPI.translateDict(code, k.trim()); + } + if (tmpValue != null) { + if (!"".equals(textValue.toString())) { + textValue.append(","); + } + textValue.append(tmpValue); + } + + } + return textValue.toString(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/PermissionDataAspect.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/PermissionDataAspect.java new file mode 100644 index 00000000..3781aac4 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/PermissionDataAspect.java @@ -0,0 +1,119 @@ +package com.jero.common.aspect; + +import lombok.extern.slf4j.Slf4j; +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 com.jero.common.api.CommonAPI; +import com.jero.common.aspect.annotation.PermissionData; +import com.jero.common.system.util.JeroDataAutorUtils; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.SysPermissionDataRuleModel; +import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.List; + +/** + * 数据权限切面处理类 + * 当被请求的方法有注解PermissionData时,会在往当前request中写入数据权限信息 + * @Date 2019年4月10日 + * @Version: 1.0 + */ +@Aspect +@Component +@Slf4j +public class PermissionDataAspect { + + @Autowired + private CommonAPI commonAPI; + + @Pointcut("@annotation(com.jero.common.aspect.annotation.PermissionData)") + public void pointCut() { + + } + + @Around("pointCut()") + public Object arround(ProceedingJoinPoint point) throws Throwable{ + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + PermissionData pd = method.getAnnotation(PermissionData.class); + String component = pd.pageComponent(); + + String requestMethod = request.getMethod(); + String requestPath = request.getRequestURI().substring(request.getContextPath().length()); + requestPath = filterUrl(requestPath); + log.debug("拦截请求 >> "+requestPath+";请求类型 >> "+requestMethod); + String username = JwtUtil.getUserNameByToken(request); + //查询数据权限信息 + //TODO 微服务情况下也得支持缓存机制 + List dataRules = commonAPI.queryPermissionDataRule(component, requestPath, username); + if(dataRules!=null && dataRules.size()>0) { + //临时存储 + JeroDataAutorUtils.installDataSearchConditon(request, dataRules); + //TODO 微服务情况下也得支持缓存机制 + SysUserCacheInfo userinfo = commonAPI.getCacheUser(username); + JeroDataAutorUtils.installUserInfo(request, userinfo); + } + return point.proceed(); + } + + private String filterUrl(String requestPath){ + String url = ""; + if(oConvertUtils.isNotEmpty(requestPath)){ + url = requestPath.replace("\\", "/"); + url = requestPath.replace("//", "/"); + if(url.indexOf("//")>=0){ + url = filterUrl(url); + } + /*if(url.startsWith("/")){ + url=url.substring(1); + }*/ + } + return url; + } + + /** + * 获取请求地址 + * @param request + * @return + */ + private String getJgAuthRequsetPath(HttpServletRequest request) { + String queryString = request.getQueryString(); + String requestPath = request.getRequestURI(); + if(oConvertUtils.isNotEmpty(queryString)){ + requestPath += "?" + queryString; + } + if (requestPath.indexOf("&") > -1) {// 去掉其他参数(保留一个参数) 例如:loginController.do?login + requestPath = requestPath.substring(0, requestPath.indexOf("&")); + } + if(requestPath.indexOf("=")!=-1){ + if(requestPath.indexOf(".do")!=-1){ + requestPath = requestPath.substring(0,requestPath.indexOf(".do")+3); + }else{ + requestPath = requestPath.substring(0,requestPath.indexOf("?")); + } + } + requestPath = requestPath.substring(request.getContextPath().length() + 1);// 去掉项目路径 + return filterUrl(requestPath); + } + + private boolean moHuContain(List list,String key){ + for(String str : list){ + if(key.contains(str)){ + return true; + } + } + return false; + } + + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/UrlMatchEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/UrlMatchEnum.java new file mode 100644 index 00000000..03cb3d6f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/UrlMatchEnum.java @@ -0,0 +1,58 @@ +package com.jero.common.aspect; + +/** + * @Author scott + * @Date 2020/1/14 13:36 + * @Description: 请求URL与菜单路由URL转换规则(方便于采用菜单路由URL来配置数据权限规则) + */ +public enum UrlMatchEnum { + CGFORM_DATA("/online/cgform/api/getData/", "/online/cgformList/"), + CGFORM_EXCEL_DATA("/online/cgform/api/exportXls/", "/online/cgformList/"), + CGFORM_TREE_DATA("/online/cgform/api/getTreeData/", "/online/cgformList/"), + CGREPORT_DATA("/online/cgreport/api/getColumnsAndData/", "/online/cgreport/"), + CGREPORT_EXCEL_DATA("/online/cgreport/api/exportXls/", "/online/cgreport/"); + + + UrlMatchEnum(String url, String match_url) { + this.url = url; + this.match_url = match_url; + } + + /** + * Request 请求 URL前缀 + */ + private String url; + /** + * 菜单路由 URL前缀 (对应菜单路径) + */ + private String match_url; + + /** + * 根据req url 获取到菜单配置路径(前端页面路由URL) + * + * @param url + * @return + */ + public static String getMatchResultByUrl(String url) { + //获取到枚举 + UrlMatchEnum[] values = UrlMatchEnum.values(); + //加强for循环进行遍历操作 + for (UrlMatchEnum lr : values) { + //如果遍历获取的type和参数type一致 + if (url.indexOf(lr.url) != -1) { + //返回type对象的desc + return url.replace(lr.url, lr.match_url); + } + } + return null; + } + + +// public static void main(String[] args) { +// /** +// * 比如request真实请求URL: /online/cgform/api/getData/81fcf7d8922d45069b0d5ba983612d3a +// * 转换匹配路由URL后(对应配置的菜单路径):/online/cgformList/81fcf7d8922d45069b0d5ba983612d3a +// */ +// System.out.println(UrlMatchEnum.getMatchResultByUrl("/online/cgform/api/getData/81fcf7d8922d45069b0d5ba983612d3a")); +// } +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/AutoLog.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/AutoLog.java new file mode 100644 index 00000000..1acaeb39 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/AutoLog.java @@ -0,0 +1,45 @@ +package com.jero.common.aspect.annotation; + +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.enums.ModuleType; + +import java.lang.annotation.*; + +/** + * 系统日志注解 + * + * @Author scott + * @Date 2019年1月14日 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface AutoLog { + + /** + * 日志内容 + * + * @return + */ + String value() default ""; + + /** + * 日志类型 + * + * @return 0:操作日志;1:登录日志;2:定时任务; + */ + int logType() default CommonConstant.LOG_TYPE_2; + + /** + * 操作日志类型 + * + * @return (1查询,2添加,3修改,4删除) + */ + int operateType() default 0; + + /** + * 模块类型 默认为common + * @return + */ + ModuleType module() default ModuleType.COMMON; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/Dict.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/Dict.java new file mode 100644 index 00000000..c8adb142 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/Dict.java @@ -0,0 +1,42 @@ +package com.jero.common.aspect.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 类描述: 字典注解 + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Dict { + /** + * 方法描述: 数据code + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + * + * @return 返回类型: String + */ + String dicCode(); + + /** + * 方法描述: 数据Text + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + * + * @return 返回类型: String + */ + String dicText() default ""; + + /** + * 方法描述: 数据字典表 + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + * + * @return 返回类型: String + */ + String dictTable() default ""; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/DictPoint.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/DictPoint.java new file mode 100644 index 00000000..75ff29fc --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/DictPoint.java @@ -0,0 +1,17 @@ +package com.jero.common.aspect.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 字典转换点注解 + * 加到方法上,返回值会返回字典数据 + * @author liJiaRao + * @date 2021-08-02 9:44 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface DictPoint { +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/OnlineAuth.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/OnlineAuth.java new file mode 100644 index 00000000..3fd6f169 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/OnlineAuth.java @@ -0,0 +1,18 @@ +package com.jero.common.aspect.annotation; + +import java.lang.annotation.*; + +/** + * online请求拦截专用注解 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE,ElementType.METHOD}) +@Documented +public @interface OnlineAuth { + + /** + * 请求关键字,在xxx/code之前的字符串 + * @return + */ + String value(); +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/PermissionData.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/PermissionData.java new file mode 100644 index 00000000..600cf144 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/aspect/annotation/PermissionData.java @@ -0,0 +1,29 @@ +package com.jero.common.aspect.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据权限注解 + * @Author taoyan + * @Date 2019年4月11日 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE,ElementType.METHOD}) +@Documented +public @interface PermissionData { + /** + * 暂时没用 + * @return + */ + String value() default ""; + + + /** + * 配置菜单的组件路径,用于数据权限 + */ + String pageComponent() default ""; +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CacheConstant.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CacheConstant.java new file mode 100644 index 00000000..8a456dc6 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CacheConstant.java @@ -0,0 +1,73 @@ +package com.jero.common.constant; + +/** + * @author: huangxutao + * @date: 2019-06-14 + * @description: 缓存常量 + */ +public interface CacheConstant { + + /** + * 字典信息缓存 + */ + public static final String SYS_DICT_CACHE = "sys:cache:dict"; + /** + * 表字典信息缓存 + */ + public static final String SYS_DICT_TABLE_CACHE = "sys:cache:dictTable"; + public static final String SYS_DICT_TABLE_BY_KEYS_CACHE = SYS_DICT_TABLE_CACHE + "ByKeys"; + + /** + * 数据权限配置缓存 + */ + public static final String SYS_DATA_PERMISSIONS_CACHE = "sys:cache:permission:datarules"; + + /** + * 缓存用户信息 + */ + public static final String SYS_USERS_CACHE = "sys:cache:user"; + + /** + * 全部部门信息缓存 + */ + public static final String SYS_DEPARTS_CACHE = "sys:cache:depart:alldata"; + + + /** + * 全部部门ids缓存 + */ + public static final String SYS_DEPART_IDS_CACHE = "sys:cache:depart:allids"; + + + /** + * 测试缓存key + */ + public static final String TEST_DEMO_CACHE = "test:demo"; + + /** + * 字典信息缓存 + */ + public static final String SYS_DYNAMICDB_CACHE = "sys:cache:dbconnect:dynamic:"; + + /** + * gateway路由缓存 + */ + public static final String GATEWAY_ROUTES = "gateway_routes"; + + + /** + * gateway路由 reload key + */ + public static final String ROUTE_JVM_RELOAD_TOPIC = "gateway_jvm_route_reload_topic"; + + /** + * TODO 冗余代码 待删除 + *插件商城排行榜 + */ + public static final String PLUGIN_MALL_RANKING = "pluginMall::rankingList"; + /** + * TODO 冗余代码 待删除 + *插件商城排行榜 + */ + public static final String PLUGIN_MALL_PAGE_LIST = "pluginMall::queryPageList"; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonConstant.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonConstant.java new file mode 100644 index 00000000..dd256592 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonConstant.java @@ -0,0 +1,308 @@ +package com.jero.common.constant; + +public interface CommonConstant { + + /** + * 正常状态 + */ + public static final Integer STATUS_NORMAL = 0; + + /** + * 禁用状态 + */ + public static final Integer STATUS_DISABLE = -1; + + /** + * 删除标志 + */ + public static final Integer DEL_FLAG_1 = 1; + + /** + * 未删除 + */ + public static final Integer DEL_FLAG_0 = 0; + + /** + * 系统日志类型: 登录 + */ + public static final int LOG_TYPE_1 = 1; + + /** + * 系统日志类型: 操作 + */ + public static final int LOG_TYPE_2 = 2; + + /** + * 操作日志类型: 查询 + */ + public static final int OPERATE_TYPE_1 = 1; + + /** + * 操作日志类型: 添加 + */ + public static final int OPERATE_TYPE_2 = 2; + + /** + * 操作日志类型: 更新 + */ + public static final int OPERATE_TYPE_3 = 3; + + /** + * 操作日志类型: 删除 + */ + public static final int OPERATE_TYPE_4 = 4; + + /** + * 操作日志类型: 倒入 + */ + public static final int OPERATE_TYPE_5 = 5; + + /** + * 操作日志类型: 导出 + */ + public static final int OPERATE_TYPE_6 = 6; + + + /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ + public static final Integer SC_INTERNAL_SERVER_ERROR_500 = 500; + /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ + public static final Integer SC_OK_200 = 200; + + /**访问权限认证未通过 510*/ + public static final Integer SC_JERO_NO_AUTHZ=510; + + /** 登录用户Shiro权限缓存KEY前缀 */ + public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:com.jero.config.shiro.ShiroRealm.authorizationCache:"; + /** 登录用户Token令牌缓存KEY前缀 */ + public static final String PREFIX_USER_TOKEN = "prefix_user_token_"; + /** Token缓存时间:3600秒即一小时 */ + public static final int TOKEN_EXPIRE_TIME = 3600; + + + /** + * 0:一级菜单 + */ + public static final Integer MENU_TYPE_0 = 0; + /** + * 1:子菜单 + */ + public static final Integer MENU_TYPE_1 = 1; + /** + * 2:按钮权限 + */ + public static final Integer MENU_TYPE_2 = 2; + + /**通告对象类型(USER:指定用户,ALL:全体用户)*/ + public static final String MSG_TYPE_UESR = "USER"; + public static final String MSG_TYPE_ALL = "ALL"; + + /**发布状态(0未发布,1已发布,2已撤销)*/ + public static final String NO_SEND = "0"; + public static final String HAS_SEND = "1"; + public static final String HAS_CANCLE = "2"; + + /**阅读状态(0未读,1已读)*/ + public static final String HAS_READ_FLAG = "1"; + public static final String NO_READ_FLAG = "0"; + + /**优先级(L低,M中,H高)*/ + public static final String PRIORITY_L = "L"; + public static final String PRIORITY_M = "M"; + public static final String PRIORITY_H = "H"; + + /** + * 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 + */ + public static final String SMS_TPL_TYPE_0 = "0"; + public static final String SMS_TPL_TYPE_1 = "1"; + public static final String SMS_TPL_TYPE_2 = "2"; + + /** + * 状态(0无效1有效) + */ + public static final String STATUS_0 = "0"; + public static final String STATUS_1 = "1"; + + /** + * 同步工作流引擎1同步0不同步 + */ + public static final Integer ACT_SYNC_1 = 1; + public static final Integer ACT_SYNC_0 = 0; + + /** + * 消息类型1:通知公告2:系统消息 + */ + public static final String MSG_CATEGORY_1 = "1"; + public static final String MSG_CATEGORY_2 = "2"; + + /** + * 是否配置菜单的数据权限 1是0否 + */ + public static final Integer RULE_FLAG_0 = 0; + public static final Integer RULE_FLAG_1 = 1; + + /** + * 是否用户已被冻结 1正常(解冻) 2冻结 + */ + public static final Integer USER_UNFREEZE = 1; + public static final Integer USER_FREEZE = 2; + + /**字典翻译文本后缀*/ + public static final String DICT_TEXT_SUFFIX = "_dictText"; + + /** + * 表单设计器主表类型 + */ + public static final Integer DESIGN_FORM_TYPE_MAIN = 1; + + /** + * 表单设计器子表表类型 + */ + public static final Integer DESIGN_FORM_TYPE_SUB = 2; + + /** + * 表单设计器URL授权通过 + */ + public static final Integer DESIGN_FORM_URL_STATUS_PASSED = 1; + + /** + * 表单设计器URL授权未通过 + */ + public static final Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2; + + /** + * 表单设计器新增 Flag + */ + public static final String DESIGN_FORM_URL_TYPE_ADD = "add"; + /** + * 表单设计器修改 Flag + */ + public static final String DESIGN_FORM_URL_TYPE_EDIT = "edit"; + /** + * 表单设计器详情 Flag + */ + public static final String DESIGN_FORM_URL_TYPE_DETAIL = "detail"; + /** + * 表单设计器复用数据 Flag + */ + public static final String DESIGN_FORM_URL_TYPE_REUSE = "reuse"; + /** + * 表单设计器编辑 Flag (已弃用) + */ + public static final String DESIGN_FORM_URL_TYPE_VIEW = "view"; + + /** + * online参数值设置(是:Y, 否:N) + */ + public static final String ONLINE_PARAM_VAL_IS_TURE = "Y"; + public static final String ONLINE_PARAM_VAL_IS_FALSE = "N"; + + /** + * 文件上传类型(本地:local,Minio:minio,阿里云:alioss) + */ + public static final String UPLOAD_TYPE_LOCAL = "local"; + public static final String UPLOAD_TYPE_MINIO = "minio"; + public static final String UPLOAD_TYPE_OSS = "alioss"; + + /** + * 文档上传自定义桶名称 + */ + public static final String UPLOAD_CUSTOM_BUCKET = "eoafile"; + /** + * 文档上传自定义路径 + */ + public static final String UPLOAD_CUSTOM_PATH = "eoafile"; + /** + * 文件外链接有效天数 + */ + public static final Integer UPLOAD_EFFECTIVE_DAYS = 1; + + /** + * 员工身份 (1:普通员工 2:上级) + */ + public static final Integer USER_IDENTITY_1 = 1; + public static final Integer USER_IDENTITY_2 = 2; + + /** sys_user 表 username 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_SYS_USER_USERNAME = "uniq_sys_user_username"; + /** sys_user 表 work_no 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_SYS_USER_WORK_NO = "uniq_sys_user_work_no"; + /** sys_user 表 phone 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_SYS_USER_PHONE = "uniq_sys_user_phone"; + /** sys_user 表 email 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_SYS_USER_EMAIL = "uniq_sys_user_email"; + /** sys_quartz_job 表 job_class_name 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_JOB_CLASS_NAME = "uniq_job_class_name"; + /** sys_position 表 code 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_CODE = "uniq_code"; + /** sys_role 表 code 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_SYS_ROLE_CODE = "uniq_sys_role_role_code"; + /** sys_depart 表 code 唯一键索引 */ + public static final String SQL_INDEX_UNIQ_DEPART_ORG_CODE = "uniq_depart_org_code"; + /** + * 在线聊天 是否为默认分组 + */ + public static final String IM_DEFAULT_GROUP = "1"; + /** + * 在线聊天 图片文件保存路径 + */ + public static final String IM_UPLOAD_CUSTOM_PATH = "imfile"; + /** + * 在线聊天 用户状态 + */ + public static final String IM_STATUS_ONLINE = "online"; + + /** + * 在线聊天 SOCKET消息类型 + */ + public static final String IM_SOCKET_TYPE = "chatMessage"; + + /** + * 在线聊天 是否开启默认添加好友 1是 0否 + */ + public static final String IM_DEFAULT_ADD_FRIEND = "1"; + + /** + * 在线聊天 用户好友缓存前缀 + */ + public static final String IM_PREFIX_USER_FRIEND_CACHE = "im_prefix_user_friend_"; + + /** + * 考勤补卡业务状态 (1:同意 2:不同意) + */ + public static final String SIGN_PATCH_BIZ_STATUS_1 = "1"; + public static final String SIGN_PATCH_BIZ_STATUS_2 = "2"; + + /** + * 公文文档上传自定义路径 + */ + public static final String UPLOAD_CUSTOM_PATH_OFFICIAL = "officialdoc"; + /** + * 公文文档下载自定义路径 + */ + public static final String DOWNLOAD_CUSTOM_PATH_OFFICIAL = "officaldown"; + + /** + * WPS存储值类别(1 code文号 2 text(WPS模板还是公文发文模板)) + */ + public static final String WPS_TYPE_1="1"; + public static final String WPS_TYPE_2="2"; + + + public final static String X_ACCESS_TOKEN = "X-Access-Token"; + + /** + * 多租户 请求头 + */ + public final static String TENANT_ID = "tenant_id"; + + /** + * 微服务读取配置文件属性 服务地址 + */ + public final static String CLOUD_SERVER_KEY = "spring.cloud.nacos.discovery.server-addr"; + + /** + * 第三方登录 验证密码/创建用户 都需要设置一个操作码 防止被恶意调用 + */ + public final static String THIRD_LOGIN_CODE = "third_login_code"; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonSendStatus.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonSendStatus.java new file mode 100644 index 00000000..34479da6 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/CommonSendStatus.java @@ -0,0 +1,24 @@ +package com.jero.common.constant; + +/** + * 系统通告 - 发布状态 + * @Author LeeShaoQing + * + */ +public interface CommonSendStatus { + + public static final String UNPUBLISHED_STATUS_0 = "0"; //未发布 + + public static final String PUBLISHED_STATUS_1 = "1"; //已发布 + + public static final String REVOKE_STATUS_2 = "2"; //撤销 + + + + /**流程催办——系统通知消息模板*/ + public static final String TZMB_BPM_CUIBAN = "bpm_cuiban"; + /**标准模板—系统消息通知*/ + public static final String TZMB_SYS_TS_NOTE = "sys_ts_note"; + /**流程超时提醒——系统通知消息模板*/ + public static final String TZMB_BPM_CHAOSHI_TIP = "bpm_chaoshi_tip"; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/DataBaseConstant.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/DataBaseConstant.java new file mode 100644 index 00000000..37a34f25 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/DataBaseConstant.java @@ -0,0 +1,113 @@ +package com.jero.common.constant; +/** + * 数据库上下文常量 + */ +public interface DataBaseConstant { + //*********数据库类型**************************************** + public static final String DB_TYPE_MYSQL = "MYSQL"; + public static final String DB_TYPE_ORACLE = "ORACLE"; + public static final String DB_TYPE_POSTGRESQL = "POSTGRESQL"; + public static final String DB_TYPE_SQLSERVER = "SQLSERVER"; + + // 数据库类型,对应 database_type 字典 + public static final String DB_TYPE_MYSQL_NUM = "1"; + public static final String DB_TYPE_ORACLE_NUM = "2"; + public static final String DB_TYPE_SQLSERVER_NUM = "3"; + public static final String DB_TYPE_POSTGRESQL_NUM = "4"; + //*********系统上下文变量**************************************** + /** + * 数据-所属机构编码 + */ + public static final String SYS_ORG_CODE = "sysOrgCode"; + /** + * 数据-所属机构编码 + */ + public static final String SYS_ORG_CODE_TABLE = "sys_org_code"; + /** + * 数据-所属机构编码 + */ + public static final String SYS_MULTI_ORG_CODE = "sysMultiOrgCode"; + /** + * 数据-所属机构编码 + */ + public static final String SYS_MULTI_ORG_CODE_TABLE = "sys_multi_org_code"; + /** + * 数据-系统用户编码(对应登录用户账号) + */ + public static final String SYS_USER_CODE = "sysUserCode"; + /** + * 数据-系统用户编码(对应登录用户账号) + */ + public static final String SYS_USER_CODE_TABLE = "sys_user_code"; + + /** + * 登录用户真实姓名 + */ + public static final String SYS_USER_NAME = "sysUserName"; + /** + * 登录用户真实姓名 + */ + public static final String SYS_USER_NAME_TABLE = "sys_user_name"; + /** + * 系统日期"yyyy-MM-dd" + */ + public static final String SYS_DATE = "sysDate"; + /** + * 系统日期"yyyy-MM-dd" + */ + public static final String SYS_DATE_TABLE = "sys_date"; + /** + * 系统时间"yyyy-MM-dd HH:mm" + */ + public static final String SYS_TIME = "sysTime"; + /** + * 系统时间"yyyy-MM-dd HH:mm" + */ + public static final String SYS_TIME_TABLE = "sys_time"; + //*********系统上下文变量**************************************** + + + //*********系统建表标准字段**************************************** + /** + * 创建者登录名称 + */ + public static final String CREATE_BY_TABLE = "create_by"; + /** + * 创建者登录名称 + */ + public static final String CREATE_BY = "createBy"; + /** + * 创建日期时间 + */ + public static final String CREATE_TIME_TABLE = "create_time"; + /** + * 创建日期时间 + */ + public static final String CREATE_TIME = "createTime"; + /** + * 更新用户登录名称 + */ + public static final String UPDATE_BY_TABLE = "update_by"; + /** + * 更新用户登录名称 + */ + public static final String UPDATE_BY = "updateBy"; + /** + * 更新日期时间 + */ + public static final String UPDATE_TIME = "updateTime"; + /** + * 更新日期时间 + */ + public static final String UPDATE_TIME_TABLE = "update_time"; + + /** + * 业务流程状态 + */ + public static final String BPM_STATUS = "bpmStatus"; + /** + * 业务流程状态 + */ + public static final String BPM_STATUS_TABLE = "bpm_status"; + //*********系统建表标准字段**************************************** +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/FillRuleConstant.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/FillRuleConstant.java new file mode 100644 index 00000000..6a319129 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/FillRuleConstant.java @@ -0,0 +1,25 @@ +package com.jero.common.constant; + +/** + * 规则值生成 编码常量类 + * @author: taoyan + * @date: 2020年04月02日 + */ +public class FillRuleConstant { + + /** + * 公文发文编码 + */ + public static final String DOC_SEND = "doc_send_code"; + + /** + * 部门编码 + */ + public static final String DEPART = "org_num_role"; + + /** + * 分类字典编码 + */ + public static final String CATEGORY = "category_code_rule"; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ProvinceCityArea.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ProvinceCityArea.java new file mode 100644 index 00000000..04350b12 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ProvinceCityArea.java @@ -0,0 +1,131 @@ +package com.jero.common.constant; + +import com.alibaba.fastjson.JSONObject; +import com.jero.common.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; +import java.util.Set; +import java.util.List; + +@Component("pca") +public class ProvinceCityArea { + List areaList; + + public String getText(String code){ + this.initAreaList(); + if(this.areaList!=null || this.areaList.size()>0){ + List ls = new ArrayList(); + getAreaByCode(code,ls); + return String.join("/",ls); + } + return ""; + } + + public String getCode(String text){ + this.initAreaList(); + if(areaList!=null || areaList.size()>0){ + for(int i=areaList.size()-1;i>=0;i--){ + if(text.indexOf(areaList.get(i).getText())>=0){ + return areaList.get(i).getId(); + } + } + } + return null; + } + + public void getAreaByCode(String code,List ls){ + for(Area area: areaList){ + if(area.getId().equals(code)){ + String pid = area.getPid(); + ls.add(0,area.getText()); + getAreaByCode(pid,ls); + } + } + } + + private void initAreaList(){ + //System.out.println("====================="); + if(this.areaList==null || this.areaList.size()==0){ + this.areaList = new ArrayList(); + try { + String jsonData = oConvertUtils.readStatic("classpath:static/pca.json"); + JSONObject baseJson = JSONObject.parseObject(jsonData); + //第一层 省 + JSONObject provinceJson = baseJson.getJSONObject("86"); + for(String provinceKey: provinceJson.keySet()){ + //System.out.println("===="+provinceKey); + Area province = new Area(provinceKey,provinceJson.getString(provinceKey),"86"); + this.areaList.add(province); + //第二层 市 + JSONObject cityJson = baseJson.getJSONObject(provinceKey); + for(String cityKey:cityJson.keySet()){ + //System.out.println("-----"+cityKey); + Area city = new Area(cityKey,cityJson.getString(cityKey),provinceKey); + this.areaList.add(city); + //第三层 区 + JSONObject areaJson = baseJson.getJSONObject(cityKey); + if(areaJson!=null){ + for(String areaKey:areaJson.keySet()){ + //System.out.println("········"+areaKey); + Area area = new Area(areaKey,areaJson.getString(areaKey),cityKey); + this.areaList.add(area); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + + + private String jsonRead(File file){ + Scanner scanner = null; + StringBuilder buffer = new StringBuilder(); + try { + scanner = new Scanner(file, "utf-8"); + while (scanner.hasNextLine()) { + buffer.append(scanner.nextLine()); + } + } catch (Exception e) { + + } finally { + if (scanner != null) { + scanner.close(); + } + } + return buffer.toString(); + } + + class Area{ + String id; + String text; + String pid; + + public Area(String id,String text,String pid){ + this.id = id; + this.text = text; + this.pid = pid; + } + + public String getId() { + return id; + } + + public String getText() { + return text; + } + + public String getPid() { + return pid; + } + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ServiceNameConstants.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ServiceNameConstants.java new file mode 100644 index 00000000..ba5dc076 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/ServiceNameConstants.java @@ -0,0 +1,38 @@ +/* + * + * * Copyright (c) 2019-2020, 冷冷 (wangiegie@gmail.com). + * *

+ * * Licensed under the GNU Lesser General Public License 3.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * *

+ * * https://www.gnu.org/licenses/lgpl.html + * *

+ * * 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. + * + */ + +package com.jero.common.constant; + +/** + * @author scott + * @date 2019年05月18日 + * 服务名称 + */ +public interface ServiceNameConstants { + + /** + * 系统管理 admin + */ + String SYSTEM_SERVICE = "jero-system"; + + /** + * gateway通过header传递根路径 basePath + */ + String X_GATEWAY_BASE_PATH = "X_GATEWAY_BASE_PATH"; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/VXESocketConst.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/VXESocketConst.java new file mode 100644 index 00000000..015a998b --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/VXESocketConst.java @@ -0,0 +1,30 @@ +package com.jero.common.constant; + +/** + * VXESocket 常量 + */ +public class VXESocketConst { + + /** + * 消息类型 + */ + public static final String TYPE = "type"; + /** + * 消息数据 + */ + public static final String DATA = "data"; + + /** + * 消息类型:心跳检测 + */ + public static final String TYPE_HB = "heart_beat"; + /** + * 消息类型:通用数据传递 + */ + public static final String TYPE_CSD = "common_send_date"; + /** + * 消息类型:更新vxe table数据 + */ + public static final String TYPE_UVT = "update_vxe_table"; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/WebsocketConst.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/WebsocketConst.java new file mode 100644 index 00000000..d3f0c121 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/WebsocketConst.java @@ -0,0 +1,61 @@ +package com.jero.common.constant; + +/** + * @Description: Websocket常量类 + * @author: taoyan + * @date: 2020年03月23日 + */ +public class WebsocketConst { + + + /** + * 消息json key:cmd + */ + public static final String MSG_CMD = "cmd"; + + /** + * 消息json key:msgId + */ + public static final String MSG_ID = "msgId"; + + /** + * 消息json key:msgTxt + */ + public static final String MSG_TXT = "msgTxt"; + + /** + * 消息json key:userId + */ + public static final String MSG_USER_ID = "userId"; + + /** + * 消息类型 heartcheck + */ + public static final String CMD_CHECK = "heartcheck"; + + /** + * 消息类型 user 用户消息 + */ + public static final String CMD_USER = "user"; + + /** + * 消息类型 topic 系统通知 + */ + public static final String CMD_TOPIC = "topic"; + + /** + * 消息类型 email + */ + public static final String CMD_EMAIL = "email"; + + /** + * 消息类型 meetingsign 会议签到 + */ + public static final String CMD_SIGN = "sign"; + + /** + * 消息类型 新闻发布/取消 + */ + public static final String NEWS_PUBLISH = "publish"; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/CgformEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/CgformEnum.java new file mode 100644 index 00000000..ea85c8f8 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/CgformEnum.java @@ -0,0 +1,150 @@ +package com.jero.common.constant.enums; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * online表单枚举 代码生成器用到 + */ +public enum CgformEnum { + + /** + * 单表 + */ + ONE(1, "one", "/jero/code-template-online", "default.one", "经典风格"), + /** + * 多表 + */ + MANY(2, "many", "/jero/code-template-online", "default.onetomany", "经典风格"), + /** + * 多表 + */ + ERP(2, "erp", "/jero/code-template-online", "erp.onetomany", "ERP风格"), + /** + * 多表(jvxe风格) + * */ + JVXE_TABLE(2, "jvxe", "/jero/code-template-online", "jvxe.onetomany", "JVXE风格"), + /** + * 多表(内嵌子表风格) + */ + INNER_TABLE(2, "innerTable", "/jero/code-template-online", "inner-table.onetomany", "内嵌子表风格"), + /** + * 多表(tab风格) + * */ + TAB(2, "tab", "/jero/code-template-online", "tab.onetomany", "Tab风格"), + /** + * 树形列表 + */ + TREE(3, "tree", "/jero/code-template-online", "default.tree", "树形列表"); + + /** + * 类型 1/单表 2/一对多 3/树 + */ + int type; + /** + * 编码标识 + */ + String code; + /** + * 代码生成器模板路径 + */ + String templatePath; + /** + * 代码生成器模板路径 + */ + String stylePath; + /** + * 模板风格名称 + */ + String note; + + /** + * 构造器 + * + * @param type 类型 1/单表 2/一对多 3/树 + * @param code 模板编码 + * @param templatePath 模板路径 + * @param stylePath 模板子路径 + * @param note + */ + CgformEnum(int type, String code, String templatePath, String stylePath, String note) { + this.type = type; + this.code = code; + this.templatePath = templatePath; + this.stylePath = stylePath; + this.note = note; + } + + /** + * 根据code获取模板路径 + * + * @param code + * @return + */ + public static String getTemplatePathByConfig(String code) { + return getCgformEnumByConfig(code).templatePath; + } + + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getTemplatePath() { + return templatePath; + } + + public void setTemplatePath(String templatePath) { + this.templatePath = templatePath; + } + + public String getStylePath() { + return stylePath; + } + + public void setStylePath(String stylePath) { + this.stylePath = stylePath; + } + + /** + * 根据code找枚举 + * + * @param code + * @return + */ + public static CgformEnum getCgformEnumByConfig(String code) { + for (CgformEnum e : CgformEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } + + /** + * 根据类型找所有 + * + * @param type + * @return + */ + public static List> getJspModelList(int type) { + List> ls = new ArrayList>(); + for (CgformEnum e : CgformEnum.values()) { + if (e.type == type) { + Map map = new HashMap(); + map.put("code", e.code); + map.put("note", e.note); + ls.add(map); + } + } + return ls; + } + + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/ModuleType.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/ModuleType.java new file mode 100644 index 00000000..280dd3c7 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/ModuleType.java @@ -0,0 +1,17 @@ +package com.jero.common.constant.enums; + +/** + * 日志按模块分类 + */ +public enum ModuleType { + + /** + * 普通 + */ + COMMON, + + /** + * online + */ + ONLINE; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/JeroElasticsearchTemplate.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/JeroElasticsearchTemplate.java new file mode 100644 index 00000000..56798b08 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/JeroElasticsearchTemplate.java @@ -0,0 +1,515 @@ +package com.jero.common.es; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import com.jero.common.util.RestUtil; +import com.jero.common.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 关于 ElasticSearch 的一些方法(创建索引、添加数据、查询等) + * + * @author sunjianlei + */ +@Slf4j +@Component +public class JeroElasticsearchTemplate { + /** es服务地址 */ + private String baseUrl; + private final String FORMAT_JSON = "format=json"; + + // ElasticSearch 最大可返回条目数 + public static final int ES_MAX_SIZE = 10000; + + public JeroElasticsearchTemplate(@Value("${jero.elasticsearch.cluster-nodes}") String baseUrl, @Value("${jero.elasticsearch.check-enabled}") boolean checkEnabled) { + log.debug("JeroElasticsearchTemplate BaseURL:" + baseUrl); + if (StringUtils.isNotEmpty(baseUrl)) { + this.baseUrl = baseUrl; + // 验证配置的ES地址是否有效 + if (checkEnabled) { + try { + RestUtil.get(this.getBaseUrl().toString()); + log.info("ElasticSearch 服务连接成功"); + } catch (Exception e) { + log.warn("ElasticSearch 服务连接失败,原因:配置未通过。可能是BaseURL未配置或配置有误,也可能是Elasticsearch服务未启动。接下来将会拒绝执行任何方法!"); + } + } + } + } + + public StringBuilder getBaseUrl(String indexName, String typeName) { + typeName = typeName.trim().toLowerCase(); + return this.getBaseUrl(indexName).append("/").append(typeName); + } + + public StringBuilder getBaseUrl(String indexName) { + indexName = indexName.trim().toLowerCase(); + return this.getBaseUrl().append("/").append(indexName); + } + + public StringBuilder getBaseUrl() { + return new StringBuilder("http://").append(this.baseUrl); + } + + /** + * cat 查询ElasticSearch系统数据,返回json + */ + public ResponseEntity _cat(String urlAfter, Class responseType) { + String url = this.getBaseUrl().append("/_cat").append(urlAfter).append("?").append(FORMAT_JSON).toString(); + return RestUtil.request(url, HttpMethod.GET, null, null, null, responseType); + } + + /** + * 查询所有索引 + *

+ * 查询地址:GET http://{baseUrl}/_cat/indices + */ + public JSONArray getIndices() { + return getIndices(null); + } + + + /** + * 查询单个索引 + *

+ * 查询地址:GET http://{baseUrl}/_cat/indices/{indexName} + */ + public JSONArray getIndices(String indexName) { + StringBuilder urlAfter = new StringBuilder("/indices"); + if (!StringUtils.isEmpty(indexName)) { + urlAfter.append("/").append(indexName.trim().toLowerCase()); + } + return _cat(urlAfter.toString(), JSONArray.class).getBody(); + } + + /** + * 索引是否存在 + */ + public boolean indexExists(String indexName) { + try { + JSONArray array = getIndices(indexName); + return array != null; + } catch (org.springframework.web.client.HttpClientErrorException ex) { + if (HttpStatus.NOT_FOUND == ex.getStatusCode()) { + return false; + } else { + throw ex; + } + } + } + + /** + * 根据ID获取索引数据,未查询到返回null + *

+ * 查询地址:GET http://{baseUrl}/{indexName}/{typeName}/{dataId} + * + * @param indexName 索引名称 + * @param typeName type,一个任意字符串,用于分类 + * @param dataId 数据id + * @return + */ + public JSONObject getDataById(String indexName, String typeName, String dataId) { + String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString(); + log.info("url:" + url); + JSONObject result = RestUtil.get(url); + boolean found = result.getBoolean("found"); + if (found) { + return result.getJSONObject("_source"); + } else { + return null; + } + } + + /** + * 创建索引 + *

+ * 查询地址:PUT http://{baseUrl}/{indexName} + */ + public boolean createIndex(String indexName) { + String url = this.getBaseUrl(indexName).toString(); + + /* 返回结果 (仅供参考) + "createIndex": { + "shards_acknowledged": true, + "acknowledged": true, + "index": "hello_world" + } + */ + try { + return RestUtil.put(url).getBoolean("acknowledged"); + } catch (org.springframework.web.client.HttpClientErrorException ex) { + if (HttpStatus.BAD_REQUEST == ex.getStatusCode()) { + log.warn("索引创建失败:" + indexName + " 已存在,无需再创建"); + } else { + ex.printStackTrace(); + } + } + return false; + } + + /** + * 删除索引 + *

+ * 查询地址:DELETE http://{baseUrl}/{indexName} + */ + public boolean removeIndex(String indexName) { + String url = this.getBaseUrl(indexName).toString(); + try { + return RestUtil.delete(url).getBoolean("acknowledged"); + } catch (org.springframework.web.client.HttpClientErrorException ex) { + if (HttpStatus.NOT_FOUND == ex.getStatusCode()) { + log.warn("索引删除失败:" + indexName + " 不存在,无需删除"); + } else { + ex.printStackTrace(); + } + } + return false; + } + + /** + * 获取索引字段映射(可获取字段类型) + *

+ * + * @param indexName 索引名称 + * @param typeName 分类名称 + * @return + */ + public JSONObject getIndexMapping(String indexName, String typeName) { + String url = this.getBaseUrl(indexName, typeName).append("/_mapping?").append(FORMAT_JSON).toString(); + log.info("getIndexMapping-url:" + url); + /* + * 参考返回JSON结构: + * + *{ + * // 索引名称 + * "[indexName]": { + * "mappings": { + * // 分类名称 + * "[typeName]": { + * "properties": { + * // 字段名 + * "input_number": { + * // 字段类型 + * "type": "long" + * }, + * "input_string": { + * "type": "text", + * "fields": { + * "keyword": { + * "type": "keyword", + * "ignore_above": 256 + * } + * } + * } + * } + * } + * } + * } + * } + */ + try { + return RestUtil.get(url); + } catch (org.springframework.web.client.HttpClientErrorException e) { + String message = e.getMessage(); + if (message != null && message.contains("404 Not Found")) { + return null; + } + throw e; + } + } + + /** + * 获取索引字段映射,返回Java实体类 + * + * @param indexName + * @param typeName + * @return + */ + public Map getIndexMappingFormat(String indexName, String typeName, Class clazz) { + JSONObject mapping = this.getIndexMapping(indexName, typeName); + Map map = new HashMap<>(); + if (mapping == null) { + return map; + } + // 获取字段属性 + JSONObject properties = mapping.getJSONObject(indexName) + .getJSONObject("mappings") + .getJSONObject(typeName) + .getJSONObject("properties"); + // 封装成 java类型 + for (String key : properties.keySet()) { + T entity = properties.getJSONObject(key).toJavaObject(clazz); + map.put(key, entity); + } + return map; + } + + /** + * 保存数据,详见:saveOrUpdate + */ + public boolean save(String indexName, String typeName, String dataId, JSONObject data) { + return this.saveOrUpdate(indexName, typeName, dataId, data); + } + + /** + * 更新数据,详见:saveOrUpdate + */ + public boolean update(String indexName, String typeName, String dataId, JSONObject data) { + return this.saveOrUpdate(indexName, typeName, dataId, data); + } + + /** + * 保存或修改索引数据 + *

+ * 查询地址:PUT http://{baseUrl}/{indexName}/{typeName}/{dataId} + * + * @param indexName 索引名称 + * @param typeName type,一个任意字符串,用于分类 + * @param dataId 数据id + * @param data 要存储的数据 + * @return + */ + public boolean saveOrUpdate(String indexName, String typeName, String dataId, JSONObject data) { + String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).append("?refresh=wait_for").toString(); + /* 返回结果(仅供参考) + "createIndexA2": { + "result": "created", + "_shards": { + "total": 2, + "successful": 1, + "failed": 0 + }, + "_seq_no": 0, + "_index": "test_index_1", + "_type": "test_type_1", + "_id": "a2", + "_version": 1, + "_primary_term": 1 + } + */ + + try { + // 去掉 data 中为空的值 + Set keys = data.keySet(); + List emptyKeys = new ArrayList<>(keys.size()); + for (String key : keys) { + String value = data.getString(key); + //1、剔除空值 + if (oConvertUtils.isEmpty(value) || "[]".equals(value)) { + emptyKeys.add(key); + } + //2、剔除上传控件值(会导致ES同步失败,报异常failed to parse field [ge_pic] of type [text] ) + if (oConvertUtils.isNotEmpty(value) && value.indexOf("[{")!=-1) { + emptyKeys.add(key); + log.info("-------剔除上传控件字段------------key: "+ key); + } + } + for (String key : emptyKeys) { + data.remove(key); + } + } catch (Exception e) { + e.printStackTrace(); + } + try { + String result = RestUtil.put(url, data).getString("result"); + return "created".equals(result) || "updated".equals(result); + } catch (Exception e) { + log.error(e.getMessage() + "\n-- url: " + url + "\n-- data: " + data.toJSONString()); + //TODO 打印接口返回异常json + return false; + } + } + + /** + * 批量保存数据 + * + * @param indexName 索引名称 + * @param typeName type,一个任意字符串,用于分类 + * @param dataList 要存储的数据数组,每行数据必须包含id + * @return + */ + public boolean saveBatch(String indexName, String typeName, JSONArray dataList) { + String url = this.getBaseUrl().append("/_bulk").append("?refresh=wait_for").toString(); + StringBuilder bodySB = new StringBuilder(); + for (int i = 0; i < dataList.size(); i++) { + JSONObject data = dataList.getJSONObject(i); + String id = data.getString("id"); + // 该行的操作 + // {"create": {"_id":"${id}", "_index": "${indexName}", "_type": "${typeName}"}} + JSONObject action = new JSONObject(); + JSONObject actionInfo = new JSONObject(); + actionInfo.put("_id", id); + actionInfo.put("_index", indexName); + actionInfo.put("_type", typeName); + action.put("create", actionInfo); + bodySB.append(action.toJSONString()).append("\n"); + // 该行的数据 + data.remove("id"); + bodySB.append(data.toJSONString()).append("\n"); + } + System.out.println("+-+-+-: bodySB.toString(): " + bodySB.toString()); + HttpHeaders headers = RestUtil.getHeaderApplicationJson(); + RestUtil.request(url, HttpMethod.PUT, headers, null, bodySB, JSONObject.class); + return true; + } + + /** + * 删除索引数据 + *

+ * 请求地址:DELETE http://{baseUrl}/{indexName}/{typeName}/{dataId} + */ + public boolean delete(String indexName, String typeName, String dataId) { + String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString(); + /* 返回结果(仅供参考) + { + "_index": "es_demo", + "_type": "docs", + "_id": "001", + "_version": 3, + "result": "deleted", + "_shards": { + "total": 1, + "successful": 1, + "failed": 0 + }, + "_seq_no": 28, + "_primary_term": 18 + } + */ + try { + return "deleted".equals(RestUtil.delete(url).getString("result")); + } catch (org.springframework.web.client.HttpClientErrorException ex) { + if (HttpStatus.NOT_FOUND == ex.getStatusCode()) { + return false; + } else { + throw ex; + } + } + } + + + /* = = = 以下关于查询和查询条件的方法 = = =*/ + + /** + * 查询数据 + *

+ * 请求地址:POST http://{baseUrl}/{indexName}/{typeName}/_search + */ + public JSONObject search(String indexName, String typeName, JSONObject queryObject) { + String url = this.getBaseUrl(indexName, typeName).append("/_search").toString(); + + log.info("url:" + url + " ,search: " + queryObject.toJSONString()); + JSONObject res = RestUtil.post(url, queryObject); + log.info("url:" + url + " ,return res: \n" + res.toJSONString()); + return res; + } + + /** + * @param _source (源滤波器)指定返回的字段,传null返回所有字段 + * @param query + * @param from 从第几条数据开始 + * @param size 返回条目数 + * @return { "query": query } + */ + public JSONObject buildQuery(List _source, JSONObject query, int from, int size) { + JSONObject json = new JSONObject(); + if (_source != null) { + json.put("_source", _source); + } + json.put("query", query); + json.put("from", from); + json.put("size", size); + return json; + } + + /** + * @return { "bool" : { "must": must, "must_not": mustNot, "should": should } } + */ + public JSONObject buildBoolQuery(JSONArray must, JSONArray mustNot, JSONArray should) { + JSONObject bool = new JSONObject(); + if (must != null) { + bool.put("must", must); + } + if (mustNot != null) { + bool.put("must_not", mustNot); + } + if (should != null) { + bool.put("should", should); + } + JSONObject json = new JSONObject(); + json.put("bool", bool); + return json; + } + + /** + * @param field 要查询的字段 + * @param args 查询参数,参考: *哈哈* OR *哒* NOT *呵* OR *啊* + * @return + */ + public JSONObject buildQueryString(String field, String... args) { + if (field == null) { + return null; + } + StringBuilder sb = new StringBuilder(field).append(":("); + if (args != null) { + for (String arg : args) { + sb.append(arg).append(" "); + } + } + sb.append(")"); + return this.buildQueryString(sb.toString()); + } + + /** + * @return { "query_string": { "query": query } } + */ + public JSONObject buildQueryString(String query) { + JSONObject queryString = new JSONObject(); + queryString.put("query", query); + JSONObject json = new JSONObject(); + json.put("query_string", queryString); + return json; + } + + /** + * @param field 查询字段 + * @param min 最小值 + * @param max 最大值 + * @param containMin 范围内是否包含最小值 + * @param containMax 范围内是否包含最大值 + * @return { "range" : { field : { 『 "gt『e』?containMin" : min 』?min!=null , 『 "lt『e』?containMax" : max 』}} } + */ + public JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax) { + JSONObject inner = new JSONObject(); + if (min != null) { + if (containMin) { + inner.put("gte", min); + } else { + inner.put("gt", min); + } + } + if (max != null) { + if (containMax) { + inner.put("lte", max); + } else { + inner.put("lt", max); + } + } + JSONObject range = new JSONObject(); + range.put(field, inner); + JSONObject json = new JSONObject(); + json.put("range", range); + return json; + } + +} + diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/QueryStringBuilder.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/QueryStringBuilder.java new file mode 100644 index 00000000..8d381e3c --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/es/QueryStringBuilder.java @@ -0,0 +1,98 @@ +package com.jero.common.es; + +/** + * 用于创建 ElasticSearch 的 queryString + * + * @author sunjianlei + */ +public class QueryStringBuilder { + + StringBuilder builder; + + public QueryStringBuilder(String field, String str, boolean not, boolean addQuot) { + builder = this.createBuilder(field, str, not, addQuot); + } + + public QueryStringBuilder(String field, String str, boolean not) { + builder = this.createBuilder(field, str, not, true); + } + + /** + * 创建 StringBuilder + * + * @param field + * @param str + * @param not 是否是不匹配 + * @param addQuot 是否添加双引号 + * @return + */ + public StringBuilder createBuilder(String field, String str, boolean not, boolean addQuot) { + StringBuilder sb = new StringBuilder(field).append(":("); + if (not) { + sb.append(" NOT "); + } + this.addQuotEffect(sb, str, addQuot); + return sb; + } + + public QueryStringBuilder and(String str) { + return this.and(str, true); + } + + public QueryStringBuilder and(String str, boolean addQuot) { + builder.append(" AND "); + this.addQuot(str, addQuot); + return this; + } + + public QueryStringBuilder or(String str) { + return this.or(str, true); + } + + public QueryStringBuilder or(String str, boolean addQuot) { + builder.append(" OR "); + this.addQuot(str, addQuot); + return this; + } + + public QueryStringBuilder not(String str) { + return this.not(str, true); + } + + public QueryStringBuilder not(String str, boolean addQuot) { + builder.append(" NOT "); + this.addQuot(str, addQuot); + return this; + } + + /** + * 添加双引号(模糊查询,不能加双引号) + */ + private QueryStringBuilder addQuot(String str, boolean addQuot) { + return this.addQuotEffect(this.builder, str, addQuot); + } + + /** + * 是否在两边加上双引号 + * @param builder + * @param str + * @param addQuot + * @return + */ + private QueryStringBuilder addQuotEffect(StringBuilder builder, String str, boolean addQuot) { + if (addQuot) { + builder.append('"'); + } + builder.append(str); + if (addQuot) { + builder.append('"'); + } + return this; + } + + @Override + public String toString() { + return builder.append(")").toString(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootException.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootException.java new file mode 100644 index 00000000..0de8f964 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootException.java @@ -0,0 +1,19 @@ +package com.jero.common.exception; + +public class JeroBootException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public JeroBootException(String message){ + super(message); + } + + public JeroBootException(Throwable cause) + { + super(cause); + } + + public JeroBootException(String message,Throwable cause) + { + super(message,cause); + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootExceptionHandler.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootExceptionHandler.java new file mode 100644 index 00000000..303ba8c1 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/exception/JeroBootExceptionHandler.java @@ -0,0 +1,129 @@ +package com.jero.common.exception; + +import io.lettuce.core.RedisConnectionException; +import org.apache.shiro.authz.AuthorizationException; +import org.apache.shiro.authz.UnauthorizedException; +import com.jero.common.api.vo.Result; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.data.redis.connection.PoolException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.multipart.MaxUploadSizeExceededException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import lombok.extern.slf4j.Slf4j; + +/** + * 异常处理器 + * + * @Author scott + * @Date 2019 + */ +@RestControllerAdvice +@Slf4j +public class JeroBootExceptionHandler { + + /** + * 处理自定义异常 + */ + @ExceptionHandler(JeroBootException.class) + public Result handleRRException(JeroBootException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + + /** + * get方法使用BindException接收 + */ + @ExceptionHandler(BindException.class) + @ResponseBody + public Result handleBindException(BindException e) { + log.error(e.getMessage(), e.getBindingResult().getFieldError().getDefaultMessage()); + return Result.error(e.getBindingResult().getFieldError().getDefaultMessage()); + } + + /** + * post方法使用MethodArgumentNotValidException接收 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error(e.getMessage(), e.getBindingResult().getFieldError().getDefaultMessage()); + return Result.error(e.getBindingResult().getFieldError().getDefaultMessage()); + } + + @ExceptionHandler(NoHandlerFoundException.class) + public Result handlerNoFoundException(Exception e) { + log.error(e.getMessage(), e); + return Result.error(404, "路径不存在,请检查路径是否正确"); + } + + @ExceptionHandler(DuplicateKeyException.class) + public Result handleDuplicateKeyException(DuplicateKeyException e) { + log.error(e.getMessage(), e); + return Result.error("数据库中已存在该记录"); + } + + @ExceptionHandler({UnauthorizedException.class, AuthorizationException.class}) + public Result handleAuthorizationException(AuthorizationException e) { + log.error(e.getMessage(), e); + return Result.noauth("没有权限,请联系管理员授权"); + } + + @ExceptionHandler(Exception.class) + public Result handleException(Exception e) { + log.error(e.getMessage(), e); + return Result.error("请输入有效内容"); + } + + /** + * @param e + * @return + * @Author 政辉 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public Result HttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { + StringBuffer sb = new StringBuffer(); + sb.append("不支持"); + sb.append(e.getMethod()); + sb.append("请求方法,"); + sb.append("支持以下"); + String[] methods = e.getSupportedMethods(); + if (methods != null) { + for (String str : methods) { + sb.append(str); + sb.append("、"); + } + } + log.error(sb.toString(), e); + //return Result.error("没有权限,请联系管理员授权"); + return Result.error(405, sb.toString()); + } + + /** + * spring默认上传大小100MB 超出大小捕获异常MaxUploadSizeExceededException + */ + @ExceptionHandler(MaxUploadSizeExceededException.class) + public Result handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { + log.error(e.getMessage(), e); + return Result.error("文件大小超出10MB限制, 请压缩或降低文件质量! "); + } + + @ExceptionHandler(DataIntegrityViolationException.class) + public Result handleDataIntegrityViolationException(DataIntegrityViolationException e) { + log.error(e.getMessage(), e); + return Result.error("字段太长,超出数据库字段的长度"); + } + + @ExceptionHandler(PoolException.class) + public Result handlePoolException(PoolException e) { + log.error(e.getMessage(), e); + return Result.error("Redis 连接异常!"); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/handler/IFillRuleHandler.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/handler/IFillRuleHandler.java new file mode 100644 index 00000000..26bcd5e0 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/handler/IFillRuleHandler.java @@ -0,0 +1,21 @@ +package com.jero.common.handler; + +import com.alibaba.fastjson.JSONObject; + +/** + * 填值规则接口 + * + * @author Yan_东 + * 如需使用填值规则功能,规则实现类必须实现此接口 + */ +public interface IFillRuleHandler { + + /** + * @param params 页面配置固定参数 + * @param formData 动态表单参数 + * @return + */ + public Object execute(JSONObject params, JSONObject formData); + +} + diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java new file mode 100644 index 00000000..fb5c88fc --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java @@ -0,0 +1,144 @@ +package com.jero.common.system.base.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description: Controller基类 + * @Author: dangzhenghui@163.com + * @Date: 2019-4-21 8:13 + * @Version: 1.0 + */ +@Slf4j +public class JeroController> { + @Autowired + S service; + + @Value("${jero.path.upload}") + private String upLoadPath; + /** + * 导出excel + * + * @param request + */ + protected ModelAndView exportXls(HttpServletRequest request, T object, Class clazz, String title) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + // Step.2 获取导出数据 + List pageList = service.list(queryWrapper); + List exportList = null; + + // 过滤选中数据 + String selections = request.getParameter("selections"); + if (oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + exportList = pageList.stream().filter(item -> selectionList.contains(getId(item))).collect(Collectors.toList()); + } else { + exportList = pageList; + } + + // Step.3 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下 + mv.addObject(NormalExcelConstants.CLASS, clazz); + //update-begin--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置-------------------- + ExportParams exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title); + exportParams.setImageBasePath(upLoadPath); + //update-end--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置---------------------- + mv.addObject(NormalExcelConstants.PARAMS,exportParams); + mv.addObject(NormalExcelConstants.DATA_LIST, exportList); + return mv; + } + + /** + * 根据权限导出excel,传入导出字段参数 + * + * @param request + */ + protected ModelAndView exportXls(HttpServletRequest request, T object, Class clazz, String title,String exportFields) { + ModelAndView mv = this.exportXls(request,object,clazz,title); + mv.addObject(NormalExcelConstants.EXPORT_FIELDS,exportFields); + return mv; + } + + /** + * 获取对象ID + * + * @return + */ + private String getId(T item) { + try { + return PropertyUtils.getProperty(item, "id").toString(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + protected Result importExcel(HttpServletRequest request, HttpServletResponse response, Class clazz) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List list = ExcelImportUtil.importExcel(file.getInputStream(), clazz, params); + //update-begin-author:taoyan date:20190528 for:批量插入数据 + long start = System.currentTimeMillis(); + service.saveBatch(list); + //400条 saveBatch消耗时间1592毫秒 循环插入消耗时间1947毫秒 + //1200条 saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒 + log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒"); + //update-end-author:taoyan date:20190528 for:批量插入数据 + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("文件导入失败:" + e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/entity/JeroEntity.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/entity/JeroEntity.java new file mode 100644 index 00000000..3894782e --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/entity/JeroEntity.java @@ -0,0 +1,52 @@ +package com.jero.common.system.base.entity; + +import java.io.Serializable; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: Entity基类 + * @Author: dangzhenghui@163.com + * @Date: 2019-4-28 + * @Version: 1.1 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class JeroEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** ID */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "ID") + private java.lang.String id; + /** 创建人 */ + @ApiModelProperty(value = "创建人") + @Excel(name = "创建人", width = 15) + private java.lang.String createBy; + /** 创建时间 */ + @ApiModelProperty(value = "创建时间") + @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /** 更新人 */ + @ApiModelProperty(value = "更新人") + @Excel(name = "更新人", width = 15) + private java.lang.String updateBy; + /** 更新时间 */ + @ApiModelProperty(value = "更新时间") + @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/JeroService.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/JeroService.java new file mode 100644 index 00000000..33c1c6b2 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/JeroService.java @@ -0,0 +1,12 @@ +package com.jero.common.system.base.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: Service基类 + * @Author: dangzhenghui@163.com + * @Date: 2019-4-21 8:13 + * @Version: 1.0 + */ +public interface JeroService extends IService { +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/impl/JeroServiceImpl.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/impl/JeroServiceImpl.java new file mode 100644 index 00000000..66191668 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/service/impl/JeroServiceImpl.java @@ -0,0 +1,19 @@ +package com.jero.common.system.base.service.impl; + +import com.jero.common.system.base.entity.JeroEntity; +import com.jero.common.system.base.service.JeroService; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: ServiceImpl基类 + * @Author: dangzhenghui@163.com + * @Date: 2019-4-21 8:13 + * @Version: 1.0 + */ +@Slf4j +public class JeroServiceImpl, T extends JeroEntity> extends ServiceImpl implements JeroService { + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/MatchTypeEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/MatchTypeEnum.java new file mode 100644 index 00000000..96fa3531 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/MatchTypeEnum.java @@ -0,0 +1,43 @@ +package com.jero.common.system.query; + +import com.jero.common.util.oConvertUtils; + +/** + * 查询链接规则 + * + * @Author Sunjianlei + */ +public enum MatchTypeEnum { + + AND("AND"), + OR("OR"); + + private String value; + + MatchTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static MatchTypeEnum getByValue(Object value) { + if (oConvertUtils.isEmpty(value)) { + return null; + } + return getByValue(value.toString()); + } + + public static MatchTypeEnum getByValue(String value) { + if (oConvertUtils.isEmpty(value)) { + return null; + } + for (MatchTypeEnum val : values()) { + if (val.getValue().toLowerCase().equals(value.toLowerCase())) { + return val; + } + } + return null; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryCondition.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryCondition.java new file mode 100644 index 00000000..448449ac --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryCondition.java @@ -0,0 +1,55 @@ +package com.jero.common.system.query; + +import java.io.Serializable; + +public class QueryCondition implements Serializable { + + private static final long serialVersionUID = 4740166316629191651L; + + private String field; + private String type; + private String rule; + private String val; + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRule() { + return rule; + } + + public void setRule(String rule) { + this.rule = rule; + } + + public String getVal() { + return val; + } + + public void setVal(String val) { + this.val = val; + } + + @Override + public String toString(){ + StringBuffer sb =new StringBuffer(); + if(field == null || "".equals(field)){ + return ""; + } + sb.append(this.field).append(" ").append(this.rule).append(" ").append(this.type).append(" ").append(this.val); + return sb.toString(); + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java new file mode 100644 index 00000000..e1400bd1 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java @@ -0,0 +1,1086 @@ +package com.jero.common.system.query; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.beanutils.PropertyUtils; +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.DataBaseConstant; +import com.jero.common.system.util.JeroDataAutorUtils; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.SysPermissionDataRuleModel; +import com.jero.common.util.CommonUtils; +import com.jero.common.util.DateUtils; +import com.jero.common.util.SqlInjectionUtil; +import com.jero.common.util.oConvertUtils; +import org.springframework.util.NumberUtils; + +import java.beans.PropertyDescriptor; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.net.URLDecoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Slf4j +public class QueryGenerator { + public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN"; + + private static final String BEGIN = "_begin"; + private static final String END = "_end"; + /** + * 数字类型字段,拼接此后缀 接受多值参数 + */ + private static final String MULTI = "_MultiString"; + private static final String STAR = "*"; + private static final String COMMA = ","; + /** + * 查询 逗号转义符 相当于一个逗号【作废】 + */ + public static final String QUERY_COMMA_ESCAPE = "++"; + private static final String NOT_EQUAL = "!"; + /**页面带有规则值查询,空格作为分隔符*/ + private static final String QUERY_SEPARATE_KEYWORD = " "; + /**高级查询前端传来的参数名*/ + private static final String SUPER_QUERY_PARAMS = "superQueryParams"; + /** 高级查询前端传来的拼接方式参数名 */ + private static final String SUPER_QUERY_MATCH_TYPE = "superQueryMatchType"; + /** 单引号 */ + public static final String SQL_SQ = "'"; + /**排序列*/ + private static final String ORDER_COLUMN = "column"; + /**排序方式*/ + private static final String ORDER_TYPE = "order"; + private static final String ORDER_TYPE_ASC = "ASC"; + + /**mysql 模糊查询之特殊字符下划线 (_、\)*/ + public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%"; + + /**时间格式化 */ + private static final ThreadLocal local = new ThreadLocal(); + private static SimpleDateFormat getTime(){ + SimpleDateFormat time = local.get(); + if(time == null){ + time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + local.set(time); + } + return time; + } + + /** + * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成 + * @param searchObj 查询实体 + * @param parameterMap request.getParameterMap() + * @return QueryWrapper实例 + */ + public static QueryWrapper initQueryWrapper(T searchObj,Map parameterMap){ + long start = System.currentTimeMillis(); + QueryWrapper queryWrapper = new QueryWrapper(); + installMplus(queryWrapper, searchObj, parameterMap); + log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----"); + return queryWrapper; + } + + /** + * 组装Mybatis Plus 查询条件 + *

使用此方法 需要有如下几点注意: + *
1.使用QueryWrapper 而非LambdaQueryWrapper; + *
2.实例化QueryWrapper时不可将实体传入参数 + *
错误示例:如QueryWrapper queryWrapper = new QueryWrapper(jeroDemo); + *
正确示例:QueryWrapper queryWrapper = new QueryWrapper(); + *
3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 + */ + public static void installMplus(QueryWrapper queryWrapper,Object searchObj,Map parameterMap) { + + /* + * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code} + 但是不支持在自定义SQL中写orgCode in #{sys_org_code} + 当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}' + */ + + //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询 + PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj); + Map ruleMap = getRuleMap(); + + //权限规则自定义SQL表达式 + for (String c : ruleMap.keySet()) { + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); + } + } + + String name, type, column; + // update-begin--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- + //定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题 + Map fieldColumnMap = new HashMap(); + for (int i = 0; i < origDescriptors.length; i++) { + //aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况 + name = origDescriptors[i].getName(); + type = origDescriptors[i].getPropertyType().toString(); + try { + if (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) { + continue; + } + + Object value = PropertyUtils.getSimpleProperty(searchObj, name); + column = getTableFieldName(searchObj.getClass(), name); + if(column==null){ + //column为null只有一种情况 那就是 添加了注解@TableField(exist = false) 后续都不用处理了 + continue; + } + fieldColumnMap.put(name,column); + //数据权限查询 + if(ruleMap.containsKey(name)) { + addRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper); + } + //区间查询 + doIntervalQuery(queryWrapper, parameterMap, type, name, column); + //判断单值 参数带不同标识字符串 走不同的查询 + //TODO 这种前后带逗号的支持分割后模糊查询需要否 使多选字段的查询生效 + if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) { + String multiLikeval = value.toString().replace(",,", COMMA); + String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA); + final String field = oConvertUtils.camelToUnderline(column); + if(vals.length>1) { + queryWrapper.and(j -> { + j = j.like(field,vals[0]); + for (int k=1;k j.like(field,vals[0])); + } + }else { + //根据参数值带什么关键字符串判断走什么类型的查询 + QueryRuleEnum rule = convert2Rule(value); + value = replaceValue(rule,value); + // add -begin 添加判断为字符串时设为全模糊查询 + if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) { + //可以设置左右模糊或全模糊,因人而异 + rule = QueryRuleEnum.LIKE; + } + // add -end 添加判断为字符串时设为全模糊查询 + addEasyQuery(queryWrapper, column, rule, value); + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + // 排序逻辑 处理 + doMultiFieldsOrder(queryWrapper, parameterMap); + + //高级查询 + doSuperQuery(queryWrapper, parameterMap, fieldColumnMap); + // update-end--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- + + } + + + /** + * 区间查询 + * @param queryWrapper query对象 + * @param parameterMap 参数map + * @param type 字段类型 + * @param filedName 字段名称 + * @param columnName 列名称 + */ + private static void doIntervalQuery(QueryWrapper queryWrapper, Map parameterMap, String type, String filedName, String columnName) throws ParseException { + // 添加 判断是否有区间值 + String endValue = null,beginValue = null; + if (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) { + beginValue = parameterMap.get(filedName + BEGIN)[0].trim(); + addQueryByRule(queryWrapper, columnName, type, beginValue, QueryRuleEnum.GE); + + } + if (parameterMap != null && parameterMap.containsKey(filedName + END)) { + endValue = parameterMap.get(filedName + END)[0].trim(); + addQueryByRule(queryWrapper, columnName, type, endValue, QueryRuleEnum.LE); + } + //多值查询 + if (parameterMap != null && parameterMap.containsKey(filedName + MULTI)) { + endValue = parameterMap.get(filedName + MULTI)[0].trim(); + addQueryByRule(queryWrapper, columnName.replace(MULTI,""), type, endValue, QueryRuleEnum.IN); + } + } + + //多字段排序 TODO 需要修改前端 + public static void doMultiFieldsOrder(QueryWrapper queryWrapper,Map parameterMap) { + String column=null,order=null; + if(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) { + column = parameterMap.get(ORDER_COLUMN)[0]; + } + if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) { + order = parameterMap.get(ORDER_TYPE)[0]; + } + log.debug("排序规则>>列:"+column+",排序方式:"+order); + if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + //字典字段,去掉字典翻译文本后缀 + if(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) { + column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX)); + } + //SQL注入check + SqlInjectionUtil.filterContent(column); + + if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + } else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + } + + /** + * 高级查询 + * @param queryWrapper 查询对象 + * @param parameterMap 参数对象 + * @param fieldColumnMap 实体字段和数据库列对应的map + */ + public static void doSuperQuery(QueryWrapper queryWrapper,Map parameterMap, Map fieldColumnMap) { + if(parameterMap!=null&& parameterMap.containsKey(SUPER_QUERY_PARAMS)){ + String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0]; + String superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0] : MatchTypeEnum.AND.getValue(); + MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType); + // update-begin--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 ------- + try { + superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8"); + List conditions = JSON.parseArray(superQueryParams, QueryCondition.class); + if (conditions == null || conditions.size() == 0) { + return; + } + log.info("---高级查询参数-->" + conditions.toString()); + queryWrapper.and(andWrapper -> { + for (int i = 0; i < conditions.size(); i++) { + QueryCondition rule = conditions.get(i); + if (oConvertUtils.isNotEmpty(rule.getField()) + && oConvertUtils.isNotEmpty(rule.getRule()) + && oConvertUtils.isNotEmpty(rule.getVal())) { + + log.debug("SuperQuery ==> " + rule.toString()); + + //update-begin-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 + Object queryValue = rule.getVal(); + if("date".equals(rule.getType())){ + queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get()); + }else if("datetime".equals(rule.getType())){ + queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get()); + } + addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue); + //update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 + + // 如果拼接方式是OR,就拼接OR + if (MatchTypeEnum.OR == matchType && i < (conditions.size() - 1)) { + andWrapper.or(); + } + } + } + //return andWrapper; + }); + } catch (UnsupportedEncodingException e) { + log.error("--高级查询参数转码失败:" + superQueryParams, e); + } catch (Exception e) { + log.error("--高级查询拼接失败:" + e.getMessage()); + e.printStackTrace(); + } + // update-end--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 ------- + } + //log.info(" superQuery getCustomSqlSegment: "+ queryWrapper.getCustomSqlSegment()); + } + /** + * 根据所传的值 转化成对应的比较方式 + * 支持><= like in ! + * @param value + * @return + */ + private static QueryRuleEnum convert2Rule(Object value) { + // 避免空数据 + if (value == null) { + return null; + } + String val = (value + "").toString().trim(); + if (val.length() == 0) { + return null; + } + QueryRuleEnum rule =null; + + //update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284------------------- + //TODO 此处规则,只适用于 le lt ge gt + // step 2 .>= =< + if (rule == null && val.length() >= 3) { + if(QUERY_SEPARATE_KEYWORD.equals(val.substring(2, 3))){ + rule = QueryRuleEnum.getByValue(val.substring(0, 2)); + } + } + // step 1 .> < + if (rule == null && val.length() >= 2) { + if(QUERY_SEPARATE_KEYWORD.equals(val.substring(1, 2))){ + rule = QueryRuleEnum.getByValue(val.substring(0, 1)); + } + } + //update-end--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284--------------------- + + // step 3 like + if (rule == null && val.contains(STAR)) { + if (val.startsWith(STAR) && val.endsWith(STAR)) { + rule = QueryRuleEnum.LIKE; + } else if (val.startsWith(STAR)) { + rule = QueryRuleEnum.LEFT_LIKE; + } else if(val.endsWith(STAR)){ + rule = QueryRuleEnum.RIGHT_LIKE; + } + } + + // step 4 in + if (rule == null && val.contains(COMMA)) { + //TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来 + rule = QueryRuleEnum.IN; + } + // step 5 != + if(rule == null && val.startsWith(NOT_EQUAL)){ + rule = QueryRuleEnum.NE; + } + // step 6 xx+xx+xx 这种情况适用于如果想要用逗号作精确查询 但是系统默认逗号走in 所以可以用++替换【此逻辑作废】 + if(rule == null && val.indexOf(QUERY_COMMA_ESCAPE)>0){ + rule = QueryRuleEnum.EQ_WITH_ADD; + } + + //update-begin--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284--------------------- + //特殊处理:Oracle的表达式to_date('xxx','yyyy-MM-dd')含有逗号,会被识别为in查询,转为等于查询 + if(rule == QueryRuleEnum.IN && val.indexOf("yyyy-MM-dd")>=0 && val.indexOf("to_date")>=0){ + rule = QueryRuleEnum.EQ; + } + //update-end--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284--------------------- + + return rule != null ? rule : QueryRuleEnum.EQ; + } + + /** + * 替换掉关键字字符 + * + * @param rule + * @param value + * @return + */ + private static Object replaceValue(QueryRuleEnum rule, Object value) { + if (rule == null) { + return null; + } + if (! (value instanceof String)){ + return value; + } + String val = (value + "").toString().trim(); + if (rule == QueryRuleEnum.LIKE) { + value = val.substring(1, val.length() - 1); + //mysql 模糊查询之特殊字符下划线 (_、\) + value = specialStrConvert(value.toString()); + } else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) { + value = val.substring(1); + //mysql 模糊查询之特殊字符下划线 (_、\) + value = specialStrConvert(value.toString()); + } else if (rule == QueryRuleEnum.RIGHT_LIKE) { + value = val.substring(0, val.length() - 1); + //mysql 模糊查询之特殊字符下划线 (_、\) + value = specialStrConvert(value.toString()); + } else if (rule == QueryRuleEnum.IN) { + value = val.split(","); + } else if (rule == QueryRuleEnum.EQ_WITH_ADD) { + value = val.replaceAll("\\+\\+", COMMA); + }else { + //update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284------------------- + if(val.startsWith(rule.getValue())){ + //TODO 此处逻辑应该注释掉-> 如果查询内容中带有查询匹配规则符号,就会被截取的(比如:>=您好) + value = val.replaceFirst(rule.getValue(),""); + }else if(val.startsWith(rule.getCondition()+QUERY_SEPARATE_KEYWORD)){ + value = val.replaceFirst(rule.getCondition()+QUERY_SEPARATE_KEYWORD,"").trim(); + } + //update-end--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284------------------- + } + return value; + } + + private static void addQueryByRule(QueryWrapper queryWrapper,String name,String type,String value,QueryRuleEnum rule) throws ParseException { + if(oConvertUtils.isNotEmpty(value)) { + Object temp; + // 针对数字类型字段,多值查询 + if(value.indexOf(COMMA)!=-1){ + temp = value; + addEasyQuery(queryWrapper, name, rule, temp); + return; + } + + switch (type) { + case "class java.lang.Integer": + temp = Integer.parseInt(value); + break; + case "class java.math.BigDecimal": + temp = new BigDecimal(value); + break; + case "class java.lang.Short": + temp = Short.parseShort(value); + break; + case "class java.lang.Long": + temp = Long.parseLong(value); + break; + case "class java.lang.Float": + temp = Float.parseFloat(value); + break; + case "class java.lang.Double": + temp = Double.parseDouble(value); + break; + case "class java.util.Date": + temp = getDateQueryByRule(value, rule); + break; + default: + temp = value; + break; + } + addEasyQuery(queryWrapper, name, rule, temp); + } + } + + /** + * 获取日期类型的值 + * @param value + * @param rule + * @return + * @throws ParseException + */ + private static Date getDateQueryByRule(String value,QueryRuleEnum rule) throws ParseException { + Date date = null; + if(value.length()==10) { + if(rule==QueryRuleEnum.GE) { + //比较大于 + date = getTime().parse(value + " 00:00:00"); + }else if(rule==QueryRuleEnum.LE) { + //比较小于 + date = getTime().parse(value + " 23:59:59"); + } + //TODO 日期类型比较特殊 可能oracle下不一定好使 + } + if(date==null) { + date = getTime().parse(value); + } + return date; + } + + /** + * 根据规则走不同的查询 + * @param queryWrapper QueryWrapper + * @param name 字段名字 + * @param rule 查询规则 + * @param value 查询条件值 + */ + private static void addEasyQuery(QueryWrapper queryWrapper, String name, QueryRuleEnum rule, Object value) { + if (value == null || rule == null || oConvertUtils.isEmpty(value)) { + return; + } + name = oConvertUtils.camelToUnderline(name); + log.info("--查询规则-->"+name+" "+rule.getValue()+" "+value); + switch (rule) { + case GT: + queryWrapper.gt(name, value); + break; + case GE: + queryWrapper.ge(name, value); + break; + case LT: + queryWrapper.lt(name, value); + break; + case LE: + queryWrapper.le(name, value); + break; + case EQ: + case EQ_WITH_ADD: + queryWrapper.eq(name, value); + break; + case NE: + queryWrapper.ne(name, value); + break; + case IN: + if(value instanceof String) { + queryWrapper.in(name, (Object[])value.toString().split(",")); + }else if(value instanceof String[]) { + queryWrapper.in(name, (Object[]) value); + } + //update-begin-author:taoyan date:20200909 for:【bug】in 类型多值查询 不适配postgresql #1671 + else if(value.getClass().isArray()) { + queryWrapper.in(name, (Object[])value); + }else { + queryWrapper.in(name, value); + } + //update-end-author:taoyan date:20200909 for:【bug】in 类型多值查询 不适配postgresql #1671 + break; + case LIKE: + queryWrapper.like(name, value); + break; + case LEFT_LIKE: + queryWrapper.likeLeft(name, value); + break; + case RIGHT_LIKE: + queryWrapper.likeRight(name, value); + break; + default: + log.info("--查询规则未匹配到---"); + break; + } + } + /** + * + * @param name + * @return + */ + private static boolean judgedIsUselessField(String name) { + return "class".equals(name) || "ids".equals(name) + || "page".equals(name) || "rows".equals(name) + || "sort".equals(name) || "order".equals(name); + } + + + + /** + * 获取请求对应的数据权限规则 + * @return + */ + public static Map getRuleMap() { + Map ruleMap = new HashMap(); + List list = JeroDataAutorUtils.loadDataSearchConditon(); + if(list != null&&list.size()>0){ + if(list.get(0)==null){ + return ruleMap; + } + for (SysPermissionDataRuleModel rule : list) { + String column = rule.getRuleColumn(); + if(QueryRuleEnum.SQL_RULES.getValue().equals(rule.getRuleConditions())) { + column = SQL_RULES_COLUMN+rule.getId(); + } + ruleMap.put(column, rule); + } + } + return ruleMap; + } + + /** + * 获取请求对应的数据权限规则 + * @return + */ + public static Map getRuleMap(List list) { + Map ruleMap = new HashMap(); + if(list==null){ + list = JeroDataAutorUtils.loadDataSearchConditon(); + } + if(list != null&&list.size()>0){ + if(list.get(0)==null){ + return ruleMap; + } + for (SysPermissionDataRuleModel rule : list) { + String column = rule.getRuleColumn(); + if(QueryRuleEnum.SQL_RULES.getValue().equals(rule.getRuleConditions())) { + column = SQL_RULES_COLUMN+rule.getId(); + } + ruleMap.put(column, rule); + } + } + return ruleMap; + } + + private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper queryWrapper) { + QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); + if(rule.equals(QueryRuleEnum.IN) && ! propertyType.equals(String.class)) { + String[] values = dataRule.getRuleValue().split(","); + Object[] objs = new Object[values.length]; + for (int i = 0; i < values.length; i++) { + objs[i] = NumberUtils.parseNumber(values[i], propertyType); + } + addEasyQuery(queryWrapper, name, rule, objs); + }else { + if (propertyType.equals(String.class)) { + addEasyQuery(queryWrapper, name, rule, converRuleValue(dataRule.getRuleValue())); + }else if (propertyType.equals(Date.class)) { + String dateStr =converRuleValue(dataRule.getRuleValue()); + if(dateStr.length()==10){ + addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.date_sdf.get())); + }else{ + addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.datetimeFormat.get())); + } + }else { + addEasyQuery(queryWrapper, name, rule, NumberUtils.parseNumber(dataRule.getRuleValue(), propertyType)); + } + } + } + + public static String converRuleValue(String ruleValue) { + String value = JwtUtil.getUserSystemData(ruleValue,null); + return value!= null ? value : ruleValue; + } + + /** + * @author: scott + * @Description: 去掉值前后单引号 + * @date: 2020/3/19 21:26 + * @param ruleValue: + * @Return: java.lang.String + */ + public static String trimSingleQuote(String ruleValue) { + if (oConvertUtils.isEmpty(ruleValue)) { + return ""; + } + if (ruleValue.startsWith(QueryGenerator.SQL_SQ)) { + ruleValue = ruleValue.substring(1); + } + if (ruleValue.endsWith(QueryGenerator.SQL_SQ)) { + ruleValue = ruleValue.substring(0, ruleValue.length() - 1); + } + return ruleValue; + } + + public static String getSqlRuleValue(String sqlRule){ + try { + Set varParams = getSqlRuleParams(sqlRule); + for(String var:varParams){ + String tempValue = converRuleValue(var); + sqlRule = sqlRule.replace("#{"+var+"}",tempValue); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return sqlRule; + } + + /** + * 获取sql中的#{key} 这个key组成的set + */ + public static Set getSqlRuleParams(String sql) { + if(oConvertUtils.isEmpty(sql)){ + return null; + } + Set varParams = new HashSet(); + String regex = "\\#\\{\\w+\\}"; + + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(sql); + while(m.find()){ + String var = m.group(); + varParams.add(var.substring(var.indexOf("{")+1,var.indexOf("}"))); + } + return varParams; + } + + /** + * 获取查询条件 + * @param field + * @param alias + * @param value + * @param isString + * @return + */ + public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString) { + return getSingleQueryConditionSql(field, alias, value, isString,null); + } + + /** + * 报表获取查询条件 支持多数据源 + * @param field + * @param alias + * @param value + * @param isString + * @param dataBaseType + * @return + */ + public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString, String dataBaseType) { + if (value == null) { + return ""; + } + field = alias+oConvertUtils.camelToUnderline(field); + QueryRuleEnum rule = QueryGenerator.convert2Rule(value); + return getSingleSqlByRule(rule, field, value, isString, dataBaseType); + } + + /** + * 获取单个查询条件的值 + * @param rule + * @param field + * @param value + * @param isString + * @param dataBaseType + * @return + */ + public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString, String dataBaseType) { + String res = ""; + switch (rule) { + case GT: + res =field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType); + break; + case GE: + res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType); + break; + case LT: + res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType); + break; + case LE: + res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType); + break; + case EQ: + res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType); + break; + case EQ_WITH_ADD: + res = field+" = "+getFieldConditionValue(value, isString, dataBaseType); + break; + case NE: + res = field+" <> "+getFieldConditionValue(value, isString, dataBaseType); + break; + case IN: + res = field + " in "+getInConditionValue(value, isString); + break; + case LIKE: + res = field + " like "+getLikeConditionValue(value); + break; + case LEFT_LIKE: + res = field + " like "+getLikeConditionValue(value); + break; + case RIGHT_LIKE: + res = field + " like "+getLikeConditionValue(value); + break; + default: + res = field+" = "+getFieldConditionValue(value, isString, dataBaseType); + break; + } + return res; + } + + + /** + * 获取单个查询条件的值 + * @param rule + * @param field + * @param value + * @param isString + * @return + */ + public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString) { + return getSingleSqlByRule(rule, field, value, isString, null); + } + + /** + * 获取查询条件的值 + * @param value + * @param isString + * @param dataBaseType + * @return + */ + private static String getFieldConditionValue(Object value,boolean isString, String dataBaseType) { + String str = value.toString().trim(); + if(str.startsWith("!")) { + str = str.substring(1); + }else if(str.startsWith(">=")) { + str = str.substring(2); + }else if(str.startsWith("<=")) { + str = str.substring(2); + }else if(str.startsWith(">")) { + str = str.substring(1); + }else if(str.startsWith("<")) { + str = str.substring(1); + }else if(str.indexOf(QUERY_COMMA_ESCAPE)>0) { + str = str.replaceAll("\\+\\+", COMMA); + } + if(dataBaseType==null){ + dataBaseType = getDbType(); + } + if(isString) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType)){ + return " N'"+str+"' "; + }else{ + return " '"+str+"' "; + } + }else { + // 如果不是字符串 有一种特殊情况 popup调用都走这个逻辑 参数传递的可能是“‘admin’”这种格式的 + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType) && str.endsWith("'") && str.startsWith("'")){ + return " N"+str; + } + return value.toString(); + } + } + + private static String getInConditionValue(Object value,boolean isString) { + if(isString) { + String temp[] = value.toString().split(","); + String res=""; + for (String string : temp) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + res+=",N'"+string+"'"; + }else{ + res+=",'"+string+"'"; + } + } + return "("+res.substring(1)+")"; + }else { + return "("+value.toString()+")"; + } + } + + private static String getLikeConditionValue(Object value) { + String str = value.toString().trim(); + if(str.startsWith("*") && str.endsWith("*")) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + return "N'%"+str.substring(1,str.length()-1)+"%'"; + }else{ + return "'%"+str.substring(1,str.length()-1)+"%'"; + } + }else if(str.startsWith("*")) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + return "N'%"+str.substring(1)+"'"; + }else{ + return "'%"+str.substring(1)+"'"; + } + }else if(str.endsWith("*")) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + return "N'"+str.substring(0,str.length()-1)+"%'"; + }else{ + return "'"+str.substring(0,str.length()-1)+"%'"; + } + }else { + if(str.indexOf("%")>=0) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + if(str.startsWith("'") && str.endsWith("'")){ + return "N"+str; + }else{ + return "N"+"'"+str+"'"; + } + }else{ + if(str.startsWith("'") && str.endsWith("'")){ + return str; + }else{ + return "'"+str+"'"; + } + } + }else { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + return "N'%"+str+"%'"; + }else{ + return "'%"+str+"%'"; + } + } + } + } + + /** + * 根据权限相关配置生成相关的SQL 语句 + * @param clazz + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static String installAuthJdbc(Class clazz) { + StringBuffer sb = new StringBuffer(); + //权限查询 + Map ruleMap = getRuleMap(); + PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz); + String sql_and = " and "; + for (String c : ruleMap.keySet()) { + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + sb.append(sql_and+getSqlRuleValue(ruleMap.get(c).getRuleValue())); + } + } + String name, column; + for (int i = 0; i < origDescriptors.length; i++) { + name = origDescriptors[i].getName(); + if (judgedIsUselessField(name)) { + continue; + } + if(ruleMap.containsKey(name)) { + column = getTableFieldName(clazz, name); + if(column==null){ + continue; + } + SysPermissionDataRuleModel dataRule = ruleMap.get(name); + QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); + Class propType = origDescriptors[i].getPropertyType(); + boolean isString = propType.equals(String.class); + Object value; + if(isString) { + value = converRuleValue(dataRule.getRuleValue()); + }else { + value = NumberUtils.parseNumber(dataRule.getRuleValue(),propType); + } + String filedSql = getSingleSqlByRule(rule, oConvertUtils.camelToUnderline(column), value,isString); + sb.append(sql_and+filedSql); + } + } + log.info("query auth sql is:"+sb.toString()); + return sb.toString(); + } + + /** + * 根据权限相关配置 组装mp需要的权限 + * @param queryWrapper + * @param clazz + * @return + */ + public static void installAuthMplus(QueryWrapper queryWrapper,Class clazz) { + //权限查询 + Map ruleMap = getRuleMap(); + PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz); + for (String c : ruleMap.keySet()) { + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); + } + } + String name, column; + for (int i = 0; i < origDescriptors.length; i++) { + name = origDescriptors[i].getName(); + if (judgedIsUselessField(name)) { + continue; + } + column = getTableFieldName(clazz, name); + if(column==null){ + continue; + } + if(ruleMap.containsKey(name)) { + addRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper); + } + } + } + + /** + * 转换sql中的系统变量 + * @param sql + * @return + */ + public static String convertSystemVariables(String sql){ + return getSqlRuleValue(sql); + } + + /** + * 获取所有配置的权限 返回sql字符串 不受字段限制 配置什么就拿到什么 + * @return + */ + public static String getAllConfigAuth() { + StringBuffer sb = new StringBuffer(); + //权限查询 + Map ruleMap = getRuleMap(); + String sql_and = " and "; + for (String c : ruleMap.keySet()) { + SysPermissionDataRuleModel dataRule = ruleMap.get(c); + String ruleValue = dataRule.getRuleValue(); + if(oConvertUtils.isEmpty(ruleValue)){ + continue; + } + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + sb.append(sql_and+getSqlRuleValue(ruleValue)); + }else{ + boolean isString = false; + ruleValue = ruleValue.trim(); + if(ruleValue.startsWith("'") && ruleValue.endsWith("'")){ + isString = true; + ruleValue = ruleValue.substring(1,ruleValue.length()-1); + } + QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); + String value = converRuleValue(ruleValue); + String filedSql = getSingleSqlByRule(rule, c, value,isString); + sb.append(sql_and+filedSql); + } + } + log.info("query auth sql is = "+sb.toString()); + return sb.toString(); + } + + + + /** 当前系统数据库类型 */ + private static String DB_TYPE; + /** + * 获取系统数据库类型 + */ + private static String getDbType(){ + return CommonUtils.getDatabaseType(); + } + + + /** + * 获取class的 包括父类的 + * @param clazz + * @return + */ + private static List getClassFields(Class clazz) { + List list = new ArrayList(); + Field[] fields; + do{ + fields = clazz.getDeclaredFields(); + for(int i = 0;i clazz, String name) { + try { + //如果字段加注解了@TableField(exist = false),不走DB查询 + Field field = null; + try { + field = clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + //e.printStackTrace(); + } + + //如果为空,则去父类查找字段 + if (field == null) { + List allFields = getClassFields(clazz); + List searchFields = allFields.stream().filter(a -> a.getName().equals(name)).collect(Collectors.toList()); + if(searchFields!=null && searchFields.size()>0){ + field = searchFields.get(0); + } + } + + if (field != null) { + TableField tableField = field.getAnnotation(TableField.class); + if (tableField != null){ + if(tableField.exist() == false){ + //如果设置了TableField false 这个字段不需要处理 + return null; + }else{ + String column = tableField.value(); + //如果设置了TableField value 这个字段是实体字段 + if(!"".equals(column)){ + return column; + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return name; + } + + /** + * mysql 模糊查询之特殊字符下划线 (_、\) + * + * @param value: + * @Return: java.lang.String + */ + private static String specialStrConvert(String value) { + if (DataBaseConstant.DB_TYPE_MYSQL.equals(getDbType())) { + String[] special_str = QueryGenerator.LIKE_MYSQL_SPECIAL_STRS.split(","); + for (String str : special_str) { + if (value.indexOf(str) !=-1) { + value = value.replace(str, "\\" + str); + } + } + } + return value; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryRuleEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryRuleEnum.java new file mode 100644 index 00000000..bd839137 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryRuleEnum.java @@ -0,0 +1,73 @@ +package com.jero.common.system.query; + +import com.jero.common.util.oConvertUtils; + +/** + * Query 规则 常量 + * @Author Scott + * @Date 2019年02月14日 + */ +public enum QueryRuleEnum { + + GT(">","gt","大于"), + GE(">=","ge","大于等于"), + LT("<","lt","小于"), + LE("<=","le","小于等于"), + EQ("=","eq","等于"), + NE("!=","ne","不等于"), + IN("IN","in","包含"), + LIKE("LIKE","like","全模糊"), + LEFT_LIKE("LEFT_LIKE","left_like","左模糊"), + RIGHT_LIKE("RIGHT_LIKE","right_like","右模糊"), + EQ_WITH_ADD("EQWITHADD","eq_with_add","带加号等于"), + LIKE_WITH_AND("LIKEWITHAND","like_with_and","多词模糊匹配————暂时未用上"), + SQL_RULES("USE_SQL_RULES","ext","自定义SQL片段"); + + private String value; + + private String condition; + + private String msg; + + QueryRuleEnum(String value, String condition, String msg){ + this.value = value; + this.condition = condition; + this.msg = msg; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getCondition() { + return condition; + } + + public void setCondition(String condition) { + this.condition = condition; + } + + public static QueryRuleEnum getByValue(String value){ + if(oConvertUtils.isEmpty(value)) { + return null; + } + for(QueryRuleEnum val :values()){ + if (val.getValue().equals(value) || val.getCondition().equals(value)){ + return val; + } + } + return null; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JeroDataAutorUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JeroDataAutorUtils.java new file mode 100644 index 00000000..bdec01ca --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JeroDataAutorUtils.java @@ -0,0 +1,104 @@ +package com.jero.common.system.util; + +import com.jero.common.system.vo.SysPermissionDataRuleModel; +import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.common.util.SpringContextUtils; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName: JeroDataAutorUtils + * @Description: 数据权限查询规则容器工具类 + * @Author: 张代浩 + * @Date: 2012-12-15 下午11:27:39 + * + */ +public class JeroDataAutorUtils { + + public static final String MENU_DATA_AUTHOR_RULES = "MENU_DATA_AUTHOR_RULES"; + + public static final String MENU_DATA_AUTHOR_RULE_SQL = "MENU_DATA_AUTHOR_RULE_SQL"; + + public static final String SYS_USER_INFO = "SYS_USER_INFO"; + + /** + * 往链接请求里面,传入数据查询条件 + * + * @param request + * @param dataRules + */ + public static synchronized void installDataSearchConditon(HttpServletRequest request, List dataRules) { + @SuppressWarnings("unchecked") + List list = (List)loadDataSearchConditon();// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST + if (list==null) { + // 2.如果不存在,则new一个list + list = new ArrayList(); + } + for (SysPermissionDataRuleModel tsDataRule : dataRules) { + list.add(tsDataRule); + } + request.setAttribute(MENU_DATA_AUTHOR_RULES, list); // 3.往list里面增量存指 + } + + /** + * 获取请求对应的数据权限规则 + * + * @return + */ + @SuppressWarnings("unchecked") + public static synchronized List loadDataSearchConditon() { + return (List) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULES); + + } + + /** + * 获取请求对应的数据权限SQL + * + * @return + */ + public static synchronized String loadDataSearchConditonSQLString() { + return (String) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULE_SQL); + } + + /** + * 往链接请求里面,传入数据查询条件 + * + * @param request + * @param sql + */ + public static synchronized void installDataSearchConditon(HttpServletRequest request, String sql) { + String ruleSql = (String)loadDataSearchConditonSQLString(); + if (!StringUtils.hasText(ruleSql)) { + request.setAttribute(MENU_DATA_AUTHOR_RULE_SQL,sql); + } + } + + /** + * 将用户信息存到request + * @param request + * @param userinfo + */ + public static synchronized void installUserInfo(HttpServletRequest request, SysUserCacheInfo userinfo) { + request.setAttribute(SYS_USER_INFO, userinfo); + } + + /** + * 将用户信息存到request + * @param userinfo + */ + public static synchronized void installUserInfo(SysUserCacheInfo userinfo) { + SpringContextUtils.getHttpServletRequest().setAttribute(SYS_USER_INFO, userinfo); + } + + /** + * 从request获取用户信息 + * @return + */ + public static synchronized SysUserCacheInfo loadUserInfo() { + return (SysUserCacheInfo) SpringContextUtils.getHttpServletRequest().getAttribute(SYS_USER_INFO); + + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java new file mode 100644 index 00000000..56c2952d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java @@ -0,0 +1,208 @@ +package com.jero.common.system.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.google.common.base.Joiner; + +import java.util.Date; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.shiro.SecurityUtils; +import com.jero.common.constant.DataBaseConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.common.util.DateUtils; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; + +/** + * @Author Scott + * @Date 2018-07-12 14:23 + * @Desc JWT工具类 + **/ +public class JwtUtil { + + // Token过期时间30分钟(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准) + public static final long EXPIRE_TIME = 30 * 60 * 1000; + + /** + * 校验token是否正确 + * + * @param token 密钥 + * @param secret 用户的密码 + * @return 是否正确 + */ + public static boolean verify(String token, String username, String secret) { + try { + // 根据密码生成JWT效验器 + Algorithm algorithm = Algorithm.HMAC256(secret); + JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build(); + // 效验TOKEN + DecodedJWT jwt = verifier.verify(token); + return true; + } catch (Exception exception) { + return false; + } + } + + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的用户名 + */ + public static String getUsername(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("username").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + /** + * 生成签名,5min后过期 + * + * @param username 用户名 + * @param secret 用户的密码 + * @return 加密的token + */ + public static String sign(String username, String secret) { + Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Algorithm algorithm = Algorithm.HMAC256(secret); + // 附带username信息 + return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm); + + } + + /** + * 根据request中的token获取用户账号 + * + * @param request + * @return + * @throws JeroBootException + */ + public static String getUserNameByToken(HttpServletRequest request) throws JeroBootException { + String accessToken = request.getHeader("X-Access-Token"); + String username = getUsername(accessToken); + if (oConvertUtils.isEmpty(username)) { + throw new JeroBootException("未获取到用户"); + } + return username; + } + + /** + * 从session中获取变量 + * @param key + * @return + */ + public static String getSessionData(String key) { + //${myVar}% + //得到${} 后面的值 + String moshi = ""; + if(key.indexOf("}")!=-1){ + moshi = key.substring(key.indexOf("}")+1); + } + String returnValue = null; + if (key.contains("#{")) { + key = key.substring(2,key.indexOf("}")); + } + if (oConvertUtils.isNotEmpty(key)) { + HttpSession session = SpringContextUtils.getHttpServletRequest().getSession(); + returnValue = (String) session.getAttribute(key); + } + //结果加上${} 后面的值 + if(returnValue!=null){returnValue = returnValue + moshi;} + return returnValue; + } + + /** + * 从当前用户中获取变量 + * @param key + * @param user + * @return + */ + //TODO 急待改造 sckjkdsjsfjdk + public static String getUserSystemData(String key,SysUserCacheInfo user) { + if(user==null) { + user = JeroDataAutorUtils.loadUserInfo(); + } + //#{sys_user_code}% + + // 获取登录用户信息 + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + String moshi = ""; + if(key.indexOf("}")!=-1){ + moshi = key.substring(key.indexOf("}")+1); + } + String returnValue = null; + //针对特殊标示处理#{sysOrgCode},判断替换 + if (key.contains("#{")) { + key = key.substring(2,key.indexOf("}")); + } else { + key = key; + } + //替换为系统登录用户帐号 + if (key.equals(DataBaseConstant.SYS_USER_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_CODE_TABLE)) { + if(user==null) { + returnValue = sysUser.getUsername(); + }else { + returnValue = user.getSysUserCode(); + } + } + //替换为系统登录用户真实名字 + else if (key.equals(DataBaseConstant.SYS_USER_NAME)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_NAME_TABLE)) { + if(user==null) { + returnValue = sysUser.getRealname(); + }else { + returnValue = user.getSysUserName(); + } + } + + //替换为系统用户登录所使用的机构编码 + else if (key.equals(DataBaseConstant.SYS_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) { + if(user==null) { + returnValue = sysUser.getOrgCode(); + }else { + returnValue = user.getSysOrgCode(); + } + } + //替换为系统用户所拥有的所有机构编码 + else if (key.equals(DataBaseConstant.SYS_MULTI_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE)) { + if(user==null){ + //TODO 暂时使用用户登录部门,存在逻辑缺陷,不是用户所拥有的部门 + returnValue = sysUser.getOrgCode(); + }else{ + if(user.isOneDepart()) { + returnValue = user.getSysMultiOrgCode().get(0); + }else { + returnValue = Joiner.on(",").join(user.getSysMultiOrgCode()); + } + } + } + //替换为当前系统时间(年月日) + else if (key.equals(DataBaseConstant.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) { + returnValue = DateUtils.formatDate(); + } + //替换为当前系统时间(年月日时分秒) + else if (key.equals(DataBaseConstant.SYS_TIME)|| key.toLowerCase().equals(DataBaseConstant.SYS_TIME_TABLE)) { + returnValue = DateUtils.now(); + } + //流程状态默认值(默认未发起) + else if (key.equals(DataBaseConstant.BPM_STATUS)|| key.toLowerCase().equals(DataBaseConstant.BPM_STATUS_TABLE)) { + returnValue = "1"; + } + if(returnValue!=null){returnValue = returnValue + moshi;} + return returnValue; + } + +// public static void main(String[] args) { +// String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjUzMzY1MTMsInVzZXJuYW1lIjoiYWRtaW4ifQ.xjhud_tWCNYBOg_aRlMgOdlZoWFFKB_givNElHNw3X0"; +// System.out.println(JwtUtil.getUsername(token)); +// } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/ComboModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/ComboModel.java new file mode 100644 index 00000000..8f3e2a5e --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/ComboModel.java @@ -0,0 +1,36 @@ +package com.jero.common.system.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@JsonIgnoreProperties(ignoreUnknown = true) +public class ComboModel implements Serializable { + private String id; + private String title; + /**文档管理 表单table默认选中*/ + private boolean checked; + /**文档管理 表单table 用户账号*/ + private String username; + /**文档管理 表单table 用户邮箱*/ + private String email; + /**文档管理 表单table 角色编码*/ + private String roleCode; + + public ComboModel(){ + + }; + + public ComboModel(String id,String title,boolean checked,String username){ + this.id = id; + this.title = title; + this.checked = false; + this.username = username; + }; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictModel.java new file mode 100644 index 00000000..dfd5dfa6 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictModel.java @@ -0,0 +1,43 @@ +package com.jero.common.system.vo; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@JsonIgnoreProperties(ignoreUnknown = true) +public class DictModel implements Serializable{ + private static final long serialVersionUID = 1L; + + public DictModel() { + } + + public DictModel(String value, String text) { + this.value = value; + this.text = text; + } + + /** + * 字典value + */ + private String value; + /** + * 字典文本 + */ + private String text; + + /** + * 特殊用途: JgEditableTable + * @return + */ + public String getTitle() { + return this.text; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictQuery.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictQuery.java new file mode 100644 index 00000000..062e7fe5 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DictQuery.java @@ -0,0 +1,34 @@ +package com.jero.common.system.vo; + +import lombok.Data; + +/** + * 字典查询参数实体 + */ +@Data +public class DictQuery { + /** + * 表名 + */ + private String table; + /** + * 存储列 + */ + private String code; + + /** + * 显示列 + */ + private String text; + + /** + * 关键字查询 + */ + private String keyword; + + /** + * 存储列的值 用于回显查询 + */ + private String codeValue; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DynamicDataSourceModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DynamicDataSourceModel.java new file mode 100644 index 00000000..38b46040 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/DynamicDataSourceModel.java @@ -0,0 +1,52 @@ +package com.jero.common.system.vo; + +import lombok.Data; +import org.springframework.beans.BeanUtils; + +@Data +public class DynamicDataSourceModel { + + public DynamicDataSourceModel() { + + } + + public DynamicDataSourceModel(Object dbSource) { + if (dbSource != null) { + BeanUtils.copyProperties(dbSource, this); + } + } + + /** + * id + */ + private java.lang.String id; + /** + * 数据源编码 + */ + private java.lang.String code; + /** + * 数据库类型 + */ + private java.lang.String dbType; + /** + * 驱动类 + */ + private java.lang.String dbDriver; + /** + * 数据源地址 + */ + private java.lang.String dbUrl; + /** + * 数据库名称 + */ + private java.lang.String dbName; + /** + * 用户名 + */ + private java.lang.String dbUsername; + /** + * 密码 + */ + private java.lang.String dbPassword; + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java new file mode 100644 index 00000000..ed02455d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java @@ -0,0 +1,119 @@ +package com.jero.common.system.vo; + +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 在线用户信息 + *

+ * + * @Author scott + * @since 2018-12-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class LoginUser { + + /** + * 登录人id + */ + private String id; + + /** + * 登录人账号 + */ + private String username; + + /** + * 登录人名字 + */ + private String realname; + + /** + * 登录人密码 + */ + private String password; + + /** + * 当前登录部门code + */ + private String orgCode; + /** + * 头像 + */ + private String avatar; + + /** + * 生日 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birthday; + + /** + * 性别(1:男 2:女) + */ + private Integer sex; + + /** + * 电子邮件 + */ + private String email; + + /** + * 电话 + */ + private String phone; + + /** + * 状态(1:正常 2:冻结 ) + */ + private Integer status; + + private Integer delFlag; + /** + * 同步工作流引擎1同步0不同步 + */ + private Integer activitiSync; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 身份(1 普通员工 2 上级) + */ + private Integer userIdentity; + + /** + * 管理部门ids + */ + private String departIds; + + /** + * 职务,关联职务表 + */ + private String post; + + /** + * 座机号 + */ + private String telephone; + + /**多租户id配置,编辑用户的时候设置*/ + private String relTenantIds; + + /**设备id uniapp推送用*/ + private String clientId; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysCategoryModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysCategoryModel.java new file mode 100644 index 00000000..8e3390fe --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysCategoryModel.java @@ -0,0 +1,52 @@ +package com.jero.common.system.vo; + +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Author qinfeng + * @Date 2020/2/19 12:01 + * @Description: + * @Version 1.0 + */ +public class SysCategoryModel { + /**主键*/ + private java.lang.String id; + /**父级节点*/ + private java.lang.String pid; + /**类型名称*/ + private java.lang.String name; + /**类型编码*/ + private java.lang.String code; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartModel.java new file mode 100644 index 00000000..dd41f8a5 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartModel.java @@ -0,0 +1,147 @@ +package com.jero.common.system.vo; + +/** + * lvdandan 部门机构model + */ +public class SysDepartModel { + /**ID*/ + private String id; + /**父机构ID*/ + private String parentId; + /**机构/部门名称*/ + private String departName; + /**英文名*/ + private String departNameEn; + /**缩写*/ + private String departNameAbbr; + /**排序*/ + private Integer departOrder; + /**描述*/ + private String description; + /**机构类别 1组织机构,2岗位*/ + private String orgCategory; + /**机构类型*/ + private String orgType; + /**机构编码*/ + private String orgCode; + /**手机号*/ + private String mobile; + /**传真*/ + private String fax; + /**地址*/ + private String address; + /**备注*/ + private String memo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } + + public String getDepartNameEn() { + return departNameEn; + } + + public void setDepartNameEn(String departNameEn) { + this.departNameEn = departNameEn; + } + + public String getDepartNameAbbr() { + return departNameAbbr; + } + + public void setDepartNameAbbr(String departNameAbbr) { + this.departNameAbbr = departNameAbbr; + } + + public Integer getDepartOrder() { + return departOrder; + } + + public void setDepartOrder(Integer departOrder) { + this.departOrder = departOrder; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getOrgCategory() { + return orgCategory; + } + + public void setOrgCategory(String orgCategory) { + this.orgCategory = orgCategory; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getFax() { + return fax; + } + + public void setFax(String fax) { + this.fax = fax; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartTreeModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartTreeModel.java new file mode 100644 index 00000000..63f30352 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysDepartTreeModel.java @@ -0,0 +1,340 @@ +package com.jero.common.system.vo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 部门表 存储树结构数据的实体类 + *

+ * + * @Author Steve + * @Since 2019-01-22 + */ +public class SysDepartTreeModel implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** 对应SysDepart中的id字段,前端数据树中的key*/ + private String key; + + /** 对应SysDepart中的id字段,前端数据树中的value*/ + private String value; + + /** 对应depart_name字段,前端数据树中的title*/ + private String title; + + + private boolean isLeaf; + // 以下所有字段均与SysDepart相同 + + private String id; + + private String parentId; + + private String departName; + + private String departNameEn; + + private String departNameAbbr; + + private Integer departOrder; + + private String description; + + private String orgCategory; + + private String orgType; + + private String orgCode; + + private String mobile; + + private String fax; + + private String address; + + private String memo; + + private String status; + + private String delFlag; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + + private List children = new ArrayList<>(); + + + + public boolean getIsLeaf() { + return isLeaf; + } + + public void setIsLeaf(boolean isleaf) { + this.isLeaf = isleaf; + } + + public String getKey() { + return key; + } + + + public void setKey(String key) { + this.key = key; + } + + + public String getValue() { + return value; + } + + + public void setValue(String value) { + this.value = value; + } + + + public String getTitle() { + return title; + } + + + public void setTitle(String title) { + this.title = title; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + if (children==null){ + this.isLeaf=true; + } + this.children = children; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } + + public String getOrgCategory() { + return orgCategory; + } + + public void setOrgCategory(String orgCategory) { + this.orgCategory = orgCategory; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getFax() { + return fax; + } + + public void setFax(String fax) { + this.fax = fax; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getDepartNameEn() { + return departNameEn; + } + + public void setDepartNameEn(String departNameEn) { + this.departNameEn = departNameEn; + } + + public String getDepartNameAbbr() { + return departNameAbbr; + } + + public void setDepartNameAbbr(String departNameAbbr) { + this.departNameAbbr = departNameAbbr; + } + + public Integer getDepartOrder() { + return departOrder; + } + + public void setDepartOrder(Integer departOrder) { + this.departOrder = departOrder; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public SysDepartTreeModel() { } + + /** + * 重写equals方法 + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SysDepartTreeModel model = (SysDepartTreeModel) o; + return Objects.equals(id, model.id) && + Objects.equals(parentId, model.parentId) && + Objects.equals(departName, model.departName) && + Objects.equals(departNameEn, model.departNameEn) && + Objects.equals(departNameAbbr, model.departNameAbbr) && + Objects.equals(departOrder, model.departOrder) && + Objects.equals(description, model.description) && + Objects.equals(orgCategory, model.orgCategory) && + Objects.equals(orgType, model.orgType) && + Objects.equals(orgCode, model.orgCode) && + Objects.equals(mobile, model.mobile) && + Objects.equals(fax, model.fax) && + Objects.equals(address, model.address) && + Objects.equals(memo, model.memo) && + Objects.equals(status, model.status) && + Objects.equals(delFlag, model.delFlag) && + Objects.equals(createBy, model.createBy) && + Objects.equals(createTime, model.createTime) && + Objects.equals(updateBy, model.updateBy) && + Objects.equals(updateTime, model.updateTime) && + Objects.equals(children, model.children); + } + + /** + * 重写hashCode方法 + */ + @Override + public int hashCode() { + + return Objects.hash(id, parentId, departName, departNameEn, departNameAbbr, + departOrder, description, orgCategory, orgType, orgCode, mobile, fax, address, + memo, status, delFlag, createBy, createTime, updateBy, updateTime, + children); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysPermissionDataRuleModel.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysPermissionDataRuleModel.java new file mode 100644 index 00000000..1df0fb81 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysPermissionDataRuleModel.java @@ -0,0 +1,151 @@ +package com.jero.common.system.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 菜单权限规则表 + *

+ * + * @Author huangzhilin + * @since 2019-03-29 + */ +public class SysPermissionDataRuleModel { + + /** + * id + */ + private String id; + + /** + * 对应的菜单id + */ + private String permissionId; + + /** + * 规则名称 + */ + private String ruleName; + + /** + * 字段 + */ + private String ruleColumn; + + /** + * 条件 + */ + private String ruleConditions; + + /** + * 规则值 + */ + private String ruleValue; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 修改人 + */ + private String updateBy; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPermissionId() { + return permissionId; + } + + public void setPermissionId(String permissionId) { + this.permissionId = permissionId; + } + + public String getRuleName() { + return ruleName; + } + + public void setRuleName(String ruleName) { + this.ruleName = ruleName; + } + + public String getRuleColumn() { + return ruleColumn; + } + + public void setRuleColumn(String ruleColumn) { + this.ruleColumn = ruleColumn; + } + + public String getRuleConditions() { + return ruleConditions; + } + + public void setRuleConditions(String ruleConditions) { + this.ruleConditions = ruleConditions; + } + + public String getRuleValue() { + return ruleValue; + } + + public void setRuleValue(String ruleValue) { + this.ruleValue = ruleValue; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysUserCacheInfo.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysUserCacheInfo.java new file mode 100644 index 00000000..aa25d963 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/SysUserCacheInfo.java @@ -0,0 +1,67 @@ +package com.jero.common.system.vo; + +import java.util.List; + +import com.jero.common.util.DateUtils; + +public class SysUserCacheInfo { + + private String sysUserCode; + + private String sysUserName; + + private String sysOrgCode; + + private List sysMultiOrgCode; + + private boolean oneDepart; + + public boolean isOneDepart() { + return oneDepart; + } + + public void setOneDepart(boolean oneDepart) { + this.oneDepart = oneDepart; + } + + public String getSysDate() { + return DateUtils.formatDate(); + } + + public String getSysTime() { + return DateUtils.now(); + } + + public String getSysUserCode() { + return sysUserCode; + } + + public void setSysUserCode(String sysUserCode) { + this.sysUserCode = sysUserCode; + } + + public String getSysUserName() { + return sysUserName; + } + + public void setSysUserName(String sysUserName) { + this.sysUserName = sysUserName; + } + + public String getSysOrgCode() { + return sysOrgCode; + } + + public void setSysOrgCode(String sysOrgCode) { + this.sysOrgCode = sysOrgCode; + } + + public List getSysMultiOrgCode() { + return sysMultiOrgCode; + } + + public void setSysMultiOrgCode(List sysMultiOrgCode) { + this.sysMultiOrgCode = sysMultiOrgCode; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserType.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserType.java new file mode 100644 index 00000000..8900ae54 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserType.java @@ -0,0 +1,10 @@ +package com.jero.common.util; + +/** + * + * @Author 张代浩 + * + */ +public enum BrowserType { + IE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserUtils.java new file mode 100644 index 00000000..8647ea8d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/BrowserUtils.java @@ -0,0 +1,206 @@ +package com.jero.common.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +/** + * + * @Author 张代浩 + * + */ +public class BrowserUtils { + + // 判断是否是IE + public static boolean isIE(HttpServletRequest request) { + return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request + .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true + : false; + } + + /** + * 获取IE版本 + * + * @param request + * @return + */ + public static Double getIEversion(HttpServletRequest request) { + Double version = 0.0; + if (getBrowserType(request, IE11)) { + version = 11.0; + } else if (getBrowserType(request, IE10)) { + version = 10.0; + } else if (getBrowserType(request, IE9)) { + version = 9.0; + } else if (getBrowserType(request, IE8)) { + version = 8.0; + } else if (getBrowserType(request, IE7)) { + version = 7.0; + } else if (getBrowserType(request, IE6)) { + version = 6.0; + } + return version; + } + + /** + * 获取浏览器类型 + * + * @param request + * @return + */ + public static BrowserType getBrowserType(HttpServletRequest request) { + BrowserType browserType = null; + if (getBrowserType(request, IE11)) { + browserType = BrowserType.IE11; + } + if (getBrowserType(request, IE10)) { + browserType = BrowserType.IE10; + } + if (getBrowserType(request, IE9)) { + browserType = BrowserType.IE9; + } + if (getBrowserType(request, IE8)) { + browserType = BrowserType.IE8; + } + if (getBrowserType(request, IE7)) { + browserType = BrowserType.IE7; + } + if (getBrowserType(request, IE6)) { + browserType = BrowserType.IE6; + } + if (getBrowserType(request, FIREFOX)) { + browserType = BrowserType.Firefox; + } + if (getBrowserType(request, SAFARI)) { + browserType = BrowserType.Safari; + } + if (getBrowserType(request, CHROME)) { + browserType = BrowserType.Chrome; + } + if (getBrowserType(request, OPERA)) { + browserType = BrowserType.Opera; + } + if (getBrowserType(request, "Camino")) { + browserType = BrowserType.Camino; + } + return browserType; + } + + private static boolean getBrowserType(HttpServletRequest request, + String brosertype) { + return request.getHeader("USER-AGENT").toLowerCase() + .indexOf(brosertype) > 0 ? true : false; + } + + private final static String IE11 = "rv:11.0"; + private final static String IE10 = "MSIE 10.0"; + private final static String IE9 = "MSIE 9.0"; + private final static String IE8 = "MSIE 8.0"; + private final static String IE7 = "MSIE 7.0"; + private final static String IE6 = "MSIE 6.0"; + private final static String MAXTHON = "Maxthon"; + private final static String QQ = "QQBrowser"; + private final static String GREEN = "GreenBrowser"; + private final static String SE360 = "360SE"; + private final static String FIREFOX = "Firefox"; + private final static String OPERA = "Opera"; + private final static String CHROME = "Chrome"; + private final static String SAFARI = "Safari"; + private final static String OTHER = "其它"; + + public static String checkBrowse(HttpServletRequest request) { + String userAgent = request.getHeader("USER-AGENT"); + if (regex(OPERA, userAgent)) { + return OPERA; + } + if (regex(CHROME, userAgent)) { + return CHROME; + } + if (regex(FIREFOX, userAgent)) { + return FIREFOX; + } + if (regex(SAFARI, userAgent)) { + return SAFARI; + } + if (regex(SE360, userAgent)) { + return SE360; + } + if (regex(GREEN, userAgent)) { + return GREEN; + } + if (regex(QQ, userAgent)) { + return QQ; + } + if (regex(MAXTHON, userAgent)) { + return MAXTHON; + } + if (regex(IE11, userAgent)) { + return IE11; + } + if (regex(IE10, userAgent)) { + return IE10; + } + if (regex(IE9, userAgent)) { + return IE9; + } + if (regex(IE8, userAgent)) { + return IE8; + } + if (regex(IE7, userAgent)) { + return IE7; + } + if (regex(IE6, userAgent)) { + return IE6; + } + return OTHER; + } + + public static boolean regex(String regex, String str) { + Pattern p = Pattern.compile(regex, Pattern.MULTILINE); + Matcher m = p.matcher(str); + return m.find(); + } + + + private static Map langMap = new HashMap(); + private final static String ZH = "zh"; + private final static String ZH_CN = "zh-cn"; + + private final static String EN = "en"; + private final static String EN_US = "en"; + + + static + { + langMap.put(ZH, ZH_CN); + langMap.put(EN, EN_US); + } + + public static String getBrowserLanguage(HttpServletRequest request) { + + String browserLang = request.getLocale().getLanguage(); + String browserLangCode = (String)langMap.get(browserLang); + + if(browserLangCode == null) + { + browserLangCode = EN_US; + } + return browserLangCode; + } + + /** 判断请求是否来自电脑端 */ + public static boolean isDesktop(HttpServletRequest request) { + return !isMobile(request); + } + + /** 判断请求是否来自移动端 */ + public static boolean isMobile(HttpServletRequest request) { + String ua = request.getHeader("User-Agent").toLowerCase(); + Pattern pattern = Pattern.compile("(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windows phone)"); + return pattern.matcher(ua).find(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/CommonUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/CommonUtils.java new file mode 100644 index 00000000..eaa9de9e --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/CommonUtils.java @@ -0,0 +1,239 @@ +package com.jero.common.util; + +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.DataBaseConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.oss.OssBootUtil; +import org.jeecgframework.poi.util.PoiPublicUtil; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.sql.DataSource; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Base64; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Slf4j +public class CommonUtils { + + //中文正则 + private static Pattern ZHONGWEN_PATTERN = Pattern.compile("[\u4e00-\u9fa5]"); + + public static String uploadOnlineImage(byte[] data,String basePath,String bizPath,String uploadType){ + String dbPath = null; + String fileName = "image" + Math.round(Math.random() * 100000000000L); + fileName += "." + PoiPublicUtil.getFileExtendName(data); + try { + if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){ + File file = new File(basePath + File.separator + bizPath + File.separator ); + if (!file.exists()) { + file.mkdirs();// 创建文件根目录 + } + String savePath = file.getPath() + File.separator + fileName; + File savefile = new File(savePath); + FileCopyUtils.copy(data, savefile); + dbPath = bizPath + File.separator + fileName; + }else { + InputStream in = new ByteArrayInputStream(data); + String relativePath = bizPath+"/"+fileName; + if(CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)){ + dbPath = MinioUtil.upload(in,relativePath); + }else if(CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)){ + dbPath = OssBootUtil.upload(in,relativePath); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return dbPath; + } + + /** + * 判断文件名是否带盘符,重新处理 + * @param fileName + * @return + */ + public static String getFileName(String fileName){ + //判断是否带有盘符信息 + // Check for Unix-style path + int unixSep = fileName.lastIndexOf('/'); + // Check for Windows-style path + int winSep = fileName.lastIndexOf('\\'); + // Cut off at latest possible point + int pos = (winSep > unixSep ? winSep : unixSep); + if (pos != -1) { + // Any sort of path separator found... + fileName = fileName.substring(pos + 1); + } + //替换上传文件名字的特殊字符 + fileName = fileName.replace("=","").replace(",","").replace("&","").replace("#", ""); + //替换上传文件名字中的空格 + fileName=fileName.replaceAll("\\s",""); + return fileName; + } + + // java 判断字符串里是否包含中文字符 + public static boolean ifContainChinese(String str) { + if(str.getBytes().length == str.length()){ + return false; + }else{ + Matcher m = ZHONGWEN_PATTERN.matcher(str); + if (m.find()) { + return true; + } + return false; + } + } + + /** + * 统一全局上传 + * @Return: java.lang.String + */ + public static String upload(MultipartFile file, String bizPath, String uploadType) { + String url = ""; + if(CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)){ + url = MinioUtil.upload(file,bizPath); + }else{ + url = OssBootUtil.upload(file,bizPath); + } + return url; + } + + /** + * 统一全局上传 带桶 + * @Return: java.lang.String + */ + public static String upload(MultipartFile file, String bizPath, String uploadType, String customBucket) { + String url = ""; + if(CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)){ + url = MinioUtil.upload(file,bizPath,customBucket); + }else{ + url = OssBootUtil.upload(file,bizPath,customBucket); + } + return url; + } + /** + * 本地文件上传 + * @param mf 文件 + * @param bizPath 自定义路径 + * @return + */ + public static String uploadLocal(MultipartFile mf,String bizPath, String uploadpath){ + try { + String ctxPath = uploadpath; + String fileName = null; + File file = new File(ctxPath + File.separator + bizPath + File.separator ); + if (!file.exists()) { + file.mkdirs();// 创建文件根目录 + } + String orgName = mf.getOriginalFilename();// 获取文件名 + orgName = CommonUtils.getFileName(orgName); + if(orgName.indexOf(".")!=-1){ + fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(".")); + }else{ + fileName = orgName+ "_" + System.currentTimeMillis(); + } + String savePath = file.getPath() + File.separator + fileName; + File savefile = new File(savePath); + FileCopyUtils.copy(mf.getBytes(), savefile); + String dbpath = null; + if(oConvertUtils.isNotEmpty(bizPath)){ + dbpath = bizPath + File.separator + fileName; + }else{ + dbpath = fileName; + } + if (dbpath.contains("\\")) { + dbpath = dbpath.replace("\\", "/"); + } + return dbpath; + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return ""; + } + /** 当前系统数据库类型 */ + private static String DB_TYPE = ""; + public static String getDatabaseType() { + if(oConvertUtils.isNotEmpty(DB_TYPE)){ + return DB_TYPE; + } + DataSource dataSource = SpringContextUtils.getApplicationContext().getBean(DataSource.class); + try { + return getDatabaseTypeByDataSource(dataSource); + } catch (SQLException e) { + //e.printStackTrace(); + log.warn(e.getMessage()); + return ""; + } + } + + /** + * 获取数据库类型 + * @param dataSource + * @return + * @throws SQLException + */ + private static String getDatabaseTypeByDataSource(DataSource dataSource) throws SQLException{ + if("".equals(DB_TYPE)) { + Connection connection = dataSource.getConnection(); + try { + DatabaseMetaData md = connection.getMetaData(); + String dbType = md.getDatabaseProductName().toLowerCase(); + if(dbType.indexOf("mysql")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL; + }else if(dbType.indexOf("oracle")>=0 ||dbType.indexOf("dm")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE; + }else if(dbType.indexOf("sqlserver")>=0||dbType.indexOf("sql server")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER; + }else if(dbType.indexOf("postgresql")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL; + }else { + throw new JeroBootException("数据库类型:["+dbType+"]不识别!"); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally { + connection.close(); + } + } + return DB_TYPE; + + } + /** + * 黑名单限制文件 + * @date 2021/4/14 6:18 + * @param fileName 文件名 + * @return boolean true:处于黑名单 false:不处于黑名单 + */ + public static boolean limitFileSuffix(String fileName,String[] fileSuffixLimits){ + final List fileNameList = Arrays.asList(fileSuffixLimits); + boolean isExists = fileNameList.stream().anyMatch(name -> fileName.substring(0,fileName.lastIndexOf('.')).contains(name)||fileName.substring(fileName.lastIndexOf('.')).equals(name)); + return isExists; + } + /** + * RSA 使用私钥解密 + * @date 2021/4/15 16:11 + * @param str 待解密的字符串 + * @param RSAPrivateKey 私钥 + * @return String 解密后的字符串 + */ + public static String decryptBtRsaPriKey(String str,String RSAPrivateKey) throws Exception { + RSA rsa = new RSA(RSAPrivateKey, null); + byte[] decrypt = rsa.decrypt(str, KeyType.PrivateKey); + return new String(decrypt); + } + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DateUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DateUtils.java new file mode 100644 index 00000000..c6712e45 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DateUtils.java @@ -0,0 +1,650 @@ +package com.jero.common.util; + +import java.beans.PropertyEditorSupport; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.springframework.util.StringUtils; + +/** + * 类描述:时间操作定义类 + * + * @Author: 张代浩 + * @Date:2012-12-8 12:15:03 + * @Version 1.0 + */ +public class DateUtils extends PropertyEditorSupport { + + public static ThreadLocal date_sdf = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd"); + } + }; + public static ThreadLocal yyyyMMdd = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyyMMdd"); + } + }; + public static ThreadLocal date_sdf_wz = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy年MM月dd日"); + } + }; + public static ThreadLocal time_sdf = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm"); + } + }; + public static ThreadLocal yyyymmddhhmmss = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyyMMddHHmmss"); + } + }; + public static ThreadLocal short_time_sdf = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("HH:mm"); + } + }; + public static ThreadLocal datetimeFormat = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + // 以毫秒表示的时间 + private static final long DAY_IN_MILLIS = 24 * 3600 * 1000; + private static final long HOUR_IN_MILLIS = 3600 * 1000; + private static final long MINUTE_IN_MILLIS = 60 * 1000; + private static final long SECOND_IN_MILLIS = 1000; + + // 指定模式的时间格式 + private static SimpleDateFormat getSDFormat(String pattern) { + return new SimpleDateFormat(pattern); + } + + /** + * 当前日历,这里用中国时间表示 + * + * @return 以当地时区表示的系统当前日历 + */ + public static Calendar getCalendar() { + return Calendar.getInstance(); + } + + /** + * 指定毫秒数表示的日历 + * + * @param millis 毫秒数 + * @return 指定毫秒数表示的日历 + */ + public static Calendar getCalendar(long millis) { + Calendar cal = Calendar.getInstance(); + // --------------------cal.setTimeInMillis(millis); + cal.setTime(new Date(millis)); + return cal; + } + + // //////////////////////////////////////////////////////////////////////////// + // getDate + // 各种方式获取的Date + // //////////////////////////////////////////////////////////////////////////// + + /** + * 当前日期 + * + * @return 系统当前时间 + */ + public static Date getDate() { + return new Date(); + } + + /** + * 指定毫秒数表示的日期 + * + * @param millis 毫秒数 + * @return 指定毫秒数表示的日期 + */ + public static Date getDate(long millis) { + return new Date(millis); + } + + /** + * 时间戳转换为字符串 + * + * @param time + * @return + */ + public static String timestamptoStr(Timestamp time) { + Date date = null; + if (null != time) { + date = new Date(time.getTime()); + } + return date2Str(date_sdf.get()); + } + + /** + * 字符串转换时间戳 + * + * @param str + * @return + */ + public static Timestamp str2Timestamp(String str) { + Date date = str2Date(str, date_sdf.get()); + return new Timestamp(date.getTime()); + } + + /** + * 字符串转换成日期 + * + * @param str + * @param sdf + * @return + */ + public static Date str2Date(String str, SimpleDateFormat sdf) { + if (null == str || "".equals(str)) { + return null; + } + Date date = null; + try { + date = sdf.parse(str); + return date; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 日期转换为字符串 + * + * @param date_sdf 日期格式 + * @return 字符串 + */ + public static String date2Str(SimpleDateFormat date_sdf) { + Date date = getDate(); + if (null == date) { + return null; + } + return date_sdf.format(date); + } + + /** + * 格式化时间 + * + * @param date + * @param format + * @return + */ + public static String dateformat(String date, String format) { + SimpleDateFormat sformat = new SimpleDateFormat(format); + Date _date = null; + try { + _date = sformat.parse(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return sformat.format(_date); + } + + /** + * 日期转换为字符串 + * + * @param date 日期 + * @param date_sdf 日期格式 + * @return 字符串 + */ + public static String date2Str(Date date, SimpleDateFormat date_sdf) { + if (null == date) { + return null; + } + return date_sdf.format(date); + } + + /** + * 日期转换为字符串 + * + * @param format 日期格式 + * @return 字符串 + */ + public static String getDate(String format) { + Date date = new Date(); + if (null == date) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + } + + /** + * 指定毫秒数的时间戳 + * + * @param millis 毫秒数 + * @return 指定毫秒数的时间戳 + */ + public static Timestamp getTimestamp(long millis) { + return new Timestamp(millis); + } + + /** + * 以字符形式表示的时间戳 + * + * @param time 毫秒数 + * @return 以字符形式表示的时间戳 + */ + public static Timestamp getTimestamp(String time) { + return new Timestamp(Long.parseLong(time)); + } + + /** + * 系统当前的时间戳 + * + * @return 系统当前的时间戳 + */ + public static Timestamp getTimestamp() { + return new Timestamp(System.currentTimeMillis()); + } + + /** + * 当前时间,格式 yyyy-MM-dd HH:mm:ss + * + * @return 当前时间的标准形式字符串 + */ + public static String now() { + return datetimeFormat.get().format(getCalendar().getTime()); + } + + /** + * 指定日期的时间戳 + * + * @param date 指定日期 + * @return 指定日期的时间戳 + */ + public static Timestamp getTimestamp(Date date) { + return new Timestamp(date.getTime()); + } + + /** + * 指定日历的时间戳 + * + * @param cal 指定日历 + * @return 指定日历的时间戳 + */ + public static Timestamp getCalendarTimestamp(Calendar cal) { + // ---------------------return new Timestamp(cal.getTimeInMillis()); + return new Timestamp(cal.getTime().getTime()); + } + + public static Timestamp gettimestamp() { + Date dt = new Date(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String nowTime = df.format(dt); + java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime); + return buydate; + } + + // //////////////////////////////////////////////////////////////////////////// + // getMillis + // 各种方式获取的Millis + // //////////////////////////////////////////////////////////////////////////// + + /** + * 系统时间的毫秒数 + * + * @return 系统时间的毫秒数 + */ + public static long getMillis() { + return System.currentTimeMillis(); + } + + /** + * 指定日历的毫秒数 + * + * @param cal 指定日历 + * @return 指定日历的毫秒数 + */ + public static long getMillis(Calendar cal) { + // --------------------return cal.getTimeInMillis(); + return cal.getTime().getTime(); + } + + /** + * 指定日期的毫秒数 + * + * @param date 指定日期 + * @return 指定日期的毫秒数 + */ + public static long getMillis(Date date) { + return date.getTime(); + } + + /** + * 指定时间戳的毫秒数 + * + * @param ts 指定时间戳 + * @return 指定时间戳的毫秒数 + */ + public static long getMillis(Timestamp ts) { + return ts.getTime(); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatDate + // 将日期按照一定的格式转化为字符串 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 默认方式表示的系统当前日期,具体格式:年-月-日 + * + * @return 默认日期按“年-月-日“格式显示 + */ + public static String formatDate() { + return date_sdf.get().format(getCalendar().getTime()); + } + + /** + * 默认方式表示的系统当前日期,具体格式:yyyy-MM-dd HH:mm:ss + * + * @return 默认日期按“yyyy-MM-dd HH:mm:ss“格式显示 + */ + public static String formatDateTime() { + return datetimeFormat.get().format(getCalendar().getTime()); + } + + /** + * 获取时间字符串 + */ + public static String getDataString(SimpleDateFormat formatstr) { + return formatstr.format(getCalendar().getTime()); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 + * + * @param cal 指定的日期 + * @return 指定日期按“年-月-日“格式显示 + */ + public static String formatDate(Calendar cal) { + return date_sdf.get().format(cal.getTime()); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 + * + * @param date 指定的日期 + * @return 指定日期按“年-月-日“格式显示 + */ + public static String formatDate(Date date) { + return date_sdf.get().format(date); + } + + /** + * 指定毫秒数表示日期的默认显示,具体格式:年-月-日 + * + * @param millis 指定的毫秒数 + * @return 指定毫秒数表示日期按“年-月-日“格式显示 + */ + public static String formatDate(long millis) { + return date_sdf.get().format(new Date(millis)); + } + + /** + * 默认日期按指定格式显示 + * + * @param pattern 指定的格式 + * @return 默认日期按指定格式显示 + */ + public static String formatDate(String pattern) { + return getSDFormat(pattern).format(getCalendar().getTime()); + } + + /** + * 指定日期按指定格式显示 + * + * @param cal 指定的日期 + * @param pattern 指定的格式 + * @return 指定日期按指定格式显示 + */ + public static String formatDate(Calendar cal, String pattern) { + return getSDFormat(pattern).format(cal.getTime()); + } + + /** + * 指定日期按指定格式显示 + * + * @param date 指定的日期 + * @param pattern 指定的格式 + * @return 指定日期按指定格式显示 + */ + public static String formatDate(Date date, String pattern) { + return getSDFormat(pattern).format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatTime + // 将日期按照一定的格式转化为字符串 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 默认方式表示的系统当前日期,具体格式:年-月-日 时:分 + * + * @return 默认日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime() { + return time_sdf.get().format(getCalendar().getTime()); + } + + /** + * 指定毫秒数表示日期的默认显示,具体格式:年-月-日 时:分 + * + * @param millis 指定的毫秒数 + * @return 指定毫秒数表示日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime(long millis) { + return time_sdf.get().format(new Date(millis)); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 时:分 + * + * @param cal 指定的日期 + * @return 指定日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime(Calendar cal) { + return time_sdf.get().format(cal.getTime()); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 时:分 + * + * @param date 指定的日期 + * @return 指定日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime(Date date) { + return time_sdf.get().format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatShortTime + // 将日期按照一定的格式转化为字符串 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 默认方式表示的系统当前日期,具体格式:时:分 + * + * @return 默认日期按“时:分“格式显示 + */ + public static String formatShortTime() { + return short_time_sdf.get().format(getCalendar().getTime()); + } + + /** + * 指定毫秒数表示日期的默认显示,具体格式:时:分 + * + * @param millis 指定的毫秒数 + * @return 指定毫秒数表示日期按“时:分“格式显示 + */ + public static String formatShortTime(long millis) { + return short_time_sdf.get().format(new Date(millis)); + } + + /** + * 指定日期的默认显示,具体格式:时:分 + * + * @param cal 指定的日期 + * @return 指定日期按“时:分“格式显示 + */ + public static String formatShortTime(Calendar cal) { + return short_time_sdf.get().format(cal.getTime()); + } + + /** + * 指定日期的默认显示,具体格式:时:分 + * + * @param date 指定的日期 + * @return 指定日期按“时:分“格式显示 + */ + public static String formatShortTime(Date date) { + return short_time_sdf.get().format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // parseDate + // parseCalendar + // parseTimestamp + // 将字符串按照一定的格式转化为日期或时间 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间 + * + * @param src 将要转换的原始字符窜 + * @param pattern 转换的匹配格式 + * @return 如果转换成功则返回转换后的日期 + * @throws ParseException + */ + public static Date parseDate(String src, String pattern) throws ParseException { + return getSDFormat(pattern).parse(src); + + } + + /** + * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间 + * + * @param src 将要转换的原始字符窜 + * @param pattern 转换的匹配格式 + * @return 如果转换成功则返回转换后的日期 + * @throws ParseException + */ + public static Calendar parseCalendar(String src, String pattern) throws ParseException { + + Date date = parseDate(src, pattern); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal; + } + + public static String formatAddDate(String src, String pattern, int amount) throws ParseException { + Calendar cal; + cal = parseCalendar(src, pattern); + cal.add(Calendar.DATE, amount); + return formatDate(cal); + } + + /** + * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间 + * + * @param src 将要转换的原始字符窜 + * @param pattern 转换的匹配格式 + * @return 如果转换成功则返回转换后的时间戳 + * @throws ParseException + */ + public static Timestamp parseTimestamp(String src, String pattern) throws ParseException { + Date date = parseDate(src, pattern); + return new Timestamp(date.getTime()); + } + + // //////////////////////////////////////////////////////////////////////////// + // dateDiff + // 计算两个日期之间的差值 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 计算两个时间之间的差值,根据标志的不同而不同 + * + * @param flag 计算标志,表示按照年/月/日/时/分/秒等计算 + * @param calSrc 减数 + * @param calDes 被减数 + * @return 两个日期之间的差值 + */ + public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) { + + long millisDiff = getMillis(calSrc) - getMillis(calDes); + + if (flag == 'y') { + return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR)); + } + + if (flag == 'd') { + return (int) (millisDiff / DAY_IN_MILLIS); + } + + if (flag == 'h') { + return (int) (millisDiff / HOUR_IN_MILLIS); + } + + if (flag == 'm') { + return (int) (millisDiff / MINUTE_IN_MILLIS); + } + + if (flag == 's') { + return (int) (millisDiff / SECOND_IN_MILLIS); + } + + return 0; + } + + /** + * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd + * HH:mm:ss“ * @param text String类型的时间值 + */ + @Override + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.hasText(text)) { + try { + if (text.indexOf(":") == -1 && text.length() == 10) { + setValue(DateUtils.date_sdf.get().parse(text)); + } else if (text.indexOf(":") > 0 && text.length() == 19) { + setValue(DateUtils.datetimeFormat.get().parse(text)); + } else { + throw new IllegalArgumentException("Could not parse date, date format is error "); + } + } catch (ParseException ex) { + IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage()); + iae.initCause(ex); + throw iae; + } + } else { + setValue(null); + } + } + + public static int getYear() { + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(getDate()); + return calendar.get(Calendar.YEAR); + } + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsEnum.java new file mode 100644 index 00000000..7034ea2d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsEnum.java @@ -0,0 +1,70 @@ +package com.jero.common.util; + +import org.apache.commons.lang3.StringUtils; + +public enum DySmsEnum { + + LOGIN_TEMPLATE_CODE("SMS_175435174","JERO","code"), + FORGET_PASSWORD_TEMPLATE_CODE("SMS_175435174","JERO","code"), + REGISTER_TEMPLATE_CODE("SMS_175430166","JERO","code"), + /**会议通知*/ + MEET_NOTICE_TEMPLATE_CODE("SMS_201480469","H5活动之家","username,title,minute,time"), + /**我的计划通知*/ + PLAN_NOTICE_TEMPLATE_CODE("SMS_201470515","H5活动之家","username,title,time"); + + /** + * 短信模板编码 + */ + private String templateCode; + /** + * 签名 + */ + private String signName; + /** + * 短信模板必需的数据名称,多个key以逗号分隔,此处配置作为校验 + */ + private String keys; + + private DySmsEnum(String templateCode,String signName,String keys) { + this.templateCode = templateCode; + this.signName = signName; + this.keys = keys; + } + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + public String getSignName() { + return signName; + } + + public void setSignName(String signName) { + this.signName = signName; + } + + public String getKeys() { + return keys; + } + + public void setKeys(String keys) { + this.keys = keys; + } + + public static DySmsEnum toEnum(String templateCode) { + if(StringUtils.isEmpty(templateCode)){ + return null; + } + for(DySmsEnum item : DySmsEnum.values()) { + if(item.getTemplateCode().equals(templateCode)) { + return item; + } + } + return null; + } +} + diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsHelper.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsHelper.java new file mode 100644 index 00000000..69e4c15e --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/DySmsHelper.java @@ -0,0 +1,122 @@ +package com.jero.common.util; + +import com.jero.config.StaticConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; + +/** + * Created on 17/6/7. + * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过 + * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可) + * 工程依赖了2个jar包(存放在工程的libs目录下) + * 1:aliyun-java-sdk-core.jar + * 2:aliyun-java-sdk-dysmsapi.jar + * + * 备注:Demo工程编码采用UTF-8 + * 国际短信发送请勿参照此DEMO + */ +public class DySmsHelper { + + private final static Logger logger=LoggerFactory.getLogger(DySmsHelper.class); + + //产品名称:云通信短信API产品,开发者无需替换 + static final String product = "Dysmsapi"; + //产品域名,开发者无需替换 + static final String domain = "dysmsapi.aliyuncs.com"; + + // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) + static String accessKeyId; + static String accessKeySecret; + + public static void setAccessKeyId(String accessKeyId) { + DySmsHelper.accessKeyId = accessKeyId; + } + + public static void setAccessKeySecret(String accessKeySecret) { + DySmsHelper.accessKeySecret = accessKeySecret; + } + + public static String getAccessKeyId() { + return accessKeyId; + } + + public static String getAccessKeySecret() { + return accessKeySecret; + } + + + public static boolean sendSms(String phone,JSONObject templateParamJson,DySmsEnum dySmsEnum) throws ClientException { + //可自助调整超时时间 + System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); + System.setProperty("sun.net.client.defaultReadTimeout", "10000"); + + //update-begin-author:taoyan date:20200811 for:配置类数据获取 + StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); + setAccessKeyId(staticConfig.getAccessKeyId()); + setAccessKeySecret(staticConfig.getAccessKeySecret()); + //update-end-author:taoyan date:20200811 for:配置类数据获取 + + //初始化acsClient,暂不支持region化 + IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); + DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); + IAcsClient acsClient = new DefaultAcsClient(profile); + + //验证json参数 + validateParam(templateParamJson,dySmsEnum); + + //组装请求对象-具体描述见控制台-文档部分内容 + SendSmsRequest request = new SendSmsRequest(); + //必填:待发送手机号 + request.setPhoneNumbers(phone); + //必填:短信签名-可在短信控制台中找到 + request.setSignName(dySmsEnum.getSignName()); + //必填:短信模板-可在短信控制台中找到 + request.setTemplateCode(dySmsEnum.getTemplateCode()); + //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 + request.setTemplateParam(templateParamJson.toJSONString()); + + //选填-上行短信扩展码(无特殊需求用户请忽略此字段) + //request.setSmsUpExtendCode("90997"); + + //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 + //request.setOutId("yourOutId"); + + boolean result = false; + + //hint 此处可能会抛出异常,注意catch + SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); + logger.info("短信接口返回的数据----------------"); + logger.info("{Code:" + sendSmsResponse.getCode()+",Message:" + sendSmsResponse.getMessage()+",RequestId:"+ sendSmsResponse.getRequestId()+",BizId:"+sendSmsResponse.getBizId()+"}"); + if ("OK".equals(sendSmsResponse.getCode())) { + result = true; + } + return result; + + } + + private static void validateParam(JSONObject templateParamJson,DySmsEnum dySmsEnum) { + String keys = dySmsEnum.getKeys(); + String [] keyArr = keys.split(","); + for(String item :keyArr) { + if(!templateParamJson.containsKey(item)) { + throw new RuntimeException("模板缺少参数:"+item); + } + } + } + + +// public static void main(String[] args) throws ClientException, InterruptedException { +// JSONObject obj = new JSONObject(); +// obj.put("code", "1234"); +// sendSms("13800138000", obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); +// } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/FillRuleUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/FillRuleUtil.java new file mode 100644 index 00000000..c95e185c --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/FillRuleUtil.java @@ -0,0 +1,57 @@ +package com.jero.common.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import com.jero.common.handler.IFillRuleHandler; + + +/** + * 规则值自动生成工具类 + * + * @author qinfeng + * @举例: 自动生成订单号;自动生成当前日期 + */ +@Slf4j +public class FillRuleUtil { + + /** + * @param ruleCode ruleCode + * @return + */ + @SuppressWarnings("unchecked") + public static Object executeRule(String ruleCode, JSONObject formData) { + if (!StringUtils.isEmpty(ruleCode)) { + try { + // 获取 Service + ServiceImpl impl = (ServiceImpl) SpringContextUtils.getBean("sysFillRuleServiceImpl"); + // 根据 ruleCode 查询出实体 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("rule_code", ruleCode); + JSONObject entity = JSON.parseObject(JSON.toJSONString(impl.getOne(queryWrapper))); + if (entity == null) { + log.warn("填值规则:" + ruleCode + " 不存在"); + return null; + } + // 获取必要的参数 + String ruleClass = entity.getString("ruleClass"); + JSONObject params = entity.getJSONObject("ruleParams"); + if (params == null) { + params = new JSONObject(); + } + if (formData == null) { + formData = new JSONObject(); + } + // 通过反射执行配置的类里的方法 + IFillRuleHandler ruleHandler = (IFillRuleHandler) Class.forName(ruleClass).newInstance(); + return ruleHandler.execute(params, formData); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HTMLUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HTMLUtils.java new file mode 100644 index 00000000..0f8fd30a --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HTMLUtils.java @@ -0,0 +1,29 @@ +package com.jero.common.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.util.HtmlUtils; + +/** + * HTML 工具类 + */ +public class HTMLUtils { + + /** + * 获取HTML内的文本,不包含标签 + * + * @param html HTML 代码 + */ + public static String getInnerText(String html) { + if (StringUtils.isNotBlank(html)) { + //去掉 html 的标签 + String content = html.replaceAll("]+>", ""); + // 将多个空格合并成一个空格 + content = content.replaceAll("( )+", " "); + // 反向转义字符 + content = HtmlUtils.htmlUnescape(content); + return content.trim(); + } + return ""; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/IPUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/IPUtils.java new file mode 100644 index 00000000..fcca7bcf --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/IPUtils.java @@ -0,0 +1,58 @@ +package com.jero.common.util; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * IP地址 + * + * @Author scott + * @email test@163.com + * @Date 2019年01月14日 + */ +public class IPUtils { + private static Logger logger = LoggerFactory.getLogger(IPUtils.class); + + /** + * 获取IP地址 + * + * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 + * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + String ip = null; + try { + ip = request.getHeader("x-forwarded-for"); + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + } catch (Exception e) { + logger.error("IPUtils ERROR ", e); + } + +// //使用代理,则获取第一个IP地址 +// if(StringUtils.isEmpty(ip) && ip.length() > 15) { +// if(ip.indexOf(",") > 0) { +// ip = ip.substring(0, ip.indexOf(",")); +// } +// } + + return ip; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ImportExcelUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ImportExcelUtil.java new file mode 100644 index 00000000..8a09ad20 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ImportExcelUtil.java @@ -0,0 +1,96 @@ +package com.jero.common.util; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * 导出返回信息 + */ +@Slf4j +public class ImportExcelUtil { + + public static Result imporReturnRes(int errorLines,int successLines,List errorMessage) throws IOException { + if (errorLines == 0) { + return Result.OK("共" + successLines + "行数据全部导入成功!"); + } else { + JSONObject result = new JSONObject(5); + int totalCount = successLines + errorLines; + result.put("totalCount", totalCount); + result.put("errorCount", errorLines); + result.put("successCount", successLines); + result.put("msg", "总上传行数:" + totalCount + ",已导入行数:" + successLines + ",错误行数:" + errorLines); + String fileUrl = PmsUtil.saveErrorTxtByList(errorMessage, "userImportExcelErrorLog"); + int lastIndex = fileUrl.lastIndexOf(File.separator); + String fileName = fileUrl.substring(lastIndex + 1); + result.put("fileUrl", "/sys/common/static/" + fileUrl); + result.put("fileName", fileName); + Result res = Result.OK(result); + res.setCode(201); + res.setMessage("文件导入成功,但有错误。"); + return res; + } + } + + public static List importDateSave(List list, Class serviceClass,List errorMessage,String errorFlag) { + IService bean =(IService) SpringContextUtils.getBean(serviceClass); + for (int i = 0; i < list.size(); i++) { + try { + boolean save = bean.save(list.get(i)); + if(!save){ + throw new Exception(errorFlag); + } + } catch (Exception e) { + String message = e.getMessage().toLowerCase(); + int lineNumber = i + 1; + // 通过索引名判断出错信息 + if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_ROLE_CODE)) { + errorMessage.add("第 " + lineNumber + " 行:角色编码已经存在,忽略导入。"); + } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_JOB_CLASS_NAME)) { + errorMessage.add("第 " + lineNumber + " 行:任务类名已经存在,忽略导入。"); + }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_CODE)) { + errorMessage.add("第 " + lineNumber + " 行:职务编码已经存在,忽略导入。"); + }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE)) { + errorMessage.add("第 " + lineNumber + " 行:部门编码已经存在,忽略导入。"); + }else { + errorMessage.add("第 " + lineNumber + " 行:未知错误,忽略导入"); + log.error(e.getMessage(), e); + } + } + } + return errorMessage; + } + + public static List importDateSaveOne(Object obj, Class serviceClass,List errorMessage,int i,String errorFlag) { + IService bean =(IService) SpringContextUtils.getBean(serviceClass); + try { + boolean save = bean.save(obj); + if(!save){ + throw new Exception(errorFlag); + } + } catch (Exception e) { + String message = e.getMessage().toLowerCase(); + int lineNumber = i + 1; + // 通过索引名判断出错信息 + if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_ROLE_CODE)) { + errorMessage.add("第 " + lineNumber + " 行:角色编码已经存在,忽略导入。"); + } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_JOB_CLASS_NAME)) { + errorMessage.add("第 " + lineNumber + " 行:任务类名已经存在,忽略导入。"); + }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_CODE)) { + errorMessage.add("第 " + lineNumber + " 行:职务编码已经存在,忽略导入。"); + }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE)) { + errorMessage.add("第 " + lineNumber + " 行:部门编码已经存在,忽略导入。"); + }else { + errorMessage.add("第 " + lineNumber + " 行:未知错误,忽略导入"); + log.error(e.getMessage(), e); + } + } + return errorMessage; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MD5Util.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MD5Util.java new file mode 100644 index 00000000..4b737e09 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MD5Util.java @@ -0,0 +1,43 @@ +package com.jero.common.util; + +import java.security.MessageDigest; + +public class MD5Util { + + public static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++){ + resultSb.append(byteToHexString(b[i])); + } + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) { + n += 256; + } + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + + public static String MD5Encode(String origin, String charsetname) { + String resultString = null; + try { + resultString = new String(origin); + MessageDigest md = MessageDigest.getInstance("MD5"); + if (charsetname == null || "".equals(charsetname)) { + resultString = byteArrayToHexString(md.digest(resultString.getBytes())); + } else { + resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname))); + } + } catch (Exception exception) { + } + return resultString; + } + + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MinioUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MinioUtil.java new file mode 100644 index 00000000..1385c1ce --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MinioUtil.java @@ -0,0 +1,210 @@ +package com.jero.common.util; + +import io.minio.*; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.util.filter.StrAttackFilter; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.Null; +import java.io.InputStream; +import java.net.URLDecoder; + +/** + * minio文件上传工具类 + */ +@Slf4j +public class MinioUtil { + private static String minioUrl; + private static String minioName; + private static String minioPass; + private static String bucketName; + + public static void setMinioUrl(String minioUrl) { + MinioUtil.minioUrl = minioUrl; + } + + public static void setMinioName(String minioName) { + MinioUtil.minioName = minioName; + } + + public static void setMinioPass(String minioPass) { + MinioUtil.minioPass = minioPass; + } + + public static void setBucketName(String bucketName) { + MinioUtil.bucketName = bucketName; + } + + public static String getMinioUrl() { + return minioUrl; + } + + public static String getBucketName() { + return bucketName; + } + + private static MinioClient minioClient = null; + + /** + * 上传文件 + * @param file + * @return + */ + public static String upload(MultipartFile file, String bizPath, String customBucket) { + String file_url = ""; + //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + bizPath=StrAttackFilter.filter(bizPath); + //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + String newBucket = bucketName; + if(oConvertUtils.isNotEmpty(customBucket)){ + newBucket = customBucket; + } + try { + initMinio(minioUrl, minioName,minioPass); + // 检查存储桶是否已经存在 + if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) { + log.info("Bucket already exists."); + } else { + // 创建一个名为ota的存储桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build()); + log.info("create a new bucket."); + } + InputStream stream = file.getInputStream(); + // 获取文件名 + String orgName = file.getOriginalFilename(); + if("".equals(orgName)){ + orgName=file.getName(); + } + orgName = CommonUtils.getFileName(orgName); + String objectName = bizPath+"/"+orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(".")); + + // 使用putObject上传一个本地文件到存储桶中。 + if(objectName.startsWith("/")){ + objectName = objectName.substring(1); + } + PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName) + .bucket(newBucket) + .contentType("application/octet-stream") + .stream(stream,stream.available(),-1).build(); + minioClient.putObject(objectArgs); + stream.close(); + file_url = minioUrl+newBucket+"/"+objectName; + }catch (Exception e){ + log.error(e.getMessage(), e); + } + return file_url; + } + + /** + * 文件上传 + * @param file + * @param bizPath + * @return + */ + public static String upload(MultipartFile file, String bizPath) { + return upload(file,bizPath,null); + } + + /** + * 获取文件流 + * @param bucketName + * @param objectName + * @return + */ + public static InputStream getMinioFile(String bucketName, String objectName){ + InputStream inputStream = null; + try { + initMinio(minioUrl, minioName, minioPass); + GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName) + .bucket(bucketName).build(); + inputStream = minioClient.getObject(objectArgs); + } catch (Exception e) { + log.info("文件获取失败" + e.getMessage()); + } + return inputStream; + } + + /** + * 删除文件 + * @param bucketName + * @param objectName + * @throws Exception + */ + public static void removeObject(String bucketName, String objectName) { + try { + initMinio(minioUrl, minioName,minioPass); + RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName) + .bucket(bucketName).build(); + minioClient.removeObject(objectArgs); + }catch (Exception e){ + log.info("文件删除失败" + e.getMessage()); + } + } + + /** + * 获取文件外链 + * @param bucketName + * @param objectName + * @param expires + * @return + */ + public static String getObjectURL(String bucketName, String objectName, Integer expires) { + initMinio(minioUrl, minioName,minioPass); + try{ + GetPresignedObjectUrlArgs objectArgs = GetPresignedObjectUrlArgs.builder().object(objectName) + .bucket(bucketName) + .expiry(expires).build(); + String url = minioClient.getPresignedObjectUrl(objectArgs); + return URLDecoder.decode(url,"UTF-8"); + }catch (Exception e){ + log.info("文件路径获取失败" + e.getMessage()); + } + return null; + } + + /** + * 初始化客户端 + * @param minioUrl + * @param minioName + * @param minioPass + * @return + */ + private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) { + if (minioClient == null) { + try { + minioClient = MinioClient.builder() + .endpoint(minioUrl) + .credentials(minioName, minioPass) + .build(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return minioClient; + } + + /** + * 上传文件到minio + * @param stream + * @param relativePath + * @return + */ + public static String upload(InputStream stream,String relativePath) throws Exception { + initMinio(minioUrl, minioName,minioPass); + if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { + log.info("Bucket already exists."); + } else { + // 创建一个名为ota的存储桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + log.info("create a new bucket."); + } + PutObjectArgs objectArgs = PutObjectArgs.builder().object(relativePath) + .bucket(bucketName) + .contentType("application/octet-stream") + .stream(stream,stream.available(),-1).build(); + minioClient.putObject(objectArgs); + stream.close(); + return minioUrl+bucketName+"/"+relativePath; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MyClassLoader.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MyClassLoader.java new file mode 100644 index 00000000..5ef9dc6f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/MyClassLoader.java @@ -0,0 +1,92 @@ +package com.jero.common.util; + +/** + * @Author 张代浩 + */ +public class MyClassLoader extends ClassLoader { + public static Class getClassByScn(String className) { + Class myclass = null; + try { + myclass = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException(className+" not found!"); + } + return myclass; + } + + // 获得类的全名,包括包名 + public static String getPackPath(Object object) { + // 检查用户传入的参数是否为空 + if (object == null) { + throw new java.lang.IllegalArgumentException("参数不能为空!"); + } + // 获得类的全名,包括包名 + String clsName = object.getClass().getName(); + return clsName; + } + + public static String getAppPath(Class cls) { + // 检查用户传入的参数是否为空 + if (cls == null) { + throw new java.lang.IllegalArgumentException("参数不能为空!"); + } + ClassLoader loader = cls.getClassLoader(); + // 获得类的全名,包括包名 + String clsName = cls.getName() + ".class"; + // 获得传入参数所在的包 + Package pack = cls.getPackage(); + String path = ""; + // 如果不是匿名包,将包名转化为路径 + if (pack != null) { + String packName = pack.getName(); + // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 + if (packName.startsWith("java.") || packName.startsWith("javax.")) { + throw new java.lang.IllegalArgumentException("不要传送系统类!"); + } + // 在类的名称中,去掉包名的部分,获得类的文件名 + clsName = clsName.substring(packName.length() + 1); + // 判定包名是否是简单包名,如果是,则直接将包名转换为路径, + if (packName.indexOf(".") < 0) { + path = packName + "/"; + } else {// 否则按照包名的组成部分,将包名转换为路径 + int start = 0, end = 0; + end = packName.indexOf("."); + while (end != -1) { + path = path + packName.substring(start, end) + "/"; + start = end + 1; + end = packName.indexOf(".", start); + } + path = path + packName.substring(start) + "/"; + } + } + // 调用ClassLoader的getResource方法,传入包含路径信息的类文件名 + java.net.URL url = loader.getResource(path + clsName); + // 从URL对象中获取路径信息 + String realPath = url.getPath(); + // 去掉路径信息中的协议名"file:" + int pos = realPath.indexOf("file:"); + if (pos > -1) { + realPath = realPath.substring(pos + 5); + } + // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径 + pos = realPath.indexOf(path + clsName); + realPath = realPath.substring(0, pos - 1); + // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 + if (realPath.endsWith("!")) { + realPath = realPath.substring(0, realPath.lastIndexOf("/")); + } + /*------------------------------------------------------------ + ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 + 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 + 的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 + 中文及空格路径 + -------------------------------------------------------------*/ + try { + realPath = java.net.URLDecoder.decode(realPath, "utf-8"); + } catch (Exception e) { + throw new RuntimeException(e); + } + return realPath; + }// getAppPath定义结束 +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PasswordUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PasswordUtil.java new file mode 100644 index 00000000..8ec5982f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PasswordUtil.java @@ -0,0 +1,210 @@ +package com.jero.common.util; + +import java.security.Key; +import java.security.SecureRandom; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; +public class PasswordUtil { + + /** + * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES + * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1 + * */ + + /** + * 定义使用的算法为:PBEWITHMD5andDES算法 + */ + public static final String ALGORITHM = "PBEWithMD5AndDES"; + /** + * 自定义密钥 + */ + public static final String Salt = "63293188"; + + + /** + * 定义迭代次数为1000次 + */ + private static final int ITERATIONCOUNT = 1000; + + /** + * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节 + * + * @return byte[] 盐值 + * */ + public static byte[] getSalt() throws Exception { + // 实例化安全随机数 + SecureRandom random = new SecureRandom(); + // 产出盐 + return random.generateSeed(8); + } + + public static byte[] getStaticSalt() { + // 产出盐 + return Salt.getBytes(); + } + + /** + * 根据PBE密码生成一把密钥 + * + * @param password + * 生成密钥时所使用的密码 + * @return Key PBE算法密钥 + * */ + private static Key getPBEKey(String password) { + // 实例化使用的算法 + SecretKeyFactory keyFactory; + SecretKey secretKey = null; + try { + keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + // 设置PBE密钥参数 + PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); + // 生成密钥 + secretKey = keyFactory.generateSecret(keySpec); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return secretKey; + } + + /** + * 加密明文字符串 + * + * @param plaintext + * 待加密的明文字符串 + * @param password + * 生成密钥时所使用的密码 + * @param salt + * 盐值 + * @return 加密后的密文字符串 + * @throws Exception + */ + public static String encrypt(String plaintext, String password, String salt) { + + Key key = getPBEKey(password); + byte[] encipheredData = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); + //update-begin-author:sccott date:20180815 for:中文作为用户名时,加密的密码windows和linux会得到不同的结果 gitee/issues/IZUD7 + encipheredData = cipher.doFinal(plaintext.getBytes("utf-8")); + //update-end-author:sccott date:20180815 for:中文作为用户名时,加密的密码windows和linux会得到不同的结果 gitee/issues/IZUD7 + } catch (Exception e) { + } + return bytesToHexString(encipheredData); + } + + /** + * 自定义加密明文字符串 + * + * @param plaintext + * 待加密的明文字符串 + * @return 加密后的密文字符串 + * @throws Exception + */ + public static String encrypt(String plaintext) { + + return encrypt(plaintext, ALGORITHM, Salt); + } + + /** + * 解密密文字符串 + * + * @param ciphertext + * 待解密的密文字符串 + * @param password + * 生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致) + * @param salt + * 盐值(如需解密,该参数需要与加密时使用的一致) + * @return 解密后的明文字符串 + * @throws Exception + */ + public static String decrypt(String ciphertext, String password, String salt) { + + Key key = getPBEKey(password); + byte[] passDec = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); + + passDec = cipher.doFinal(hexStringToBytes(ciphertext)); + } + + catch (Exception e) { + // TODO: handle exception + } + return new String(passDec); + } + + /** + * 自定义解密密文字符串 + * + * @param ciphertext + * 待解密的密文字符串 + * @return 解密后的明文字符串 + * @throws Exception + */ + public static String decrypt(String ciphertext) { + + return decrypt(ciphertext, ALGORITHM, Salt); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param src + * 字节数组 + * @return + */ + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 将十六进制字符串转换为字节数组 + * + * @param hexString + * 十六进制字符串 + * @return + */ + public static byte[] hexStringToBytes(String hexString) { + if (hexString == null || hexString.equals("")) { + return null; + } + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + + private static byte charToByte(char c) { + return (byte) "0123456789ABCDEF".indexOf(c); + } + + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PmsUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PmsUtil.java new file mode 100644 index 00000000..901e766c --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/PmsUtil.java @@ -0,0 +1,61 @@ +package com.jero.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.util.Date; +import java.util.List; + +@Slf4j +@Component +public class PmsUtil { + + + private static String uploadPath; + + @Value("${jero.path.upload}") + public void setUploadPath(String uploadPath) { + PmsUtil.uploadPath = uploadPath; + } + + public static String saveErrorTxtByList(List msg, String name) { + Date d = new Date(); + String saveDir = "logs" + File.separator + DateUtils.yyyyMMdd.get().format(d) + File.separator; + String saveFullDir = uploadPath + File.separator + saveDir; + + File saveFile = new File(saveFullDir); + if (!saveFile.exists()) { + saveFile.mkdirs(); + } + name += DateUtils.yyyymmddhhmmss.get().format(d) + Math.round(Math.random() * 10000); + String saveFilePath = saveFullDir + name + ".txt"; + + try { + //封装目的地 + BufferedWriter bw = new BufferedWriter(new FileWriter(saveFilePath)); + //遍历集合 + for (String s : msg) { + //写数据 + if (s.indexOf("_") > 0) { + String arr[] = s.split("_"); + bw.write("第" + arr[0] + "行:" + arr[1]); + } else { + bw.write(s); + } + //bw.newLine(); + bw.write("\r\n"); + } + //释放资源 + bw.flush(); + bw.close(); + } catch (Exception e) { + log.info("excel导入生成错误日志文件异常:" + e.getMessage()); + } + return saveDir + name + ".txt"; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RedisUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RedisUtil.java new file mode 100644 index 00000000..0522c087 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RedisUtil.java @@ -0,0 +1,615 @@ +package com.jero.common.util; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import com.jero.common.exception.JeroBootException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.*; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +/** + * redis 工具类 + * @Author Scott + * + */ +@Component +public class RedisUtil { + + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private StringRedisTemplate stringRedisTemplate; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + // ============================String============================= + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 递增 + * + * @param key 键 + * @param by 要增加几(大于0) + * @return + */ + public long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + * + * @param key 键 + * @param by 要减少几(小于0) + * @return + */ + public long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } + + // ================================Map================================= + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + try { + Long remove = redisTemplate.opsForList().remove(key, count, value); + return remove; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取指定前缀的一系列key + * 使用scan命令代替keys, Redis是单线程处理,keys命令在KEY数量较多时, + * 操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求 + * @param keyPrefix + * @return + */ + private Set keys(String keyPrefix) { + String realKey = keyPrefix + "*"; + + try { + return redisTemplate.execute((RedisCallback>) connection -> { + Set binaryKeys = new HashSet<>(); + Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build()); + while (cursor.hasNext()) { + binaryKeys.add(new String(cursor.next())); + } + + return binaryKeys; + }); + } catch (Throwable e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 删除指定前缀的一系列key + * @param keyPrefix + */ + public void removeAll(String keyPrefix) { + try { + Set keys = keys(keyPrefix); + redisTemplate.delete(keys); + } catch (Throwable e) { + e.printStackTrace(); + } + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ReflectHelper.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ReflectHelper.java new file mode 100644 index 00000000..0a9d5fe9 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ReflectHelper.java @@ -0,0 +1,238 @@ +package com.jero.common.util; + +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.*; +import java.util.Map.Entry; +import java.util.regex.Pattern; + +/** + * @author 张代浩 + * @desc 通过反射来动态调用get 和 set 方法 + */ +@Slf4j +public class ReflectHelper { + + private Class cls; + + /** + * 传过来的对象 + */ + private Object obj; + + /** + * 存放get方法 + */ + private Hashtable getMethods = null; + /** + * 存放set方法 + */ + private Hashtable setMethods = null; + + /** + * 定义构造方法 -- 一般来说是个pojo + * + * @param o 目标对象 + */ + public ReflectHelper(Object o) { + obj = o; + initMethods(); + } + + /** + * @desc 初始化 + */ + public void initMethods() { + getMethods = new Hashtable(); + setMethods = new Hashtable(); + cls = obj.getClass(); + Method[] methods = cls.getMethods(); + // 定义正则表达式,从方法中过滤出getter / setter 函数. + String gs = "get(\\w+)"; + Pattern getM = Pattern.compile(gs); + String ss = "set(\\w+)"; + Pattern setM = Pattern.compile(ss); + // 把方法中的"set" 或者 "get" 去掉 + String rapl = "$1"; + String param; + for (int i = 0; i < methods.length; ++i) { + Method m = methods[i]; + String methodName = m.getName(); + if (Pattern.matches(gs, methodName)) { + param = getM.matcher(methodName).replaceAll(rapl).toLowerCase(); + getMethods.put(param, m); + } else if (Pattern.matches(ss, methodName)) { + param = setM.matcher(methodName).replaceAll(rapl).toLowerCase(); + setMethods.put(param, m); + } else { + // logger.info(methodName + " 不是getter,setter方法!"); + } + } + } + + /** + * @desc 调用set方法 + */ + public boolean setMethodValue(String property, Object object) { + Method m = setMethods.get(property.toLowerCase()); + if (m != null) { + try { + // 调用目标类的setter函数 + m.invoke(obj, object); + return true; + } catch (Exception ex) { + log.info("invoke getter on " + property + " error: " + ex.toString()); + return false; + } + } + return false; + } + + /** + * @desc 调用set方法 + */ + public Object getMethodValue(String property) { + Object value = null; + Method m = getMethods.get(property.toLowerCase()); + if (m != null) { + try { + /* + * 调用obj类的setter函数 + */ + value = m.invoke(obj, new Object[]{}); + + } catch (Exception ex) { + log.info("invoke getter on " + property + " error: " + ex.toString()); + } + } + return value; + } + + /** + * 把map中的内容全部注入到obj中 + * + * @param data + * @return + */ + public Object setAll(Map data) { + if (data == null || data.keySet().size() <= 0) { + return null; + } + for (Entry entry : data.entrySet()) { + this.setMethodValue(entry.getKey(), entry.getValue()); + } + return obj; + } + + /** + * 把map中的内容全部注入到obj中 + * + * @param o + * @param data + * @return + */ + public static Object setAll(Object o, Map data) { + ReflectHelper reflectHelper = new ReflectHelper(o); + reflectHelper.setAll(data); + return o; + } + + /** + * 把map中的内容全部注入到新实例中 + * + * @param clazz + * @param data + * @return + */ + @SuppressWarnings("unchecked") + public static T setAll(Class clazz, Map data) { + T o = null; + try { + o = clazz.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + o = null; + return o; + } + return (T) setAll(o, data); + } + + /** + * 根据传入的class将mapList转换为实体类list + * + * @param mapist + * @param clazz + * @return + */ + public static List transList2Entrys(List> mapist, Class clazz) { + List list = new ArrayList(); + if (mapist != null && mapist.size() > 0) { + for (Map data : mapist) { + list.add(ReflectHelper.setAll(clazz, data)); + } + } + return list; + } + + /** + * 根据属性名获取属性值 + */ + public static Object getFieldValueByName(String fieldName, Object o) { + try { + String firstLetter = fieldName.substring(0, 1).toUpperCase(); + String getter = "get" + firstLetter + fieldName.substring(1); + Method method = o.getClass().getMethod(getter, new Class[]{}); + Object value = method.invoke(o, new Object[]{}); + return value; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取属性名数组 + */ + public static String[] getFiledName(Object o) { + Field[] fields = o.getClass().getDeclaredFields(); + String[] fieldNames = new String[fields.length]; + for (int i = 0; i < fields.length; i++) { + //log.info(fields[i].getType()); + fieldNames[i] = fields[i].getName(); + } + return fieldNames; + } + + /** + * 获取属性类型(type),属性名(name),属性值(value)的map组成的list + */ + public static List getFiledsInfo(Object o) { + Field[] fields = o.getClass().getDeclaredFields(); + String[] fieldNames = new String[fields.length]; + List list = new ArrayList(); + Map infoMap = null; + for (int i = 0; i < fields.length; i++) { + infoMap = new HashMap(); + infoMap.put("type", fields[i].getType().toString()); + infoMap.put("name", fields[i].getName()); + infoMap.put("value", getFieldValueByName(fields[i].getName(), o)); + list.add(infoMap); + } + return list; + } + + /** + * 获取对象的所有属性值,返回一个对象数组 + */ + public static Object[] getFiledValues(Object o) { + String[] fieldNames = getFiledName(o); + Object[] value = new Object[fieldNames.length]; + for (int i = 0; i < fieldNames.length; i++) { + value[i] = getFieldValueByName(fieldNames[i], o); + } + return value; + } + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestDesformUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestDesformUtil.java new file mode 100644 index 00000000..fa573b45 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestDesformUtil.java @@ -0,0 +1,121 @@ +package com.jero.common.util; + +import com.alibaba.fastjson.JSONObject; +import com.jero.common.api.vo.Result; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; + +/** + * 通过 RESTful 风格的接口操纵 desform 里的数据 + * + * @author sunjianlei + */ +public class RestDesformUtil { + + private static String domain = null; + private static String path = null; + + static { + domain = SpringContextUtils.getDomain(); + path = oConvertUtils.getString(SpringContextUtils.getApplicationContext().getEnvironment().getProperty("server.servlet.context-path")); + } + + /** + * 查询数据 + * + * @param desformCode + * @param dataId + * @param token + * @return + */ + public static Result queryOne(String desformCode, String dataId, String token) { + String url = getBaseUrl(desformCode, dataId).toString(); + HttpHeaders headers = getHeaders(token); + ResponseEntity result = RestUtil.request(url, HttpMethod.GET, headers, null, null, JSONObject.class); + return packageReturn(result); + } + + /** + * 新增数据 + * + * @param desformCode + * @param formData + * @param token + * @return + */ + public static Result addOne(String desformCode, JSONObject formData, String token) { + return addOrEditOne(desformCode, formData, token, HttpMethod.POST); + } + + /** + * 修改数据 + * + * @param desformCode + * @param formData + * @param token + * @return + */ + public static Result editOne(String desformCode, JSONObject formData, String token) { + return addOrEditOne(desformCode, formData, token, HttpMethod.PUT); + } + + private static Result addOrEditOne(String desformCode, JSONObject formData, String token, HttpMethod method) { + String url = getBaseUrl(desformCode).toString(); + HttpHeaders headers = getHeaders(token); + ResponseEntity result = RestUtil.request(url, method, headers, null, formData, JSONObject.class); + return packageReturn(result); + } + + /** + * 删除数据 + * + * @param desformCode + * @param dataId + * @param token + * @return + */ + public static Result removeOne(String desformCode, String dataId, String token) { + String url = getBaseUrl(desformCode, dataId).toString(); + HttpHeaders headers = getHeaders(token); + ResponseEntity result = RestUtil.request(url, HttpMethod.DELETE, headers, null, null, JSONObject.class); + return packageReturn(result); + } + + private static Result packageReturn(ResponseEntity result) { + if (result.getBody() != null) { + return result.getBody().toJavaObject(Result.class); + } + return Result.error("操作失败"); + } + + private static StringBuilder getBaseUrl() { + StringBuilder builder = new StringBuilder(domain).append(path); + builder.append("/desform/api"); + return builder; + } + + private static StringBuilder getBaseUrl(String desformCode, String dataId) { + StringBuilder builder = getBaseUrl(); + builder.append("/").append(desformCode); + if (dataId != null) { + builder.append("/").append(dataId); + } + return builder; + } + + private static StringBuilder getBaseUrl(String desformCode) { + return getBaseUrl(desformCode, null); + } + + private static HttpHeaders getHeaders(String token) { + HttpHeaders headers = new HttpHeaders(); + String mediaType = MediaType.APPLICATION_JSON_UTF8_VALUE; + headers.setContentType(MediaType.parseMediaType(mediaType)); + headers.set("Accept", mediaType); + headers.set("X-Access-Token", token); + return headers; + } + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestUtil.java new file mode 100644 index 00000000..450364d7 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/RestUtil.java @@ -0,0 +1,257 @@ +package com.jero.common.util; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.*; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.Iterator; +import java.util.Map; + +/** + * 调用 Restful 接口 Util + * + * @author sunjianlei + */ +@Slf4j +public class RestUtil { + + private static String domain = null; + + public static String getDomain() { + if (domain == null) { + domain = SpringContextUtils.getDomain(); + } + return domain; + } + + public static String path = null; + + public static String getPath() { + if (path == null) { + path = SpringContextUtils.getApplicationContext().getEnvironment().getProperty("server.servlet.context-path"); + } + return oConvertUtils.getString(path); + } + + public static String getBaseUrl() { + String basepath = getDomain() + getPath(); + log.info(" RestUtil.getBaseUrl: " + basepath); + return basepath; + } + + /** + * RestAPI 调用器 + */ + private final static RestTemplate RT; + + static { + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setConnectTimeout(3000); + requestFactory.setReadTimeout(3000); + RT = new RestTemplate(requestFactory); + // 解决乱码问题 + RT.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + } + + public static RestTemplate getRestTemplate() { + return RT; + } + + /** + * 发送 get 请求 + */ + public static JSONObject get(String url) { + return getNative(url, null, null).getBody(); + } + + /** + * 发送 get 请求 + */ + public static JSONObject get(String url, JSONObject variables) { + return getNative(url, variables, null).getBody(); + } + + /** + * 发送 get 请求 + */ + public static JSONObject get(String url, JSONObject variables, JSONObject params) { + return getNative(url, variables, params).getBody(); + } + + /** + * 发送 get 请求,返回原生 ResponseEntity 对象 + */ + public static ResponseEntity getNative(String url, JSONObject variables, JSONObject params) { + return request(url, HttpMethod.GET, variables, params); + } + + /** + * 发送 Post 请求 + */ + public static JSONObject post(String url) { + return postNative(url, null, null).getBody(); + } + + /** + * 发送 Post 请求 + */ + public static JSONObject post(String url, JSONObject params) { + return postNative(url, null, params).getBody(); + } + + /** + * 发送 Post 请求 + */ + public static JSONObject post(String url, JSONObject variables, JSONObject params) { + return postNative(url, variables, params).getBody(); + } + + /** + * 发送 POST 请求,返回原生 ResponseEntity 对象 + */ + public static ResponseEntity postNative(String url, JSONObject variables, JSONObject params) { + return request(url, HttpMethod.POST, variables, params); + } + + /** + * 发送 put 请求 + */ + public static JSONObject put(String url) { + return putNative(url, null, null).getBody(); + } + + /** + * 发送 put 请求 + */ + public static JSONObject put(String url, JSONObject params) { + return putNative(url, null, params).getBody(); + } + + /** + * 发送 put 请求 + */ + public static JSONObject put(String url, JSONObject variables, JSONObject params) { + return putNative(url, variables, params).getBody(); + } + + /** + * 发送 put 请求,返回原生 ResponseEntity 对象 + */ + public static ResponseEntity putNative(String url, JSONObject variables, JSONObject params) { + return request(url, HttpMethod.PUT, variables, params); + } + + /** + * 发送 delete 请求 + */ + public static JSONObject delete(String url) { + return deleteNative(url, null, null).getBody(); + } + + /** + * 发送 delete 请求 + */ + public static JSONObject delete(String url, JSONObject variables, JSONObject params) { + return deleteNative(url, variables, params).getBody(); + } + + /** + * 发送 delete 请求,返回原生 ResponseEntity 对象 + */ + public static ResponseEntity deleteNative(String url, JSONObject variables, JSONObject params) { + return request(url, HttpMethod.DELETE, null, variables, params, JSONObject.class); + } + + /** + * 发送请求 + */ + public static ResponseEntity request(String url, HttpMethod method, JSONObject variables, JSONObject params) { + return request(url, method, getHeaderApplicationJson(), variables, params, JSONObject.class); + } + + /** + * 发送请求 + * + * @param url 请求地址 + * @param method 请求方式 + * @param headers 请求头 可空 + * @param variables 请求url参数 可空 + * @param params 请求body参数 可空 + * @param responseType 返回类型 + * @return ResponseEntity + */ + public static ResponseEntity request(String url, HttpMethod method, HttpHeaders headers, JSONObject variables, Object params, Class responseType) { + log.info(" RestUtil --- request --- url = "+ url); + if (StringUtils.isEmpty(url)) { + throw new RuntimeException("url 不能为空"); + } + if (method == null) { + throw new RuntimeException("method 不能为空"); + } + if (headers == null) { + headers = new HttpHeaders(); + } + // 请求体 + String body = ""; + if (params != null) { + if (params instanceof JSONObject) { + body = ((JSONObject) params).toJSONString(); + + } else { + body = params.toString(); + } + } + // 拼接 url 参数 + if (variables != null) { + url += ("?" + asUrlVariables(variables)); + } + // 发送请求 + HttpEntity request = new HttpEntity<>(body, headers); + return RT.exchange(url, method, request, responseType); + } + + /** + * 获取JSON请求头 + */ + public static HttpHeaders getHeaderApplicationJson() { + return getHeader(MediaType.APPLICATION_JSON_UTF8_VALUE); + } + + /** + * 获取请求头 + */ + public static HttpHeaders getHeader(String mediaType) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.parseMediaType(mediaType)); + headers.add("Accept", mediaType); + return headers; + } + + /** + * 将 JSONObject 转为 a=1&b=2&c=3...&n=n 的形式 + */ + public static String asUrlVariables(JSONObject variables) { + Map source = variables.getInnerMap(); + Iterator it = source.keySet().iterator(); + StringBuilder urlVariables = new StringBuilder(); + while (it.hasNext()) { + String key = it.next(); + String value = ""; + Object object = source.get(key); + if (object != null) { + if (!StringUtils.isEmpty(object.toString())) { + value = object.toString(); + } + } + urlVariables.append("&").append(key).append("=").append(value); + } + // 去掉第一个& + return urlVariables.substring(1); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SimpleFormat.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SimpleFormat.java new file mode 100644 index 00000000..9f09834f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SimpleFormat.java @@ -0,0 +1,173 @@ +package com.jero.common.util; + +import java.text.*; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + +public class SimpleFormat { + public SimpleFormat() { + } + /** + * 下划线字符串转换为驼峰字符串 + * @date 2021/4/6 9:55 + * @param str 字符串 + * @return java.lang.String + */ + public static String underlineToHump(String str) { + StringBuilder sb = new StringBuilder(); + String[] strArray = str.split("_"); + String[] newStringArray = strArray; + int length = strArray.length; + + for(int i = 0; i < length; ++i) { + String s = newStringArray[i]; + // 原字符串不包含 - + if (!str.contains("_")) { + sb.append(s); + //首次添加不首字母大写 + } else if (sb.length() == 0) { + sb.append(s.toLowerCase()); + } else { + // 首字母大写 + sb.append(s.substring(0, 1).toUpperCase()); + sb.append(s.substring(1).toLowerCase()); + } + } + + return sb.toString(); + } + /** + * 驼峰字符串转换为下划线字符串 + * @date 2021/4/6 10:01 + * @param str 字符串 + * @return java.lang.String + */ + public static String humpToUnderline(String str) { + StringBuilder sb = new StringBuilder(str); + // 随着下划线的增加,偏移量也会增加 + int addUnderlineCount = 0; + // 不包含下划线 + if (!str.contains("_")) { + for(int i = 0; i < str.length(); ++i) { + // 如果字母大写 + if (Character.isUpperCase(str.charAt(i))) { + sb.insert(i + addUnderlineCount, "_"); + ++addUnderlineCount; + } + } + } + + return sb.toString().toLowerCase().startsWith("_") ? sb.toString().toLowerCase().substring(1) : sb.toString().toLowerCase(); + } + /** + * 驼峰字符串转换为下划线字符串 ps:方法可能重复了 + * @date 2021/4/6 10:17 + * @param str 字符串 + * @return java.lang.String + */ + public static String humpToShortbar(String str) { + StringBuilder sb = new StringBuilder(str); + int addUnderlineCount = 0; + if (!str.contains("-")) { + for(int i = 0; i < str.length(); ++i) { + if (Character.isUpperCase(str.charAt(i))) { + sb.insert(i + addUnderlineCount, "-"); + ++addUnderlineCount; + } + } + } + + return sb.toString().toLowerCase().startsWith("-") ? sb.toString().toLowerCase().substring(1) : sb.toString().toLowerCase(); + } + + public String number(Object obj) { + obj = obj != null && obj.toString().length() != 0 ? obj : 0; + return obj.toString().equalsIgnoreCase("NaN") ? "NaN" : (new DecimalFormat("0.00")).format(Double.parseDouble(obj.toString())); + } + + public String number(Object obj, String pattern) { + obj = obj != null && obj.toString().length() != 0 ? obj : 0; + return obj.toString().equalsIgnoreCase("NaN") ? "NaN" : (new DecimalFormat(pattern)).format(Double.parseDouble(obj.toString())); + } + + public String round(Object obj) { + obj = obj != null && obj.toString().length() != 0 ? obj : 0; + return obj.toString().equalsIgnoreCase("NaN") ? "NaN" : (new DecimalFormat("0")).format(Double.parseDouble(obj.toString())); + } + + public String currency(Object obj) { + obj = obj != null && obj.toString().length() != 0 ? obj : 0; + return NumberFormat.getCurrencyInstance(Locale.CHINA).format(obj); + } + /** + * timeStamp转换为日期格式化String + * @date 2021/4/6 10:22 + * @param obj + * @param pattern + * @return java.lang.String + */ + public String timestampToString(Object obj, String pattern) { + if (obj == null) { + return ""; + } else { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM月 -yy"); + SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat(pattern); + Date date = null; + + try { + date = simpleDateFormat.parse(obj.toString()); + } catch (ParseException e) { + e.printStackTrace(); + return "error"; + } + + return simpleDateFormat1.format(date); + } + } + + public String percent(Object obj) { + obj = obj != null && obj.toString().length() != 0 ? obj : 0; + return obj.toString().equalsIgnoreCase("NaN") ? "" : NumberFormat.getPercentInstance(Locale.CHINA).format(obj); + } + + public String date(Object obj, String pattern) { + return obj == null ? "" : (new SimpleDateFormat(pattern)).format(obj); + } + + public String date(Object obj) { + return obj == null ? "" : DateFormat.getDateInstance(1, Locale.CHINA).format(obj); + } + + public String time(Object obj) { + return obj == null ? "" : DateFormat.getTimeInstance(3, Locale.CHINA).format(obj); + } + + public String datetime(Object obj) { + return obj == null ? "" : DateFormat.getDateTimeInstance(1, 3, Locale.CHINA).format(obj); + } + /** + * 将字符串集合转换为 'string', 间隔格式的字符串 + * @date 2021/4/6 9:41 + * @param stringList 字符串集合 + * @return java.lang.String + */ + public String getInStrs(List stringList) { + StringBuffer sb = new StringBuffer(); + Iterator iterator = stringList.iterator(); + + while(iterator.hasNext()) { + String s = (String)iterator.next(); + sb.append("'" + s + "',"); + } + + String string = sb.toString(); + if ("".equals(string) && !string.endsWith(",")) { + return null; + } else { + string = string.substring(0, string.length() - 1); + return string; + } + } +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SpringContextUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SpringContextUtils.java new file mode 100644 index 00000000..cd549d0e --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SpringContextUtils.java @@ -0,0 +1,94 @@ +package com.jero.common.util; + +import javax.servlet.http.HttpServletRequest; + +import com.jero.common.constant.ServiceNameConstants; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@Component +public class SpringContextUtils implements ApplicationContextAware { + + /** + * 上下文对象实例 + */ + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtils.applicationContext = applicationContext; + } + + /** + * 获取applicationContext + * + * @return + */ + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + /** + * 获取HttpServletRequest + */ + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + /** + * 获取项目根路径 basePath + */ + public static String getDomain(){ + HttpServletRequest request = getHttpServletRequest(); + StringBuffer url = request.getRequestURL(); + //微服务情况下,获取gateway的basePath + String basePath = request.getHeader(ServiceNameConstants.X_GATEWAY_BASE_PATH); + if(oConvertUtils.isNotEmpty(basePath)){ + return basePath; + }else{ + return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); + } + } + + public static String getOrigin(){ + HttpServletRequest request = getHttpServletRequest(); + return request.getHeader("Origin"); + } + + /** + * 通过name获取 Bean. + * + * @param name + * @return + */ + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + /** + * 通过class获取Bean. + * + * @param clazz + * @param + * @return + */ + public static T getBean(Class clazz) { + return getApplicationContext().getBean(clazz); + } + + /** + * 通过name,以及Clazz返回指定的Bean + * + * @param name + * @param clazz + * @param + * @return + */ + public static T getBean(String name, Class clazz) { + return getApplicationContext().getBean(name, clazz); + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SqlInjectionUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SqlInjectionUtil.java new file mode 100644 index 00000000..a635ffe3 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SqlInjectionUtil.java @@ -0,0 +1,139 @@ +package com.jero.common.util; + +import cn.hutool.crypto.SecureUtil; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.exception.JeroBootException; +import javax.servlet.http.HttpServletRequest; + +/** + * sql注入处理工具类 + * + * @author zhoujf + */ +@Slf4j +public class SqlInjectionUtil { + /** + * sign 用于表字典加签的盐值【SQL漏洞】 + * (上线修改值 20200501,同步修改前端的盐值) + */ + private final static String TABLE_DICT_SIGN_SALT = "20200501"; + private final static String xssStr = "'|and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+"; + + /* + * 针对表字典进行额外的sign签名校验(增加安全机制) + * @param dictCode: + * @param sign: + * @param request: + * @Return: void + */ + public static void checkDictTableSign(String dictCode, String sign, HttpServletRequest request) { + //表字典SQL注入漏洞,签名校验 + String accessToken = request.getHeader("X-Access-Token"); + String signStr = dictCode + SqlInjectionUtil.TABLE_DICT_SIGN_SALT + accessToken; + String javaSign = SecureUtil.md5(signStr); + if (!javaSign.equals(sign)) { + log.error("表字典,SQL注入漏洞签名校验失败 :" + sign + "!=" + javaSign+ ",dictCode=" + dictCode); + throw new JeroBootException("无权限访问!"); + } + log.info(" 表字典,SQL注入漏洞签名校验成功!sign=" + sign + ",dictCode=" + dictCode); + } + + + /** + * sql注入过滤处理,遇到注入关键字抛异常 + * + * @param value + * @return + */ + public static void filterContent(String value) { + if (value == null || "".equals(value)) { + return; + } + // 统一转为小写 + value = value.toLowerCase(); + String[] xssArr = xssStr.split("\\|"); + for (int i = 0; i < xssArr.length; i++) { + if (value.indexOf(xssArr[i]) > -1) { + log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]); + log.error("请注意,值可能存在SQL注入风险!---> {}", value); + throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); + } + } + return; + } + + /** + * sql注入过滤处理,遇到注入关键字抛异常 + * + * @param values + * @return + */ + public static void filterContent(String[] values) { + String[] xssArr = xssStr.split("\\|"); + for (String value : values) { + if (value == null || "".equals(value)) { + return; + } + // 统一转为小写 + value = value.toLowerCase(); + for (int i = 0; i < xssArr.length; i++) { + if (value.indexOf(xssArr[i]) > -1) { + log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]); + log.error("请注意,值可能存在SQL注入风险!---> {}", value); + throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); + } + } + } + return; + } + + /** + * @特殊方法(不通用) 仅用于字典条件SQL参数,注入过滤 + * @param value + * @return + */ + @Deprecated + public static void specialFilterContent(String value) { + String specialXssStr = " exec | insert | select | delete | update | drop | count | chr | mid | master | truncate | char | declare |;|+|"; + String[] xssArr = specialXssStr.split("\\|"); + if (value == null || "".equals(value)) { + return; + } + // 统一转为小写 + value = value.toLowerCase(); + for (int i = 0; i < xssArr.length; i++) { + if (value.indexOf(xssArr[i]) > -1 || value.startsWith(xssArr[i].trim())) { + log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]); + log.error("请注意,值可能存在SQL注入风险!---> {}", value); + throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); + } + } + return; + } + + + /** + * @特殊方法(不通用) 仅用于Online报表SQL解析,注入过滤 + * @param value + * @return + */ + @Deprecated + public static void specialFilterContentForOnlineReport(String value) { + String specialXssStr = " exec | insert | delete | update | drop | chr | mid | master | truncate | char | declare |"; + String[] xssArr = specialXssStr.split("\\|"); + if (value == null || "".equals(value)) { + return; + } + // 统一转为小写 + value = value.toLowerCase(); + for (int i = 0; i < xssArr.length; i++) { + if (value.indexOf(xssArr[i]) > -1 || value.startsWith(xssArr[i].trim())) { + log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]); + log.error("请注意,值可能存在SQL注入风险!---> {}", value); + throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); + } + } + return; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SysAnnmentTypeEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SysAnnmentTypeEnum.java new file mode 100644 index 00000000..93fc313f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/SysAnnmentTypeEnum.java @@ -0,0 +1,70 @@ +package com.jero.common.util; + +/** + * 系统公告自定义跳转方式 + */ +public enum SysAnnmentTypeEnum { + /** + * 邮件跳转组件 + */ + EMAIL("email", "component", "modules/eoa/email/modals/EoaEmailInForm"), + /** + * 工作流跳转链接我的办公 + */ + BPM("bpm", "url", "/bpm/task/MyTaskList"); + + /** + * 业务类型(email:邮件 bpm:流程) + */ + private String type; + /** + * 打开方式 组件:component 路由:url + */ + private String openType; + /** + * 组件/路由 地址 + */ + private String openPage; + + SysAnnmentTypeEnum(String type, String openType, String openPage) { + this.type = type; + this.openType = openType; + this.openPage = openPage; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getOpenType() { + return openType; + } + + public void setOpenType(String openType) { + this.openType = openType; + } + + public String getOpenPage() { + return openPage; + } + + public void setOpenPage(String openPage) { + this.openPage = openPage; + } + + public static SysAnnmentTypeEnum getByType(String type) { + if (oConvertUtils.isEmpty(type)) { + return null; + } + for (SysAnnmentTypeEnum val : values()) { + if (val.getType().equals(type)) { + return val; + } + } + return null; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java new file mode 100644 index 00000000..810f8e95 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java @@ -0,0 +1,128 @@ +package com.jero.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.AuthenticationException; +import com.jero.common.api.CommonAPI; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Author scott + * @Date 2019/9/23 14:12 + * @Description: 编程校验token有效性 + */ +@Slf4j +public class TokenUtils { + + /** + * 获取 request 里传递的 token + * + * @param request + * @return + */ + public static String getTokenByRequest(HttpServletRequest request) { + String token = request.getParameter("token"); + if (token == null) { + token = request.getHeader("X-Access-Token"); + } + return token; + } + + /** + * 验证Token + */ + public static boolean verifyToken(HttpServletRequest request, CommonAPI commonAPI, RedisUtil redisUtil) { + log.debug(" -- url --" + request.getRequestURL()); + String token = getTokenByRequest(request); + + if (StringUtils.isBlank(token)) { + throw new AuthenticationException("Token不能为空!"); + } + + // 解密获得username,用于和数据库进行对比 + String username = JwtUtil.getUsername(token); + if (username == null) { + throw new AuthenticationException("Token非法无效!"); + } + + // 查询用户信息 + LoginUser user = commonAPI.getUserByName(username); + if (user == null) { + throw new AuthenticationException("用户不存在!"); + } + // 判断用户状态 + if (user.getStatus() != 1) { + throw new AuthenticationException("账号已锁定,请联系管理员!"); + } + // 校验token是否超时失效 & 或者账号密码是否错误 + if (!jwtTokenRefresh(token, username, user.getPassword(), redisUtil)) { + throw new AuthenticationException("Token失效,请重新登录"); + } + return true; + } + + /** + * 刷新token(保证用户在线操作不掉线) + * @param token + * @param userName + * @param passWord + * @param redisUtil + * @return + */ + private static boolean jwtTokenRefresh(String token, String userName, String passWord, RedisUtil redisUtil) { + String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token)); + if (oConvertUtils.isNotEmpty(cacheToken)) { + // 校验token有效性 + if (!JwtUtil.verify(cacheToken, userName, passWord)) { + String newAuthorization = JwtUtil.sign(userName, passWord); + // 设置Toekn缓存有效时间 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000); + } + //update-begin--Author:scott Date:20191005 for:解决每次请求,都重写redis中 token缓存问题 +// else { +// redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, cacheToken); +// // 设置超时时间 +// redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000); +// } + //update-end--Author:scott Date:20191005 for:解决每次请求,都重写redis中 token缓存问题 + return true; + } + return false; + } + + /** + * 验证Token + */ + public static boolean verifyToken(String token, CommonAPI commonAPI, RedisUtil redisUtil) { + if (StringUtils.isBlank(token)) { + throw new AuthenticationException("token不能为空!"); + } + + // 解密获得username,用于和数据库进行对比 + String username = JwtUtil.getUsername(token); + if (username == null) { + throw new AuthenticationException("token非法无效!"); + } + + // 查询用户信息 + LoginUser user = commonAPI.getUserByName(username); + if (user == null) { + throw new AuthenticationException("用户不存在!"); + } + // 判断用户状态 + if (user.getStatus() != 1) { + throw new AuthenticationException("账号已被锁定,请联系管理员!"); + } + // 校验token是否超时失效 & 或者账号密码是否错误 + if (!jwtTokenRefresh(token, username, user.getPassword(), redisUtil)) { + throw new AuthenticationException("Token失效,请重新登录!"); + } + return true; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/UUIDGenerator.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/UUIDGenerator.java new file mode 100644 index 00000000..04efe742 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/UUIDGenerator.java @@ -0,0 +1,95 @@ +package com.jero.common.util; + + +import java.net.InetAddress; + +/** + * + * @Author 张代浩 + * + */ +public class UUIDGenerator { + + + /** + * 产生一个32位的UUID + * + * @return + */ + + public static String generate() { + return new StringBuilder(32).append(format(getIP())).append( + format(getJVM())).append(format(getHiTime())).append( + format(getLoTime())).append(format(getCount())).toString(); + + } + + private static final int IP; + static { + int ipadd; + try { + ipadd = toInt(InetAddress.getLocalHost().getAddress()); + } catch (Exception e) { + ipadd = 0; + } + IP = ipadd; + } + + private static short counter = (short) 0; + + private static final int JVM = (int) (System.currentTimeMillis() >>> 8); + + private final static String format(int intval) { + String formatted = Integer.toHexString(intval); + StringBuilder buf = new StringBuilder("00000000"); + buf.replace(8 - formatted.length(), 8, formatted); + return buf.toString(); + } + + private final static String format(short shortval) { + String formatted = Integer.toHexString(shortval); + StringBuilder buf = new StringBuilder("0000"); + buf.replace(4 - formatted.length(), 4, formatted); + return buf.toString(); + } + + private final static int getJVM() { + return JVM; + } + + private final static short getCount() { + synchronized (UUIDGenerator.class) { + if (counter < 0) { + counter = 0; + } + return counter++; + } + } + + /** + * Unique in a local network + */ + private final static int getIP() { + return IP; + } + + /** + * Unique down to millisecond + */ + private final static short getHiTime() { + return (short) (System.currentTimeMillis() >>> 32); + } + + private final static int getLoTime() { + return (int) System.currentTimeMillis(); + } + + private final static int toInt(byte[] bytes) { + int result = 0; + for (int i = 0; i < 4; i++) { + result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i]; + } + return result; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ValidUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ValidUtil.java new file mode 100644 index 00000000..d17c252c --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/ValidUtil.java @@ -0,0 +1,42 @@ +package com.jero.common.util; + +import com.jero.common.exception.JeroBootException; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.validator.HibernateValidator; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import java.util.Set; + +/** + * 手动校验@Vaild方法 + * @author liJiaRao + * @date 2021-08-05 15:09 + */ +@Slf4j +public class ValidUtil { + + private static Validator validator; + + static { + validator = Validation.byProvider(HibernateValidator.class) + .configure() + // 快速失败 + .failFast(true) + .buildValidatorFactory().getValidator(); + } + + /** + * 手动校验@Vaild并抛出异常信息 + * + * @param object 待校验对象 + * @param groups 待校验的组 + */ + public static void validate(Object object, Class... groups){ + Set> set = validator.validate(object,groups); + for (ConstraintViolation constraintViolation : set) { + throw new JeroBootException(constraintViolation.getMessage()); + } + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/YouBianCodeUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/YouBianCodeUtil.java new file mode 100644 index 00000000..c6269402 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/YouBianCodeUtil.java @@ -0,0 +1,165 @@ +package com.jero.common.util; + +import io.netty.util.internal.StringUtil; + +/** + * 流水号生成规则(按默认规则递增,数字从1-99开始递增,数字到99,递增字母;位数不够增加位数) + * A001 + * A001A002 + * @Author zhangdaihao + * + */ +public class YouBianCodeUtil { + + // 数字位数(默认生成3位的数字) + + private static final int numLength = 2;//代表数字位数 + + public static final int zhanweiLength = 1+numLength; + + /** + * 根据前一个code,获取同级下一个code + * 例如:当前最大code为D01A04,下一个code为:D01A05 + * + * @param code + * @return + */ + public static synchronized String getNextYouBianCode(String code) { + String newcode = ""; + if (code == null || code =="") { + String zimu = "A"; + String num = getStrNum(1); + newcode = zimu + num; + } else { + String before_code = code.substring(0, code.length() - 1- numLength); + String after_code = code.substring(code.length() - 1 - numLength,code.length()); + char after_code_zimu = after_code.substring(0, 1).charAt(0); + Integer after_code_num = Integer.parseInt(after_code.substring(1)); + + String nextNum = ""; + char nextZimu = 'A'; + // 先判断数字等于999*,则计数从1重新开始,递增 + if (after_code_num == getMaxNumByLength(numLength)) { + nextNum = getNextStrNum(0); + } else { + nextNum = getNextStrNum(after_code_num); + } + // 先判断数字等于999*,则字母从A重新开始,递增 + if(after_code_num == getMaxNumByLength(numLength)) { + nextZimu = getNextZiMu(after_code_zimu); + }else{ + nextZimu = after_code_zimu; + } + + // 例如Z99,下一个code就是Z99A01 + if ('Z' == after_code_zimu && getMaxNumByLength(numLength) == after_code_num) { + newcode = code + (nextZimu + nextNum); + } else { + newcode = before_code + (nextZimu + nextNum); + } + } + return newcode; + + } + + /** + * 根据父亲code,获取下级的下一个code + * + * 例如:父亲CODE:A01 + * 当前CODE:A01B03 + * 获取的code:A01B04 + * + * @param parentCode 上级code + * @param localCode 同级code + * @return + */ + public static synchronized String getSubYouBianCode(String parentCode,String localCode) { + if(localCode!=null && localCode!=""){ + +// return parentCode + getNextYouBianCode(localCode); + return getNextYouBianCode(localCode); + + }else{ + parentCode = parentCode + "A"+ getNextStrNum(0); + } + return parentCode; + } + + + + /** + * 将数字前面位数补零 + * + * @param num + * @return + */ + private static String getNextStrNum(int num) { + return getStrNum(getNextNum(num)); + } + + /** + * 将数字前面位数补零 + * + * @param num + * @return + */ + private static String getStrNum(int num) { + String s = String.format("%0" + numLength + "d", num); + return s; + } + + /** + * 递增获取下个数字 + * + * @param num + * @return + */ + private static int getNextNum(int num) { + num++; + return num; + } + + /** + * 递增获取下个字母 + * + * @param num + * @return + */ + private static char getNextZiMu(char zimu) { + if (zimu == 'Z') { + return 'A'; + } + zimu++; + return zimu; + } + + /** + * 根据数字位数获取最大值 + * @param length + * @return + */ + private static int getMaxNumByLength(int length){ + if(length==0){ + return 0; + } + String max_num = ""; + for (int i=0;i dbSources = new HashMap<>(); + private static RedisTemplate redisTemplate; + + private static RedisTemplate getRedisTemplate() { + if (redisTemplate == null) { + redisTemplate = (RedisTemplate) SpringContextUtils.getBean("redisTemplate"); + } + return redisTemplate; + } + + /** + * 获取多数据源缓存 + * + * @param dbKey + * @return + */ + public static DynamicDataSourceModel getCacheDynamicDataSourceModel(String dbKey) { + String redisCacheKey = CacheConstant.SYS_DYNAMICDB_CACHE + dbKey; + if (getRedisTemplate().hasKey(redisCacheKey)) { + return (DynamicDataSourceModel) getRedisTemplate().opsForValue().get(redisCacheKey); + } + CommonAPI commonAPI = SpringContextUtils.getBean(CommonAPI.class); + DynamicDataSourceModel dbSource = commonAPI.getDynamicDbSourceByCode(dbKey); + if (dbSource != null) { + getRedisTemplate().opsForValue().set(redisCacheKey, dbSource); + } + return dbSource; + } + + public static DruidDataSource getCacheBasicDataSource(String dbKey) { + return dbSources.get(dbKey); + } + + /** + * put 数据源缓存 + * + * @param dbKey + * @param db + */ + public static void putCacheBasicDataSource(String dbKey, DruidDataSource db) { + dbSources.put(dbKey, db); + } + + /** + * 清空数据源缓存 + */ + public static void cleanAllCache() { + //关闭数据源连接 + for(Map.Entry entry : dbSources.entrySet()){ + String dbkey = entry.getKey(); + DruidDataSource druidDataSource = entry.getValue(); + if(druidDataSource!=null && druidDataSource.isEnable()){ + druidDataSource.close(); + } + //清空redis缓存 + getRedisTemplate().delete(CacheConstant.SYS_DYNAMICDB_CACHE + dbkey); + } + //清空缓存 + dbSources.clear(); + } + + public static void removeCache(String dbKey) { + //关闭数据源连接 + DruidDataSource druidDataSource = dbSources.get(dbKey); + if(druidDataSource!=null && druidDataSource.isEnable()){ + druidDataSource.close(); + } + //清空redis缓存 + getRedisTemplate().delete(CacheConstant.SYS_DYNAMICDB_CACHE + dbKey); + //清空缓存 + dbSources.remove(dbKey); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/DynamicDBUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/DynamicDBUtil.java new file mode 100644 index 00000000..d87da3c2 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/DynamicDBUtil.java @@ -0,0 +1,300 @@ +package com.jero.common.util.dynamic.db; + +import com.alibaba.druid.pool.DruidDataSource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import com.jero.common.exception.JeroBootException; +import com.jero.common.exception.JeroBootException; +import com.jero.common.system.vo.DynamicDataSourceModel; +import com.jero.common.util.ReflectHelper; +import com.jero.common.util.oConvertUtils; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Spring JDBC 实时数据库访问 + * + * @author chenguobin + * @version 1.0 + * @date 2014-09-05 + */ +@Slf4j +public class DynamicDBUtil { + + /** + * 获取数据源【最底层方法,不要随便调用】 + * + * @param dbSource + * @return + */ + private static DruidDataSource getJdbcDataSource(final DynamicDataSourceModel dbSource) { + DruidDataSource dataSource = new DruidDataSource(); + + String driverClassName = dbSource.getDbDriver(); + String url = dbSource.getDbUrl(); + String dbUser = dbSource.getDbUsername(); + String dbPassword = dbSource.getDbPassword(); + dataSource.setDriverClassName(driverClassName); + dataSource.setUrl(url); + //dataSource.setValidationQuery("SELECT 1 FROM DUAL"); + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(false); + dataSource.setTestOnReturn(false); + dataSource.setBreakAfterAcquireFailure(true); + dataSource.setConnectionErrorRetryAttempts(0); + dataSource.setUsername(dbUser); + dataSource.setMaxWait(60000); + dataSource.setPassword(dbPassword); + + log.info("******************************************"); + log.info("* *"); + log.info("*====【"+dbSource.getCode()+"】=====Druid连接池已启用 ====*"); + log.info("* *"); + log.info("******************************************"); + return dataSource; + } + + /** + * 通过 dbKey ,获取数据源 + * + * @param dbKey + * @return + */ + public static DruidDataSource getDbSourceByDbKey(final String dbKey) { + //获取多数据源配置 + DynamicDataSourceModel dbSource = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey); + //先判断缓存中是否存在数据库链接 + DruidDataSource cacheDbSource = DataSourceCachePool.getCacheBasicDataSource(dbKey); + if (cacheDbSource != null && !cacheDbSource.isClosed()) { + log.debug("--------getDbSourceBydbKey------------------从缓存中获取DB连接-------------------"); + return cacheDbSource; + } else { + DruidDataSource dataSource = getJdbcDataSource(dbSource); + if(dataSource!=null && dataSource.isEnable()){ + DataSourceCachePool.putCacheBasicDataSource(dbKey, dataSource); + }else{ + throw new JeroBootException("动态数据源连接失败,dbKey:"+dbKey); + } + log.info("--------getDbSourceBydbKey------------------创建DB数据库连接-------------------"); + return dataSource; + } + } + + /** + * 关闭数据库连接池 + * + * @param dbKey + * @return + */ + public static void closeDbKey(final String dbKey) { + DruidDataSource dataSource = getDbSourceByDbKey(dbKey); + try { + if (dataSource != null && !dataSource.isClosed()) { + dataSource.getConnection().commit(); + dataSource.getConnection().close(); + dataSource.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + + private static JdbcTemplate getJdbcTemplate(String dbKey) { + DruidDataSource dataSource = getDbSourceByDbKey(dbKey); + return new JdbcTemplate(dataSource); + } + + /** + * Executes the SQL statement in this PreparedStatement object, + * which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or + * DELETE; or an SQL statement that returns nothing, + * such as a DDL statement. + */ + public static int update(final String dbKey, String sql, Object... param) { + int effectCount; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + if (ArrayUtils.isEmpty(param)) { + effectCount = jdbcTemplate.update(sql); + } else { + effectCount = jdbcTemplate.update(sql, param); + } + return effectCount; + } + + /** + * 支持miniDao语法操作的Update + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持minidao语法逻辑 + * @param data sql语法中需要判断的数据及sql拼接注入中需要的数据 + * @return + */ + public static int updateByHash(final String dbKey, String sql, HashMap data) { + int effectCount; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + //根据模板获取sql + sql = FreemarkerParseFactory.parseTemplateContent(sql, data); + NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource()); + effectCount = namedParameterJdbcTemplate.update(sql, data); + return effectCount; + } + + public static Object findOne(final String dbKey, String sql, Object... param) { + List> list; + list = findList(dbKey, sql, param); + if (oConvertUtils.listIsEmpty(list)) { + log.error("Except one, but not find actually"); + } + if (list.size() > 1) { + log.error("Except one, but more than one actually"); + } + return list.get(0); + } + + /** + * 支持miniDao语法操作的查询 返回HashMap + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持minidao语法逻辑 + * @param data sql语法中需要判断的数据及sql拼接注入中需要的数据 + * @return + */ + public static Object findOneByHash(final String dbKey, String sql, HashMap data) { + List> list; + list = findListByHash(dbKey, sql, data); + if (oConvertUtils.listIsEmpty(list)) { + log.error("Except one, but not find actually"); + } + if (list.size() > 1) { + log.error("Except one, but more than one actually"); + } + return list.get(0); + } + + /** + * 直接sql查询 根据clazz返回单个实例 + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句 + * @param clazz 返回实例的Class + * @param param + * @return + */ + @SuppressWarnings("unchecked") + public static Object findOne(final String dbKey, String sql, Class clazz, Object... param) { + Map map = (Map) findOne(dbKey, sql, param); + return ReflectHelper.setAll(clazz, map); + } + + /** + * 支持miniDao语法操作的查询 返回单个实例 + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持minidao语法逻辑 + * @param clazz 返回实例的Class + * @param data sql语法中需要判断的数据及sql拼接注入中需要的数据 + * @return + */ + @SuppressWarnings("unchecked") + public static Object findOneByHash(final String dbKey, String sql, Class clazz, HashMap data) { + Map map = (Map) findOneByHash(dbKey, sql, data); + return ReflectHelper.setAll(clazz, map); + } + + public static List> findList(final String dbKey, String sql, Object... param) { + List> list; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + + if (ArrayUtils.isEmpty(param)) { + list = jdbcTemplate.queryForList(sql); + } else { + list = jdbcTemplate.queryForList(sql, param); + } + return list; + } + + /** + * 支持miniDao语法操作的查询 + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持minidao语法逻辑 + * @param data sql语法中需要判断的数据及sql拼接注入中需要的数据 + * @return + */ + public static List> findListByHash(final String dbKey, String sql, HashMap data) { + List> list; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + //根据模板获取sql + sql = FreemarkerParseFactory.parseTemplateContent(sql, data); + NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource()); + list = namedParameterJdbcTemplate.queryForList(sql, data); + return list; + } + + //此方法只能返回单列,不能返回实体类 + public static List findList(final String dbKey, String sql, Class clazz, Object... param) { + List list; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + + if (ArrayUtils.isEmpty(param)) { + list = jdbcTemplate.queryForList(sql, clazz); + } else { + list = jdbcTemplate.queryForList(sql, clazz, param); + } + return list; + } + + /** + * 支持miniDao语法操作的查询 返回单列数据list + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持minidao语法逻辑 + * @param clazz 类型Long、String等 + * @param data sql语法中需要判断的数据及sql拼接注入中需要的数据 + * @return + */ + public static List findListByHash(final String dbKey, String sql, Class clazz, HashMap data) { + List list; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + //根据模板获取sql + sql = FreemarkerParseFactory.parseTemplateContent(sql, data); + NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource()); + list = namedParameterJdbcTemplate.queryForList(sql, data, clazz); + return list; + } + + /** + * 直接sql查询 返回实体类列表 + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持 minidao 语法逻辑 + * @param clazz 返回实体类列表的class + * @param param sql拼接注入中需要的数据 + * @return + */ + public static List findListEntities(final String dbKey, String sql, Class clazz, Object... param) { + List> queryList = findList(dbKey, sql, param); + return ReflectHelper.transList2Entrys(queryList, clazz); + } + + /** + * 支持miniDao语法操作的查询 返回实体类列表 + * + * @param dbKey 数据源标识 + * @param sql 执行sql语句,sql支持minidao语法逻辑 + * @param clazz 返回实体类列表的class + * @param data sql语法中需要判断的数据及sql拼接注入中需要的数据 + * @return + */ + public static List findListEntitiesByHash(final String dbKey, String sql, Class clazz, HashMap data) { + List> queryList = findListByHash(dbKey, sql, data); + return ReflectHelper.transList2Entrys(queryList, clazz); + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/FreemarkerParseFactory.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/FreemarkerParseFactory.java new file mode 100644 index 00000000..064fa9e9 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/FreemarkerParseFactory.java @@ -0,0 +1,171 @@ +package com.jero.common.util.dynamic.db; + +import com.jero.common.util.SimpleFormat; +import freemarker.cache.StringTemplateLoader; +import freemarker.core.ParseException; +import freemarker.template.Configuration; +import freemarker.template.Template; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.io.StringWriter; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * @author 赵俊夫 + * @version V1.0 + * @Title:FreemarkerHelper + * @description:Freemarker引擎协助类 + * @date Jul 5, 2013 2:58:29 PM + */ +@Slf4j +public class FreemarkerParseFactory { + + private static final String ENCODE = "utf-8"; + /** + * 参数格式化工具类 + */ + private static final String MINI_DAO_FORMAT = "DaoFormat"; + + /** + * 文件缓存 + */ + private static final Configuration _tplConfig = new Configuration(); + /** + * SQL 缓存 + */ + private static final Configuration _sqlConfig = new Configuration(); + + private static StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); + + // 使用内嵌的(?ms)打开单行和多行模式 + private final static Pattern p = Pattern + .compile("(?ms)/\\*.*?\\*/|^\\s*//.*?$"); + + static { + _tplConfig.setClassForTemplateLoading( + new FreemarkerParseFactory().getClass(), "/"); + _tplConfig.setNumberFormat("0.#####################"); + _sqlConfig.setTemplateLoader(stringTemplateLoader); + _sqlConfig.setNumberFormat("0.#####################"); + //classic_compatible设置,解决报空指针错误 + _sqlConfig.setClassicCompatible(true); + } + + /** + * 判断模板是否存在 + * + * @throws Exception + */ + public static boolean isExistTemplate(String tplName) throws Exception { + try { + Template mytpl = _tplConfig.getTemplate(tplName, "UTF-8"); + if (mytpl == null) { + return false; + } + } catch (Exception e) { + //update-begin--Author:scott Date:20180320 for:解决问题 - 错误提示sql文件不存在,实际问题是sql freemarker用法错误----- + if (e instanceof ParseException) { + log.error(e.getMessage(), e.fillInStackTrace()); + throw new Exception(e); + } + log.debug("----isExistTemplate----" + e.toString()); + //update-end--Author:scott Date:20180320 for:解决问题 - 错误提示sql文件不存在,实际问题是sql freemarker用法错误------ + return false; + } + return true; + } + + /** + * 解析ftl模板 + * + * @param tplName 模板名 + * @param paras 参数 + * @return + */ + public static String parseTemplate(String tplName, Map paras) { + try { + log.debug(" minidao sql templdate : " + tplName); + StringWriter swriter = new StringWriter(); + Template mytpl = _tplConfig.getTemplate(tplName, ENCODE); + if (paras.containsKey(MINI_DAO_FORMAT)) { + throw new RuntimeException("DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!"); + } + paras.put(MINI_DAO_FORMAT, new SimpleFormat()); + mytpl.process(paras, swriter); + String sql = getSqlText(swriter.toString()); + paras.remove(MINI_DAO_FORMAT); + return sql; + } catch (Exception e) { + log.error(e.getMessage(), e.fillInStackTrace()); + log.error("发送一次的模板key:{ " + tplName + " }"); + //System.err.println(e.getMessage()); + //System.err.println("模板名:{ "+ tplName +" }"); + throw new RuntimeException("解析SQL模板异常"); + } + } + + /** + * 解析ftl + * + * @param tplContent 模板内容 + * @param paras 参数 + * @return String 模板解析后内容 + */ + public static String parseTemplateContent(String tplContent, + Map paras) { + try { + StringWriter swriter = new StringWriter(); + if (stringTemplateLoader.findTemplateSource("sql_" + tplContent.hashCode()) == null) { + stringTemplateLoader.putTemplate("sql_" + tplContent.hashCode(), tplContent); + } + Template mytpl = _sqlConfig.getTemplate("sql_" + tplContent.hashCode(), ENCODE); + if (paras.containsKey(MINI_DAO_FORMAT)) { + throw new RuntimeException("DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!"); + } + paras.put(MINI_DAO_FORMAT, new SimpleFormat()); + mytpl.process(paras, swriter); + String sql = getSqlText(swriter.toString()); + paras.remove(MINI_DAO_FORMAT); + return sql; + } catch (Exception e) { + log.error(e.getMessage(), e.fillInStackTrace()); + log.error("发送一次的模板key:{ " + tplContent + " }"); + //System.err.println(e.getMessage()); + //System.err.println("模板内容:{ "+ tplContent +" }"); + throw new RuntimeException("解析SQL模板异常"); + } + } + + /** + * 除去无效字段,去掉注释 不然批量处理可能报错 去除无效的等于 + */ + private static String getSqlText(String sql) { + // 将注释替换成"" + sql = p.matcher(sql).replaceAll(""); + sql = sql.replaceAll("\\n", " ").replaceAll("\\t", " ") + .replaceAll("\\s{1,}", " ").trim(); + // 去掉 最后是 where这样的问题 + if (sql.endsWith("where") || sql.endsWith("where ")) { + sql = sql.substring(0, sql.lastIndexOf("where")); + } + // 去掉where and 这样的问题 + int index = 0; + while ((index = StringUtils.indexOfIgnoreCase(sql, "where and", index)) != -1) { + sql = sql.substring(0, index + 5) + + sql.substring(index + 9, sql.length()); + } + // 去掉 , where 这样的问题 + index = 0; + while ((index = StringUtils.indexOfIgnoreCase(sql, ", where", index)) != -1) { + sql = sql.substring(0, index) + + sql.substring(index + 1, sql.length()); + } + // 去掉 最后是 ,这样的问题 + if (sql.endsWith(",") || sql.endsWith(", ")) { + sql = sql.substring(0, sql.lastIndexOf(",")); + } + return sql; + } +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/SqlUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/SqlUtils.java new file mode 100644 index 00000000..dec76a34 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/dynamic/db/SqlUtils.java @@ -0,0 +1,212 @@ +package com.jero.common.util.dynamic.db; + +import org.apache.commons.lang3.StringUtils; +import com.jero.common.constant.DataBaseConstant; +import com.jero.common.system.vo.DynamicDataSourceModel; + +import java.text.MessageFormat; +import java.util.Map; + +/** + * 根据不同的数据库,动态生成SQL,例如分页 + */ +public class SqlUtils { + + public static final String DATABSE_TYPE_MYSQL = "mysql"; + public static final String DATABSE_TYPE_POSTGRE = "postgresql"; + public static final String DATABSE_TYPE_ORACLE = "oracle"; + public static final String DATABSE_TYPE_SQLSERVER = "sqlserver"; + + + /** + * 分页SQL + */ + public static final String MYSQL_SQL = "select * from ( {0}) sel_tab00 limit {1},{2}"; + public static final String POSTGRE_SQL = "select * from ( {0}) sel_tab00 limit {2} offset {1}"; + public static final String ORACLE_SQL = "select * from (select row_.*,rownum rownum_ from ({0}) row_ where rownum <= {1}) where rownum_>{2}"; + public static final String SQLSERVER_SQL = "select * from ( select row_number() over(order by tempColumn) tempRowNumber, * from (select top {1} tempColumn = 0, {0}) t ) tt where tempRowNumber > {2}"; + + /** + * 获取所有表的SQL + */ + public static final String MYSQL_ALLTABLES_SQL = "select distinct table_name from information_schema.columns where table_schema = {0}"; + public static final String POSTGRE__ALLTABLES_SQL = "SELECT distinct c.relname AS table_name FROM pg_class c"; + public static final String ORACLE__ALLTABLES_SQL = "select distinct colstable.table_name as table_name from user_tab_cols colstable"; + public static final String SQLSERVER__ALLTABLES_SQL = "select distinct c.name as table_name from sys.objects c"; + + /** + * 获取指定表的所有列名 + */ + public static final String MYSQL_ALLCOLUMNS_SQL = "select column_name from information_schema.columns where table_name = {0} and table_schema = {1}"; + public static final String POSTGRE_ALLCOLUMNS_SQL = "select table_name from information_schema.columns where table_name = {0}"; + public static final String ORACLE_ALLCOLUMNS_SQL = "select column_name from all_tab_columns where table_name ={0}"; + public static final String SQLSERVER_ALLCOLUMNS_SQL = "select name from syscolumns where id={0}"; + + /* + * 判断数据库类型 + */ + + public static boolean dbTypeIsMySQL(String dbType) { + return dbTypeIf(dbType, DATABSE_TYPE_MYSQL, DataBaseConstant.DB_TYPE_MYSQL_NUM); + } + + public static boolean dbTypeIsOracle(String dbType) { + return dbTypeIf(dbType, DATABSE_TYPE_ORACLE, DataBaseConstant.DB_TYPE_ORACLE_NUM); + } + + public static boolean dbTypeIsSQLServer(String dbType) { + return dbTypeIf(dbType, DATABSE_TYPE_SQLSERVER, DataBaseConstant.DB_TYPE_SQLSERVER_NUM); + } + + public static boolean dbTypeIsPostgre(String dbType) { + return dbTypeIf(dbType, DATABSE_TYPE_POSTGRE, DataBaseConstant.DB_TYPE_POSTGRESQL_NUM); + } + + /** + * 判断数据库类型 + */ + public static boolean dbTypeIf(String dbType, String... correctTypes) { + for (String type : correctTypes) { + if (type.equalsIgnoreCase(dbType)) { + return true; + } + } + return false; + } + + /** + * 获取全 SQL + * 拼接 where 条件 + * + * @param sql + * @param params + * @return + */ + public static String getFullSql(String sql, Map params) { + return getFullSql(sql, params, null, null); + } + + /** + * 获取全 SQL + * 拼接 where 条件 + * 拼接 order 排序 + * + * @param sql + * @param params + * @param orderColumn 排序字段 + * @param orderBy 排序方式,只能是 DESC 或 ASC + * @return + */ + public static String getFullSql(String sql, Map params, String orderColumn, String orderBy) { + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append("SELECT t.* FROM ( ").append(sql).append(" ) t "); + if (params != null && params.size() >= 1) { + sqlBuilder.append("WHERE 1=1 "); + for (Object key : params.keySet()) { + String value = String.valueOf(params.get(key)); + if (StringUtils.isNotBlank(value)) { + sqlBuilder.append(" AND (").append(key).append(" = N'").append(value).append("')"); + } + } + if (StringUtils.isNotBlank(orderColumn) && StringUtils.isNotBlank(orderBy)) { + sqlBuilder.append("ORDER BY ").append(orderColumn).append(" ").append("DESC".equalsIgnoreCase(orderBy) ? "DESC" : "ASC"); + } + } + return sqlBuilder.toString(); + } + + /** + * 获取求数量 SQL + * + * @param sql + * @return + */ + public static String getCountSql(String sql) { + return String.format("SELECT COUNT(1) \"total\" FROM ( %s ) temp_count", sql); + } + + /** + * 生成分页查询 SQL + * + * @param dbType 数据库类型 + * @param sql + * @param page + * @param rows + * @return + */ + public static String createPageSqlByDBType(String dbType, String sql, int page, int rows) { + int beginNum = (page - 1) * rows; + Object[] sqlParam = new Object[3]; + sqlParam[0] = sql; + sqlParam[1] = String.valueOf(beginNum); + sqlParam[2] = String.valueOf(rows); + if (dbTypeIsMySQL(dbType)) { + sql = MessageFormat.format(MYSQL_SQL, sqlParam); + } else if (dbTypeIsPostgre(dbType)) { + sql = MessageFormat.format(POSTGRE_SQL, sqlParam); + } else { + int beginIndex = (page - 1) * rows; + int endIndex = beginIndex + rows; + sqlParam[2] = Integer.toString(beginIndex); + sqlParam[1] = Integer.toString(endIndex); + if (dbTypeIsOracle(dbType)) { + sql = MessageFormat.format(ORACLE_SQL, sqlParam); + } else if (dbTypeIsSQLServer(dbType)) { + sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql)); + sql = MessageFormat.format(SQLSERVER_SQL, sqlParam); + } + } + return sql; + } + + /** + * 生成分页查询 SQL + * + * @param sql + * @param page + * @param rows + * @return + */ + public static String createPageSqlByDBKey(String dbKey, String sql, int page, int rows) { + DynamicDataSourceModel dynamicSourceEntity = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey); + String dbType = dynamicSourceEntity.getDbType(); + return createPageSqlByDBType(dbType, sql, page, rows); + } + + private static int getAfterSelectInsertPoint(String sql) { + int selectIndex = sql.toLowerCase().indexOf("select"); + int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct"); + return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6); + } + + public static String getAllTableSql(String dbType, Object... params) { + if (StringUtils.isNotEmpty(dbType)) { + if (dbTypeIsMySQL(dbType)) { + return MessageFormat.format(MYSQL_ALLTABLES_SQL, params); + } else if (dbTypeIsOracle(dbType)) { + return ORACLE__ALLTABLES_SQL; + } else if (dbTypeIsPostgre(dbType)) { + return POSTGRE__ALLTABLES_SQL; + } else if (dbTypeIsSQLServer(dbType)) { + return SQLSERVER__ALLTABLES_SQL; + } + } + return null; + } + + public static String getAllColumnSQL(String dbType, Object... params) { + if (StringUtils.isNotEmpty(dbType)) { + if (dbTypeIsMySQL(dbType)) { + return MessageFormat.format(MYSQL_ALLCOLUMNS_SQL, params); + } else if (dbTypeIsOracle(dbType)) { + return MessageFormat.format(ORACLE_ALLCOLUMNS_SQL, params); + } else if (dbTypeIsPostgre(dbType)) { + return MessageFormat.format(POSTGRE_ALLCOLUMNS_SQL, params); + } else if (dbTypeIsSQLServer(dbType)) { + return MessageFormat.format(SQLSERVER_ALLCOLUMNS_SQL, params); + } + } + return null; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/AesEncryptUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/AesEncryptUtil.java new file mode 100644 index 00000000..5d14e153 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/AesEncryptUtil.java @@ -0,0 +1,121 @@ +package com.jero.common.util.encryption; + +import org.apache.shiro.codec.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * AES 加密 + */ +public class AesEncryptUtil { + + //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同! + private static String KEY = EncryptedString.key; + private static String IV = EncryptedString.iv; + + /** + * 加密方法 + * @param data 要加密的数据 + * @param key 加密key + * @param iv 加密iv + * @return 加密的结果 + * @throws Exception + */ + public static String encrypt(String data, String key, String iv) throws Exception { + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding + int blockSize = cipher.getBlockSize(); + + byte[] dataBytes = data.getBytes(); + int plaintextLength = dataBytes.length; + if (plaintextLength % blockSize != 0) { + plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); + } + + byte[] plaintext = new byte[plaintextLength]; + System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); + + SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); + IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); + + cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); + byte[] encrypted = cipher.doFinal(plaintext); + + return Base64.encodeToString(encrypted); + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 解密方法 + * @param data 要解密的数据 + * @param key 解密key + * @param iv 解密iv + * @return 解密的结果 + * @throws Exception + */ + public static String desEncrypt(String data, String key, String iv) throws Exception { + try { + byte[] encrypted1 = Base64.decode(data); + + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); + IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); + + cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); + + byte[] original = cipher.doFinal(encrypted1); + String originalString = new String(original); + return originalString; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 使用默认的key和iv加密 + * @param data + * @return + * @throws Exception + */ + public static String encrypt(String data) throws Exception { + return encrypt(data, KEY, IV); + } + + /** + * 使用默认的key和iv解密 + * @param data + * @return + * @throws Exception + */ + public static String desEncrypt(String data) throws Exception { + return desEncrypt(data, KEY, IV); + } + + + +// /** +// * 测试 +// */ +// public static void main(String args[]) throws Exception { +// String test1 = "sa"; +// String test =new String(test1.getBytes(),"UTF-8"); +// String data = null; +// String key = KEY; +// String iv = IV; +// // /g2wzfqvMOeazgtsUVbq1kmJawROa6mcRAzwG1/GeJ4= +// data = encrypt(test, key, iv); +// System.out.println("数据:"+test); +// System.out.println("加密:"+data); +// String jiemi =desEncrypt(data, key, iv).trim(); +// System.out.println("解密:"+jiemi); +// } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/EncryptedString.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/EncryptedString.java new file mode 100644 index 00000000..47b3ae8f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/encryption/EncryptedString.java @@ -0,0 +1,12 @@ +package com.jero.common.util.encryption; + + +import lombok.Data; + +@Data +public class EncryptedString { + + public static String key = "1234567890adbcde";//长度为16个字符 + + public static String iv = "1234567890hjlkew";//长度为16个字符 +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/filter/StrAttackFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/filter/StrAttackFilter.java new file mode 100644 index 00000000..94a39169 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/filter/StrAttackFilter.java @@ -0,0 +1,20 @@ +package com.jero.common.util.filter; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +/** + * 文件上传字符串过滤特殊字符 + */ +public class StrAttackFilter { + + public static String filter(String str) throws PatternSyntaxException { + // 清除掉所有特殊字符 + String regEx = "[`_《》~!@#$%^&*()+=|{}':;',\\[\\].<>?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(str); + return m.replaceAll("").trim(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/BaseColumn.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/BaseColumn.java new file mode 100644 index 00000000..5a77ac23 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/BaseColumn.java @@ -0,0 +1,28 @@ +package com.jero.common.util.jsonschema; + +import lombok.Data; + +/** + * 列 配置基本信息 + */ +@Data +public class BaseColumn { + + /** + * 列配置 描述 -对应数据库字段描述 + */ + private String title; + + /** + * 列配置 名称 -对应数据库字段名 + */ + private String field; + + public BaseColumn(){} + + public BaseColumn(String title,String field){ + this.title = title; + this.field = field; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/CommonProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/CommonProperty.java new file mode 100644 index 00000000..891575df --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/CommonProperty.java @@ -0,0 +1,195 @@ +package com.jero.common.util.jsonschema; + +import com.alibaba.fastjson.JSONObject; +import com.jero.common.system.vo.DictModel; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 验证通用属性 + */ +public abstract class CommonProperty implements Serializable{ + + private static final long serialVersionUID = -426159949502493187L; + + + protected String key; + + + /** + *

此关键字的值必须是字符串或数组。如果它是一个数组,那么数组的元素必须是字符串,并且必须是唯一的。 + *

字符串值必须是六种基本类型之一(“null”,“boolean”,“object”,“array”,“number”或“string”),或“integer”,它匹配任何数字,零分数部分。 + *

当且仅当实例位于为此关键字列出的任何集合中时,实例才会验证。 + * + */ + protected String type; + + /** + * 对应JsonSchema的enum + *

该关键字的值必须是一个数组。这个数组应该至少有一个元素。数组中的元素应该是唯一的。如果实例的值等于此关键字的数组值中的某个元素,则实例将对此关键字成功验证。 + * 数组中的元素可以是任何值,包括null + * + * { + * "type": "string", + * "enum": ["1", "2", "3"] 需要的话可以通过这个include转一下 + * } + */ + protected List include; + + /** + * 对应JsonSchema的const + *

此关键字的值可以是任何类型,包括null。 + * 如果实例的值等于关键字的值,则实例将针对此关键字成功验证。 + */ + protected Object constant; + + //三个自定义 属性 + protected String view;// 展示类型 + protected String title;//数据库字段备注 + protected Integer order;//字段显示排序 + + protected boolean disabled;//是否禁用 + + protected String defVal; // 字段默认值 + + protected String fieldExtendJson;//扩展参数 + + protected Integer dbPointLength;//小数点 + + public String getDefVal() { + return defVal; + } + + public void setDefVal(String defVal) { + this.defVal = defVal; + } + + public boolean isDisabled() { + return disabled; + } + + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + public String getView() { + return view; + } + + public void setView(String view) { + this.view = view; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getInclude() { + return include; + } + + public void setInclude(List include) { + this.include = include; + } + + public Object getConstant() { + return constant; + } + + public void setConstant(Object constant) { + this.constant = constant; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getOrder() { + return order; + } + + public void setOrder(Integer order) { + this.order = order; + } + + public String getFieldExtendJson() { + return fieldExtendJson; + } + + public void setFieldExtendJson(String fieldExtendJson) { + this.fieldExtendJson = fieldExtendJson; + } + + public Integer getDbPointLength() { + return dbPointLength; + } + + public void setDbPointLength(Integer dbPointLength) { + this.dbPointLength = dbPointLength; + } + + /** + * 返回一个map有两个key + *

key ---> Property JSON的key + *

prop --> JSON object + * @return + */ + public abstract Map getPropertyJson(); + + public JSONObject getCommonJson() { + JSONObject json = new JSONObject(); + json.put("type", type); + if(include!=null && include.size()>0) { + json.put("enum", include); + } + if(constant!=null) { + json.put("const", constant); + } + if(title!=null) { + json.put("title", title); + } + if(order!=null) { + json.put("order", order); + } + if(view==null) { + json.put("view", "input"); + }else { + json.put("view", view); + } + if(disabled) { + String str = "{\"widgetattrs\":{\"disabled\":true}}"; + JSONObject ui = JSONObject.parseObject(str); + json.put("ui", ui); + } + if (defVal!=null && defVal.length()>0) { + json.put("defVal", defVal); + } + if(fieldExtendJson != null){ + json.put("fieldExtendJson", fieldExtendJson); + } + if(dbPointLength !=null ) { + json.put("dbPointLength", dbPointLength); + } + return json; + } + + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonSchemaDescrip.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonSchemaDescrip.java new file mode 100644 index 00000000..e75797fb --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonSchemaDescrip.java @@ -0,0 +1,87 @@ +package com.jero.common.util.jsonschema; + +import java.io.Serializable; +import java.util.List; + +/** + * JsonSchema 模式类 + * < http://json-schema.org/draft-07/schema# > + */ +public class JsonSchemaDescrip implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 7682073117441544718L; + + + private String $schema = "http://json-schema.org/draft-07/schema#"; + + /** + * 用它给我们的模式提供了标题。 + */ + private String title; + + /** + * 关于模式的描述。 + */ + private String description; + + /** + *type 关键字在我们的 JSON 数据上定义了第一个约束:必须是一个 JSON 对象。 可以直接设置成object + */ + private String type; + + private List required; + + + public List getRequired() { + return required; + } + + public void setRequired(List required) { + this.required = required; + } + + public String get$schema() { + return $schema; + } + + public void set$schema(String $schema) { + this.$schema = $schema; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public JsonSchemaDescrip() {} + + public JsonSchemaDescrip(List required) { + this.description="我是一个jsonschema description"; + this.title="我是一个jsonschema title"; + this.type="object"; + this.required = required; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonschemaUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonschemaUtil.java new file mode 100644 index 00000000..91fab531 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/JsonschemaUtil.java @@ -0,0 +1,70 @@ +package com.jero.common.util.jsonschema; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class JsonschemaUtil { + + /** + * 生成JsonSchema + * + * @param descrip + * @param propertyList + * @return + */ + public static JSONObject getJsonSchema(JsonSchemaDescrip descrip, List propertyList) { + JSONObject obj = new JSONObject(); + obj.put("$schema", descrip.get$schema()); + obj.put("type", descrip.getType()); + obj.put("title", descrip.getTitle()); + + List requiredArr = descrip.getRequired(); + obj.put("required", requiredArr); + + JSONObject properties = new JSONObject(); + for (CommonProperty commonProperty : propertyList) { + Map map = commonProperty.getPropertyJson(); + properties.put(map.get("key").toString(), map.get("prop")); + } + obj.put("properties", properties); + //鬼知道这里为什么报错 com.jero.modules.system.model.DictModel cannot be cast to com.jero.modules.system.model.DictModel + //log.info("---JSONSchema--->"+obj.toJSONString()); + return obj; + } + + /** + * 生成JsonSchema 用于子对象 + * @param title 子对象描述 + * @param requiredArr 子对象必填属性名集合 + * @param propertyList 子对象属性集合 + * @return + */ + public static JSONObject getSubJsonSchema(String title,List requiredArr,List propertyList) { + JSONObject obj = new JSONObject(); + obj.put("type", "object"); + obj.put("view", "tab"); + obj.put("title", title); + + if(requiredArr==null) { + requiredArr = new ArrayList(); + } + obj.put("required", requiredArr); + + JSONObject properties = new JSONObject(); + for (CommonProperty commonProperty : propertyList) { + Map map = commonProperty.getPropertyJson(); + properties.put(map.get("key").toString(), map.get("prop")); + } + obj.put("properties", properties); + //log.info("---JSONSchema--->"+obj.toString()); + return obj; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/DictProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/DictProperty.java new file mode 100644 index 00000000..7a235d9a --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/DictProperty.java @@ -0,0 +1,82 @@ +package com.jero.common.util.jsonschema.validate; + +import java.util.HashMap; +import java.util.Map; + +import com.jero.common.util.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +/** + * 字典属性 + * @author 86729 + * + */ +public class DictProperty extends CommonProperty { + + private static final long serialVersionUID = 3786503639885610767L; + + //字典三属性 + private String dictCode; + private String dictTable; + private String dictText; + + public String getDictCode() { + return dictCode; + } + + public void setDictCode(String dictCode) { + this.dictCode = dictCode; + } + + public String getDictTable() { + return dictTable; + } + + public void setDictTable(String dictTable) { + this.dictTable = dictTable; + } + + public String getDictText() { + return dictText; + } + + public void setDictText(String dictText) { + this.dictText = dictText; + } + + public DictProperty() {} + + /** + * 构造器 + */ + public DictProperty(String key,String title,String dictTable,String dictCode,String dictText) { + this.type = "string"; + this.view = "sel_search"; + this.key = key; + this.title = title; + this.dictCode = dictCode; + this.dictTable= dictTable; + this.dictText= dictText; + } + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(dictCode!=null) { + prop.put("dictCode",dictCode); + } + if(dictTable!=null) { + prop.put("dictTable",dictTable); + } + if(dictText!=null) { + prop.put("dictText",dictText); + } + map.put("prop",prop); + return map; + } + + //TODO 重构问题:数据字典 只是字符串类的还是有存储的数值类型?只有字符串请跳过这个 只改前端 +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/HiddenProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/HiddenProperty.java new file mode 100644 index 00000000..2cb95058 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/HiddenProperty.java @@ -0,0 +1,38 @@ +package com.jero.common.util.jsonschema.validate; + +import java.util.HashMap; +import java.util.Map; + +import com.jero.common.util.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +/** + * 字典属性 + * @author 86729 + * + */ +public class HiddenProperty extends CommonProperty { + + private static final long serialVersionUID = -8939298551502162479L; + + public HiddenProperty() {} + + public HiddenProperty(String key,String title) { + this.type = "string"; + this.view = "hidden"; + this.key = key; + this.title = title; + } + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + prop.put("hidden",true); + map.put("prop",prop); + return map; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/LinkDownProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/LinkDownProperty.java new file mode 100644 index 00000000..3815d477 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/LinkDownProperty.java @@ -0,0 +1,66 @@ +package com.jero.common.util.jsonschema.validate; + +import com.alibaba.fastjson.JSONObject; +import com.jero.common.util.jsonschema.BaseColumn; +import com.jero.common.util.jsonschema.CommonProperty; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 级联下拉 + */ +public class LinkDownProperty extends CommonProperty { + + /** + * 配置信息 + */ + String dictTable; + + /** + * 级联下拉组件 的其他级联列 + */ + List otherColumns; + + public String getDictTable(){ + return this.dictTable; + } + + public void setDictTable(String dictTable){ + this.dictTable = dictTable; + } + + public List getOtherColumns(){ + return this.otherColumns; + } + + public void setOtherColumns(List otherColumns){ + this.otherColumns = otherColumns; + } + + public LinkDownProperty() {} + + /** + * 构造器 + */ + public LinkDownProperty(String key,String title,String dictTable) { + this.type = "string"; + this.view = "link_down"; + this.key = key; + this.title = title; + this.dictTable= dictTable; + } + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key", getKey()); + JSONObject prop = getCommonJson(); + JSONObject temp = JSONObject.parseObject(this.dictTable); + prop.put("config", temp); + prop.put("others", otherColumns); + map.put("prop", prop); + return map; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/NumberProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/NumberProperty.java new file mode 100644 index 00000000..174f595d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/NumberProperty.java @@ -0,0 +1,153 @@ +package com.jero.common.util.jsonschema.validate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.jero.common.system.vo.DictModel; +import com.jero.common.util.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +public class NumberProperty extends CommonProperty { + + private static final long serialVersionUID = -558615331436437200L; + + /** + * 倍数 + * 验证实例是否为此数值的倍数 + * “multipleOf”的值必须是一个数字,严格大于0。 + */ + private Integer multipleOf; + + /** + * 小于等于 + * “maximum”的值必须是一个数字,表示数字实例的包含上限。 + * 如果实例是数字,则仅当实例小于或等于“最大”时,此关键字才会生效。 + */ + private Integer maxinum; + + /** + * 小于 + * “exclusiveMaximum”的值必须是数字,表示数字实例的独占上限。 + * 如果实例是数字,则实例仅在其值严格小于(不等于)“exclusiveMaximum”时才有效。 + */ + private Integer exclusiveMaximum; + + /** + * 大于等于 + */ + private Integer minimum; + + /** + * 大于等于 + */ + private Integer exclusiveMinimum; + + private String pattern; + + public Integer getMultipleOf() { + return multipleOf; + } + + public void setMultipleOf(Integer multipleOf) { + this.multipleOf = multipleOf; + } + + public Integer getMaxinum() { + return maxinum; + } + + public void setMaxinum(Integer maxinum) { + this.maxinum = maxinum; + } + + public Integer getExclusiveMaximum() { + return exclusiveMaximum; + } + + public void setExclusiveMaximum(Integer exclusiveMaximum) { + this.exclusiveMaximum = exclusiveMaximum; + } + + public Integer getMinimum() { + return minimum; + } + + public void setMinimum(Integer minimum) { + this.minimum = minimum; + } + + public Integer getExclusiveMinimum() { + return exclusiveMinimum; + } + + public void setExclusiveMinimum(Integer exclusiveMinimum) { + this.exclusiveMinimum = exclusiveMinimum; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public NumberProperty() {} + + /** + * 构造器 + * @param key 字段名 + * @param title 字段备注 + * @param type number和integer + */ + public NumberProperty(String key,String title,String type) { + this.key = key; + this.type = type; + this.title = title; + this.view = "number"; + } + + /** + * 列表类型的走这个构造器 字典里存储的都是字符串 没法走这个构造器 + * @param key + * @param type + * @param view list-checkbox-radio + * @param include + */ + public NumberProperty(String key,String title,String view,List include) { + this.type = "integer"; + this.key = key; + this.view = view; + this.title = title; + this.include = include; + } + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(multipleOf!=null) { + prop.put("multipleOf",multipleOf); + } + if(maxinum!=null) { + prop.put("maxinum",maxinum); + } + if(exclusiveMaximum!=null) { + prop.put("exclusiveMaximum",exclusiveMaximum); + } + if(minimum!=null) { + prop.put("minimum",minimum); + } + if(exclusiveMinimum!=null) { + prop.put("exclusiveMinimum",exclusiveMinimum); + } + if(pattern!=null) { + prop.put("pattern",pattern); + } + map.put("prop",prop); + return map; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/PopupProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/PopupProperty.java new file mode 100644 index 00000000..b025d49b --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/PopupProperty.java @@ -0,0 +1,76 @@ +package com.jero.common.util.jsonschema.validate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.jero.common.util.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +public class PopupProperty extends CommonProperty { + + private static final long serialVersionUID = -3200493311633999539L; + + private String code; + + private String destFields; + + private String orgFields; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDestFields() { + return destFields; + } + + public void setDestFields(String destFields) { + this.destFields = destFields; + } + + public String getOrgFields() { + return orgFields; + } + + public void setOrgFields(String orgFields) { + this.orgFields = orgFields; + } + + public PopupProperty() {} + + public PopupProperty(String key,String title,String code,String destFields,String orgFields) { + this.view = "popup"; + this.type = "string"; + this.key = key; + this.title = title; + this.code = code; + this.destFields=destFields; + this.orgFields=orgFields; + } + + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(code!=null) { + prop.put("code",code); + } + if(destFields!=null) { + prop.put("destFields",destFields); + } + if(orgFields!=null) { + prop.put("orgFields",orgFields); + } + map.put("prop",prop); + return map; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/StringProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/StringProperty.java new file mode 100644 index 00000000..124740f7 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/StringProperty.java @@ -0,0 +1,119 @@ +package com.jero.common.util.jsonschema.validate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.jero.common.system.vo.DictModel; +import com.jero.common.util.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +public class StringProperty extends CommonProperty { + + private static final long serialVersionUID = -3200493311633999539L; + + private Integer maxLength; + + private Integer minLength; + + /** + * 根据ECMA 262正则表达式方言,该字符串应该是有效的正则表达式。 + */ + private String pattern; + + /** + * 错误提示信息 + */ + private String errorInfo; + + public Integer getMaxLength() { + return maxLength; + } + + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public Integer getMinLength() { + return minLength; + } + + public void setMinLength(Integer minLength) { + this.minLength = minLength; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public String getErrorInfo() { + return errorInfo; + } + + + public void setErrorInfo(String errorInfo) { + this.errorInfo = errorInfo; + } + + + public StringProperty() {} + + /** + * 一般字符串类型走这个构造器 + * @param key 字段名 + * @param title 字段备注 + * @param view 展示控件 + * @param maxLength 数据库字段最大长度 + */ + public StringProperty(String key,String title,String view,Integer maxLength) { + this.maxLength = maxLength; + this.key = key; + this.view = view; + this.title = title; + this.type = "string"; + } + + /** + * 列表类型的走这个构造器 + * @param key 字段名 + * @param title 字段备注 + * @param view 展示控件 list-checkbox-radio + * @param maxLength 数据库字段最大长度 + * @param include 数据字典 + */ + public StringProperty(String key,String title,String view,Integer maxLength,List include) { + this.maxLength = maxLength; + this.key = key; + this.view = view; + this.title = title; + this.type = "string"; + this.include = include; + } + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(maxLength!=null) { + prop.put("maxLength",maxLength); + } + if(minLength!=null) { + prop.put("minLength",minLength); + } + if(pattern!=null) { + prop.put("pattern",pattern); + } + if(errorInfo!=null) { + prop.put("errorInfo",errorInfo); + } + map.put("prop",prop); + return map; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/SwitchProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/SwitchProperty.java new file mode 100644 index 00000000..46ff15b2 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/SwitchProperty.java @@ -0,0 +1,46 @@ +package com.jero.common.util.jsonschema.validate; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jero.common.util.jsonschema.CommonProperty; + +import java.util.HashMap; +import java.util.Map; + +/** + * 开关 属性 + */ +public class SwitchProperty extends CommonProperty { + + //扩展参数配置信息 + private String extendStr; + + public SwitchProperty() {} + + /** + * 构造器 + */ + public SwitchProperty(String key, String title, String extendStr) { + this.type = "string"; + this.view = "switch"; + this.key = key; + this.title = title; + this.extendStr = extendStr; + } + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + JSONArray array = new JSONArray(); + if(extendStr!=null) { + array = JSONArray.parseArray(extendStr); + prop.put("extendOption",array); + } + map.put("prop",prop); + return map; + } + + //TODO 重构问题:数据字典 只是字符串类的还是有存储的数值类型?只有字符串请跳过这个 只改前端 +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/TreeSelectProperty.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/TreeSelectProperty.java new file mode 100644 index 00000000..96160879 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/jsonschema/validate/TreeSelectProperty.java @@ -0,0 +1,146 @@ +package com.jero.common.util.jsonschema.validate; + +import java.util.HashMap; +import java.util.Map; + +import com.jero.common.util.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +/** + * 字典属性 + * @author 86729 + * + */ +public class TreeSelectProperty extends CommonProperty { + + private static final long serialVersionUID = 3786503639885610767L; + + private String dict;//表名,文本,id + private String pidField;//父级字段 默认pid + private String pidValue;//父级节点的值 暂时没用到 默认为0 + private String hasChildField; + private String textField;//树形下拉保存text值的字段名 + + /** + * 是不是pid 组件 1是 0否 + */ + private Integer pidComponent = 0; + + public String getDict() { + return dict; + } + + public void setDict(String dict) { + this.dict = dict; + } + + public String getPidField() { + return pidField; + } + + public void setPidField(String pidField) { + this.pidField = pidField; + } + + public String getPidValue() { + return pidValue; + } + + public void setPidValue(String pidValue) { + this.pidValue = pidValue; + } + + public String getHasChildField() { + return hasChildField; + } + + public void setHasChildField(String hasChildField) { + this.hasChildField = hasChildField; + } + + public TreeSelectProperty() {} + + public String getTextField() { + return textField; + } + + public void setTextField(String textField) { + this.textField = textField; + } + + public Integer getPidComponent() { + return pidComponent; + } + + public void setPidComponent(Integer pidComponent) { + this.pidComponent = pidComponent; + } + + /** + * 构造器 构造普通树形下拉 + */ + public TreeSelectProperty(String key,String title,String dict,String pidField,String pidValue) { + this.type = "string"; + this.view = "sel_tree"; + this.key = key; + this.title = title; + this.dict = dict; + this.pidField= pidField; + this.pidValue= pidValue; + } + + /** + * 分类字典下拉专用 + * @param key + * @param title + * @param pidValue + */ + public TreeSelectProperty(String key,String title,String pidValue) { + this.type = "string"; + this.view = "cat_tree"; + this.key = key; + this.title = title; + this.pidValue = pidValue; + } + + /** + * 分类字典 支持存储text 下拉专用 + * @param key + * @param title + * @param pidValue + * @param textField + */ + public TreeSelectProperty(String key,String title,String pidValue,String textField) { + this(key,title,pidValue); + this.textField = textField; + } + + @Override + public Map getPropertyJson() { + Map map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(dict!=null) { + prop.put("dict",dict); + } + if(pidField!=null) { + prop.put("pidField",pidField); + } + if(pidValue!=null) { + prop.put("pidValue",pidValue); + } + if(textField!=null) { + prop.put("textField",textField); + } + if(hasChildField!=null) { + prop.put("hasChildField",hasChildField); + } + if(pidComponent!=null) { + prop.put("pidComponent",pidComponent); + } + map.put("prop",prop); + return map; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oConvertUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oConvertUtils.java new file mode 100644 index 00000000..9ea519a7 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oConvertUtils.java @@ -0,0 +1,668 @@ +package com.jero.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.BeanUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.sql.Date; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * + * @Author 张代浩 + * + */ +@Slf4j +public class oConvertUtils { + public static boolean isEmpty(Object object) { + if (object == null) { + return (true); + } + if ("".equals(object)) { + return (true); + } + if ("null".equals(object)) { + return (true); + } + return (false); + } + + public static boolean isNotEmpty(Object object) { + if (object != null && !object.equals("") && !object.equals("null")) { + return (true); + } + return (false); + } + + public static String decode(String strIn, String sourceCode, String targetCode) { + String temp = code2code(strIn, sourceCode, targetCode); + return temp; + } + + public static String StrToUTF(String strIn, String sourceCode, String targetCode) { + strIn = ""; + try { + strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return strIn; + + } + + private static String code2code(String strIn, String sourceCode, String targetCode) { + String strOut = null; + if (strIn == null || (strIn.trim()).equals("")) { + return strIn; + } + try { + byte[] b = strIn.getBytes(sourceCode); + for (int i = 0; i < b.length; i++) { + System.out.print(b[i] + " "); + } + strOut = new String(b, targetCode); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return strOut; + } + + public static int getInt(String s, int defval) { + if (s == null || s == "") { + return (defval); + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static int getInt(String s) { + if (s == null || s == "") { + return 0; + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return 0; + } + } + + public static int getInt(String s, Integer df) { + if (s == null || s == "") { + return df; + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return 0; + } + } + + public static Integer[] getInts(String[] s) { + Integer[] integer = new Integer[s.length]; + if (s == null) { + return null; + } + for (int i = 0; i < s.length; i++) { + integer[i] = Integer.parseInt(s[i]); + } + return integer; + + } + + public static double getDouble(String s, double defval) { + if (s == null || s == "") { + return (defval); + } + try { + return (Double.parseDouble(s)); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static double getDou(Double s, double defval) { + if (s == null) { + return (defval); + } + return s; + } + + /*public static Short getShort(String s) { + if (StringUtil.isNotEmpty(s)) { + return (Short.parseShort(s)); + } else { + return null; + } + }*/ + + public static int getInt(Object object, int defval) { + if (isEmpty(object)) { + return (defval); + } + try { + return (Integer.parseInt(object.toString())); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static Integer getInt(Object object) { + if (isEmpty(object)) { + return null; + } + try { + return (Integer.parseInt(object.toString())); + } catch (NumberFormatException e) { + return null; + } + } + + public static int getInt(BigDecimal s, int defval) { + if (s == null) { + return (defval); + } + return s.intValue(); + } + + public static Integer[] getIntegerArry(String[] object) { + int len = object.length; + Integer[] result = new Integer[len]; + try { + for (int i = 0; i < len; i++) { + result[i] = new Integer(object[i].trim()); + } + return result; + } catch (NumberFormatException e) { + return null; + } + } + + public static String getString(String s) { + return (getString(s, "")); + } + + /** + * 转义成Unicode编码 + * @param s + * @return + */ + /*public static String escapeJava(Object s) { + return StringEscapeUtils.escapeJava(getString(s)); + }*/ + + public static String getString(Object object) { + if (isEmpty(object)) { + return ""; + } + return (object.toString().trim()); + } + + public static String getString(int i) { + return (String.valueOf(i)); + } + + public static String getString(float i) { + return (String.valueOf(i)); + } + + public static String getString(String s, String defval) { + if (isEmpty(s)) { + return (defval); + } + return (s.trim()); + } + + public static String getString(Object s, String defval) { + if (isEmpty(s)) { + return (defval); + } + return (s.toString().trim()); + } + + public static long stringToLong(String str) { + Long test = new Long(0); + try { + test = Long.valueOf(str); + } catch (Exception e) { + } + return test.longValue(); + } + + /** + * 获取本机IP + */ + public static String getIp() { + String ip = null; + try { + InetAddress address = InetAddress.getLocalHost(); + ip = address.getHostAddress(); + + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return ip; + } + + /** + * 判断一个类是否为基本数据类型。 + * + * @param clazz + * 要判断的类。 + * @return true 表示为基本数据类型。 + */ + private static boolean isBaseDataType(Class clazz) throws Exception { + return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive()); + } + + /** + * @param request + * IP + * @return IP Address + */ + public static String getIpAddrByRequest(HttpServletRequest request) { + 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("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + + /** + * @return 本机IP + * @throws SocketException + */ + public static String getRealIp() throws SocketException { + String localip = null;// 本地IP,如果没有配置外网IP则返回它 + String netip = null;// 外网IP + + Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip = null; + boolean finded = false;// 是否找到外网IP + while (netInterfaces.hasMoreElements() && !finded) { + NetworkInterface ni = netInterfaces.nextElement(); + Enumeration address = ni.getInetAddresses(); + while (address.hasMoreElements()) { + ip = address.nextElement(); + if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 外网IP + netip = ip.getHostAddress(); + finded = true; + break; + } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 内网IP + localip = ip.getHostAddress(); + } + } + } + + if (netip != null && !"".equals(netip)) { + return netip; + } else { + return localip; + } + } + + /** + * java去除字符串中的空格、回车、换行符、制表符 + * + * @param str + * @return + */ + public static String replaceBlank(String str) { + String dest = ""; + if (str != null) { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(str); + dest = m.replaceAll(""); + } + return dest; + + } + + /** + * 判断元素是否在数组内 + * + * @param substring + * @param source + * @return + */ + public static boolean isIn(String substring, String[] source) { + if (source == null || source.length == 0) { + return false; + } + for (int i = 0; i < source.length; i++) { + String aSource = source[i]; + if (aSource.equals(substring)) { + return true; + } + } + return false; + } + + /** + * 获取Map对象 + */ + public static Map getHashMap() { + return new HashMap(); + } + + /** + * SET转换MAP + * + * @param str + * @return + */ + public static Map SetToMap(Set setobj) { + Map map = getHashMap(); + for (Iterator iterator = setobj.iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + map.put(entry.getKey().toString(), entry.getValue() == null ? "" : entry.getValue().toString().trim()); + } + return map; + + } + + public static boolean isInnerIP(String ipAddress) { + boolean isInnerIp = false; + long ipNum = getIpNum(ipAddress); + /** + * 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址 + **/ + long aBegin = getIpNum("10.0.0.0"); + long aEnd = getIpNum("10.255.255.255"); + long bBegin = getIpNum("172.16.0.0"); + long bEnd = getIpNum("172.31.255.255"); + long cBegin = getIpNum("192.168.0.0"); + long cEnd = getIpNum("192.168.255.255"); + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1"); + return isInnerIp; + } + + private static long getIpNum(String ipAddress) { + String[] ip = ipAddress.split("\\."); + long a = Integer.parseInt(ip[0]); + long b = Integer.parseInt(ip[1]); + long c = Integer.parseInt(ip[2]); + long d = Integer.parseInt(ip[3]); + + long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; + return ipNum; + } + + private static boolean isInner(long userIp, long begin, long end) { + return (userIp >= begin) && (userIp <= end); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 例如:hello_world->helloWorld + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelName(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母小写 + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + return name.substring(0, 1).toLowerCase() + name.substring(1).toLowerCase(); + //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + } + // 用下划线将原始字符串分割 + String camels[] = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 处理真正的驼峰片段 + if (result.length() == 0) { + // 第一个驼峰片段,全部字母都小写 + result.append(camel.toLowerCase()); + } else { + // 其他的驼峰片段,首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + } + return result.toString(); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 例如:hello_world,test_id->helloWorld,testId + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelNames(String names) { + if(names==null||names.equals("")){ + return null; + } + StringBuffer sf = new StringBuffer(); + String[] fs = names.split(","); + for (String field : fs) { + field = camelName(field); + sf.append(field + ","); + } + String result = sf.toString(); + return result.substring(0, result.length() - 1); + } + + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + /** + * 将下划线大写方式命名的字符串转换为驼峰式。(首字母写) + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 例如:hello_world->HelloWorld + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelNameCapFirst(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).toLowerCase(); + } + // 用下划线将原始字符串分割 + 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(); + } + //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + + /** + * 将驼峰命名转化成下划线 + * @param para + * @return + */ + public static String camelToUnderline(String para){ + if(para.length()<3){ + return para.toLowerCase(); + } + StringBuilder sb=new StringBuilder(para); + int temp=0;//定位 + //从第三个字符开始 避免命名不规范 + for(int i=2;i clazz = object.getClass(); + List fieldList = new ArrayList<>(); + while (clazz != null) { + fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); + clazz = clazz.getSuperclass(); + } + Field[] fields = new Field[fieldList.size()]; + fieldList.toArray(fields); + return fields; + } + + /** + * 将map的key全部转成小写 + * @param list + * @return + */ + public static List> toLowerCasePageList(List> list){ + List> select = new ArrayList<>(); + for (Map row : list) { + Map resultMap = new HashMap<>(); + Set keySet = row.keySet(); + for (String key : keySet) { + String newKey = key.toLowerCase(); + resultMap.put(newKey, row.get(key)); + } + select.add(resultMap); + } + return select; + } + + /** + * 将entityList转换成modelList + * @param fromList + * @param tClass + * @param + * @param + * @return + */ + public static List entityListToModelList(List fromList, Class tClass){ + if(fromList == null || fromList.isEmpty()){ + return null; + } + List tList = new ArrayList<>(); + for(F f : fromList){ + T t = entityToModel(f, tClass); + tList.add(t); + } + return tList; + } + + public static T entityToModel(F entity, Class modelClass) { + log.debug("entityToModel : Entity属性的值赋值到Model"); + Object model = null; + if (entity == null || modelClass ==null) { + return null; + } + + try { + model = modelClass.newInstance(); + } catch (InstantiationException e) { + log.error("entityToModel : 实例化异常", e); + } catch (IllegalAccessException e) { + log.error("entityToModel : 安全权限异常", e); + } + BeanUtils.copyProperties(entity, model); + return (T)model; + } + + /** + * 判断 list 是否为空 + * + * @param list + * @return true or false + * list == null : true + * list.size() == 0 : true + */ + public static boolean listIsEmpty(Collection list) { + return (list == null || list.size() == 0); + } + + /** + * 判断 list 是否不为空 + * + * @param list + * @return true or false + * list == null : false + * list.size() == 0 : false + */ + public static boolean listIsNotEmpty(Collection list) { + return !listIsEmpty(list); + } + + /** + * 读取静态文本内容 + * @param url + * @return + */ + public static String readStatic(String url) { + String json = ""; + try { + //换个写法,解决springboot读取jar包中文件的问题 + InputStream stream = oConvertUtils.class.getClassLoader().getResourceAsStream(url.replace("classpath:", "")); + json = IOUtils.toString(stream,"UTF-8"); + } catch (IOException e) { + log.error(e.getMessage(),e); + } + return json; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oss/OssBootUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oss/OssBootUtil.java new file mode 100644 index 00000000..052849ca --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/oss/OssBootUtil.java @@ -0,0 +1,329 @@ +package com.jero.common.util.oss; + +import com.aliyun.oss.ClientConfiguration; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.common.auth.DefaultCredentialProvider; +import com.aliyun.oss.model.CannedAccessControlList; +import com.aliyun.oss.model.OSSObject; +import com.aliyun.oss.model.PutObjectResult; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.http.fileupload.FileItemStream; +import com.jero.common.util.CommonUtils; +import com.jero.common.util.filter.StrAttackFilter; +import com.jero.common.util.oConvertUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLDecoder; +import java.util.Date; +import java.util.UUID; + +/** + * @Description: 阿里云 oss 上传工具类(高依赖版) + * @Date: 2019/5/10 + */ +@Slf4j +public class OssBootUtil { + + private static String endPoint; + private static String accessKeyId; + private static String accessKeySecret; + private static String bucketName; + private static String staticDomain; + + public static void setEndPoint(String endPoint) { + OssBootUtil.endPoint = endPoint; + } + + public static void setAccessKeyId(String accessKeyId) { + OssBootUtil.accessKeyId = accessKeyId; + } + + public static void setAccessKeySecret(String accessKeySecret) { + OssBootUtil.accessKeySecret = accessKeySecret; + } + + public static void setBucketName(String bucketName) { + OssBootUtil.bucketName = bucketName; + } + + public static void setStaticDomain(String staticDomain) { + OssBootUtil.staticDomain = staticDomain; + } + + public static String getStaticDomain() { + return staticDomain; + } + + public static String getEndPoint() { + return endPoint; + } + + public static String getAccessKeyId() { + return accessKeyId; + } + + public static String getAccessKeySecret() { + return accessKeySecret; + } + + public static String getBucketName() { + return bucketName; + } + + public static OSSClient getOssClient() { + return ossClient; + } + + /** + * oss 工具客户端 + */ + private static OSSClient ossClient = null; + + /** + * 上传文件至阿里云 OSS + * 文件上传成功,返回文件完整访问路径 + * 文件上传失败,返回 null + * + * @param file 待上传文件 + * @param fileDir 文件保存目录 + * @return oss 中的相对文件路径 + */ + public static String upload(MultipartFile file, String fileDir,String customBucket) { + String FILE_URL = null; + initOSS(endPoint, accessKeyId, accessKeySecret); + StringBuilder fileUrl = new StringBuilder(); + String newBucket = bucketName; + if(oConvertUtils.isNotEmpty(customBucket)){ + newBucket = customBucket; + } + try { + //判断桶是否存在,不存在则创建桶 + if(!ossClient.doesBucketExist(newBucket)){ + ossClient.createBucket(newBucket); + } + // 获取文件名 + String orgName = file.getOriginalFilename(); + if("" == orgName){ + orgName=file.getName(); + } + orgName = CommonUtils.getFileName(orgName); + String fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(".")); + if (!fileDir.endsWith("/")) { + fileDir = fileDir.concat("/"); + } + //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + fileDir=StrAttackFilter.filter(fileDir); + //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + fileUrl = fileUrl.append(fileDir + fileName); + + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { + FILE_URL = staticDomain + "/" + fileUrl; + } else { + FILE_URL = "https://" + newBucket + "." + endPoint + "/" + fileUrl; + } + PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream()); + // 设置权限(公开读) +// ossClient.setBucketAcl(newBucket, CannedAccessControlList.PublicRead); + if (result != null) { + log.info("------OSS文件上传成功------" + fileUrl); + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + return FILE_URL; + } + + /** + * 获取原始URL + * @param url: 原始URL + * @Return: java.lang.String + */ + public static String getOriginalUrl(String url) { + String originalDomain = "https://" + bucketName + "." + endPoint; + if(url.indexOf(staticDomain)!=-1){ + url = url.replace(staticDomain,originalDomain); + } + return url; + } + + /** + * 文件上传 + * @param file + * @param fileDir + * @return + */ + public static String upload(MultipartFile file, String fileDir) { + return upload(file, fileDir,null); + } + + /** + * 上传文件至阿里云 OSS + * 文件上传成功,返回文件完整访问路径 + * 文件上传失败,返回 null + * + * @param file 待上传文件 + * @param fileDir 文件保存目录 + * @return oss 中的相对文件路径 + */ + public static String upload(FileItemStream file, String fileDir) { + String FILE_URL = null; + initOSS(endPoint, accessKeyId, accessKeySecret); + StringBuilder fileUrl = new StringBuilder(); + try { + String suffix = file.getName().substring(file.getName().lastIndexOf('.')); + String fileName = UUID.randomUUID().toString().replace("-", "") + suffix; + if (!fileDir.endsWith("/")) { + fileDir = fileDir.concat("/"); + } + fileDir = StrAttackFilter.filter(fileDir); + fileUrl = fileUrl.append(fileDir + fileName); + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { + FILE_URL = staticDomain + "/" + fileUrl; + } else { + FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl; + } + PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream()); + // 设置权限(公开读) + ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); + if (result != null) { + log.info("------OSS文件上传成功------" + fileUrl); + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + return FILE_URL; + } + + /** + * 删除文件 + * @param url + */ + public static void deleteUrl(String url) { + deleteUrl(url,null); + } + + /** + * 删除文件 + * @param url + */ + public static void deleteUrl(String url,String bucket) { + String newBucket = bucketName; + if(oConvertUtils.isNotEmpty(bucket)){ + newBucket = bucket; + } + String bucketUrl = ""; + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { + bucketUrl = staticDomain + "/" ; + } else { + bucketUrl = "https://" + newBucket + "." + endPoint + "/"; + } + url = url.replace(bucketUrl,""); + ossClient.deleteObject(newBucket, url); + } + + /** + * 删除文件 + * @param fileName + */ + public static void delete(String fileName) { + ossClient.deleteObject(bucketName, fileName); + } + + /** + * 获取文件流 + * @param objectName + * @param bucket + * @return + */ + public static InputStream getOssFile(String objectName,String bucket){ + InputStream inputStream = null; + try{ + String newBucket = bucketName; + if(oConvertUtils.isNotEmpty(bucket)){ + newBucket = bucket; + } + initOSS(endPoint, accessKeyId, accessKeySecret); + OSSObject ossObject = ossClient.getObject(newBucket,objectName); + inputStream = new BufferedInputStream(ossObject.getObjectContent()); + }catch (Exception e){ + log.info("文件获取失败" + e.getMessage()); + } + return inputStream; + } + + /** + * 获取文件流 + * @param objectName + * @return + */ + public static InputStream getOssFile(String objectName){ + return getOssFile(objectName,null); + } + + /** + * 获取文件外链 + * @param bucketName + * @param objectName + * @param expires + * @return + */ + public static String getObjectURL(String bucketName, String objectName, Date expires) { + initOSS(endPoint, accessKeyId, accessKeySecret); + try{ + if(ossClient.doesObjectExist(bucketName,objectName)){ + URL url = ossClient.generatePresignedUrl(bucketName,objectName,expires); + return URLDecoder.decode(url.toString(),"UTF-8"); + } + }catch (Exception e){ + log.info("文件路径获取失败" + e.getMessage()); + } + return null; + } + + /** + * 初始化 oss 客户端 + * + * @return + */ + private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) { + if (ossClient == null) { + ossClient = new OSSClient(endpoint, + new DefaultCredentialProvider(accessKeyId, accessKeySecret), + new ClientConfiguration()); + } + return ossClient; + } + + + /** + * 上传文件到oss + * @param stream + * @param relativePath + * @return + */ + public static String upload(InputStream stream, String relativePath) { + String FILE_URL = null; + String fileUrl = relativePath; + initOSS(endPoint, accessKeyId, accessKeySecret); + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { + FILE_URL = staticDomain + "/" + relativePath; + } else { + FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl; + } + PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(),stream); + // 设置权限(公开读) + ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); + if (result != null) { + log.info("------OSS文件上传成功------" + fileUrl); + } + return FILE_URL; + } + + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/SecurityTools.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/SecurityTools.java new file mode 100644 index 00000000..677f2218 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/SecurityTools.java @@ -0,0 +1,77 @@ +package com.jero.common.util.security; + +import cn.hutool.core.codec.Base64Decoder; +import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.crypto.asymmetric.Sign; +import cn.hutool.crypto.asymmetric.SignAlgorithm; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.json.JSONObject; +import com.jero.common.util.security.entity.*; + +import javax.crypto.SecretKey; +import java.security.KeyPair; + +public class SecurityTools { + public static final String ALGORITHM = "AES/ECB/PKCS5Padding"; + + public static SecurityResp valid(SecurityReq req) { + SecurityResp resp=new SecurityResp(); + String pubKey=req.getPubKey(); + String aesKey=req.getAesKey(); + String data=req.getData(); + String signData=req.getSignData(); + RSA rsa=new RSA(null, Base64Decoder.decode(pubKey)); + Sign sign= new Sign(SignAlgorithm.SHA1withRSA,null,pubKey); + + + + byte[] decryptAes = rsa.decrypt(aesKey, KeyType.PublicKey); + //log.info("rsa解密后的秘钥"+ Base64Encoder.encode(decryptAes)); + AES aes = SecureUtil.aes(decryptAes); + + String dencrptValue =aes.decryptStr(data); + //log.info("解密后报文"+dencrptValue); + resp.setData(new JSONObject(dencrptValue)); + + boolean verify = sign.verify(dencrptValue.getBytes(), Base64Decoder.decode(signData)); + resp.setSuccess(verify); + return resp; + } + + public static SecuritySignResp sign(SecuritySignReq req) { + SecretKey secretKey = SecureUtil.generateKey(ALGORITHM); + byte[] key= secretKey.getEncoded(); + String prikey=req.getPrikey(); + String data=req.getData(); + + AES aes = SecureUtil.aes(key); + aes.getSecretKey().getEncoded(); + String encrptData =aes.encryptBase64(data); + RSA rsa=new RSA(prikey,null); + byte[] encryptAesKey = rsa.encrypt(secretKey.getEncoded(), KeyType.PrivateKey); + //log.info(("rsa加密过的秘钥=="+Base64Encoder.encode(encryptAesKey)); + + Sign sign= new Sign(SignAlgorithm.SHA1withRSA,prikey,null); + byte[] signed = sign.sign(data.getBytes()); + + //log.info(("签名数据===》》"+Base64Encoder.encode(signed)); + + SecuritySignResp resp=new SecuritySignResp(); + resp.setAesKey(Base64Encoder.encode(encryptAesKey)); + resp.setData(encrptData); + resp.setSignData(Base64Encoder.encode(signed)); + return resp; + } + public static MyKeyPair generateKeyPair(){ + KeyPair keyPair= SecureUtil.generateKeyPair(SignAlgorithm.SHA1withRSA.getValue(),2048); + String priKey= Base64Encoder.encode(keyPair.getPrivate().getEncoded()); + String pubkey= Base64Encoder.encode(keyPair.getPublic().getEncoded()); + MyKeyPair resp=new MyKeyPair(); + resp.setPriKey(priKey); + resp.setPubKey(pubkey); + return resp; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/MyKeyPair.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/MyKeyPair.java new file mode 100644 index 00000000..c4827ea8 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/MyKeyPair.java @@ -0,0 +1,9 @@ +package com.jero.common.util.security.entity; + +import lombok.Data; + +@Data +public class MyKeyPair { + private String priKey; + private String pubKey; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityReq.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityReq.java new file mode 100644 index 00000000..270251cb --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityReq.java @@ -0,0 +1,11 @@ +package com.jero.common.util.security.entity; + +import lombok.Data; + +@Data +public class SecurityReq { + private String data; + private String pubKey; + private String signData; + private String aesKey; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityResp.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityResp.java new file mode 100644 index 00000000..2d2e99e7 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecurityResp.java @@ -0,0 +1,10 @@ +package com.jero.common.util.security.entity; + +import cn.hutool.json.JSONObject; +import lombok.Data; + +@Data +public class SecurityResp { + private Boolean success; + private JSONObject data; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignReq.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignReq.java new file mode 100644 index 00000000..1f66c53b --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignReq.java @@ -0,0 +1,9 @@ +package com.jero.common.util.security.entity; + +import lombok.Data; + +@Data +public class SecuritySignReq { + private String data; + private String prikey; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignResp.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignResp.java new file mode 100644 index 00000000..08302b84 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/security/entity/SecuritySignResp.java @@ -0,0 +1,10 @@ +package com.jero.common.util.security.entity; + +import lombok.Data; + +@Data +public class SecuritySignResp { + private String data; + private String signData; + private String aesKey; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/ObjectParseUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/ObjectParseUtil.java new file mode 100644 index 00000000..2ded51e4 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/ObjectParseUtil.java @@ -0,0 +1,60 @@ +package com.jero.common.util.superSearch; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +/** + * 判断类型,追加查询规则 + * + * @Author Scott + * @Date 2019年02月14日 + */ +public class ObjectParseUtil { + + /** + * + * @param queryWrapper QueryWrapper + * @param name 字段名字 + * @param rule 查询规则 + * @param value 查询条件值 + */ + public static void addCriteria(QueryWrapper queryWrapper, String name, QueryRuleEnum rule, Object value) { + if (value == null || rule == null) { + return; + } + switch (rule) { + case GT: + queryWrapper.gt(name, value); + break; + case GE: + queryWrapper.ge(name, value); + break; + case LT: + queryWrapper.lt(name, value); + break; + case LE: + queryWrapper.le(name, value); + break; + case EQ: + queryWrapper.eq(name, value); + break; + case NE: + queryWrapper.ne(name, value); + break; + case IN: + queryWrapper.in(name, (Object[]) value); + break; + case LIKE: + queryWrapper.like(name, value); + break; + case LEFT_LIKE: + queryWrapper.likeLeft(name, value); + break; + case RIGHT_LIKE: + queryWrapper.likeRight(name, value); + break; + default: + break; + } + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleEnum.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleEnum.java new file mode 100644 index 00000000..41f29532 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleEnum.java @@ -0,0 +1,60 @@ +package com.jero.common.util.superSearch; + +import com.jero.common.util.oConvertUtils; + +/** + * Query 规则 常量 + * @Author Scott + * @Date 2019年02月14日 + */ +public enum QueryRuleEnum { + + GT(">","大于"), + GE(">=","大于等于"), + LT("<","小于"), + LE("<=","小于等于"), + EQ("=","等于"), + NE("!=","不等于"), + IN("IN","包含"), + LIKE("LIKE","全模糊"), + LEFT_LIKE("LEFT_LIKE","左模糊"), + RIGHT_LIKE("RIGHT_LIKE","右模糊"), + SQL_RULES("EXTEND_SQL","自定义SQL片段"); + + private String value; + + private String msg; + + QueryRuleEnum(String value, String msg){ + this.value = value; + this.msg = msg; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public static QueryRuleEnum getByValue(String value){ + if(oConvertUtils.isEmpty(value)) { + return null; + } + for(QueryRuleEnum val :values()){ + if (val.getValue().equals(value)){ + return val; + } + } + return null; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleVo.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleVo.java new file mode 100644 index 00000000..fed539fa --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/superSearch/QueryRuleVo.java @@ -0,0 +1,11 @@ +package com.jero.common.util.superSearch; + +import lombok.Data; + +@Data +public class QueryRuleVo { + + private String field; + private String rule; + private String val; +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiConfig.java new file mode 100644 index 00000000..85493b3d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiConfig.java @@ -0,0 +1,28 @@ +package com.jero.config; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Author: Scott + * @Date: 2018/2/7 + * @description: autopoi 配置类 + */ + +@Configuration +public class AutoPoiConfig { + + /** + * excel注解字典参数支持(导入导出字典值,自动翻译) + * 举例: @Excel(name = "性别", width = 15, dicCode = "sex") + * 1、导出的时候会根据字典配置,把值1,2翻译成:男、女; + * 2、导入的时候,会把男、女翻译成1,2存进数据库; + * @return + */ + @Bean + public ApplicationContextUtil applicationContextUtil() { + return new org.jeecgframework.core.util.ApplicationContextUtil(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiDictConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiDictConfig.java new file mode 100644 index 00000000..52608ae0 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/AutoPoiDictConfig.java @@ -0,0 +1,65 @@ +package com.jero.config; + +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.CommonAPI; +import com.jero.common.system.vo.DictModel; +import com.jero.common.util.oConvertUtils; +import org.jeecgframework.dict.service.AutoPoiDictServiceI; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 描述:AutoPoi Excel注解支持字典参数设置 + * 举例: @Excel(name = "性别", width = 15, dicCode = "sex") + * 1、导出的时候会根据字典配置,把值1,2翻译成:男、女; + * 2、导入的时候,会把男、女翻译成1,2存进数据库; + * + * @Author:scott + * @since:2019-04-09 + * @Version:1.0 + */ +@Slf4j +@Service +public class AutoPoiDictConfig implements AutoPoiDictServiceI { + @Lazy + @Resource + private CommonAPI commonAPI; + + /** + * 通过字典查询easypoi,所需字典文本 + * + * @Author:scott + * @since:2019-04-09 + * @return + */ + @Override + public String[] queryDict(String dicTable, String dicCode, String dicText) { + List dictReplaces = new ArrayList(); + List dictList = null; + // step.1 如果没有字典表则使用系统字典表 + if (oConvertUtils.isEmpty(dicTable)) { + dictList = commonAPI.queryDictItemsByCode(dicCode); + } else { + try { + dicText = oConvertUtils.getString(dicText, dicCode); + dictList = commonAPI.queryTableDictItemsByCode(dicTable, dicText, dicCode); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + } + for (DictModel t : dictList) { + if(t!=null){ + dictReplaces.add(t.getText() + "_" + t.getValue()); + } + } + if (dictReplaces != null && dictReplaces.size() != 0) { + log.info("---AutoPoi--Get_DB_Dict------"+ dictReplaces.toString()); + return dictReplaces.toArray(new String[dictReplaces.size()]); + } + return null; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/JeroCloudCondition.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/JeroCloudCondition.java new file mode 100644 index 00000000..ff33e8c0 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/JeroCloudCondition.java @@ -0,0 +1,22 @@ +package com.jero.config; + +import com.jero.common.constant.CommonConstant; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * 微服务环境加载条件 + */ +public class JeroCloudCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + Object object = context.getEnvironment().getProperty(CommonConstant.CLOUD_SERVER_KEY); + //如果没有服务注册发现的配置 说明是单体应用 + if(object==null){ + return false; + } + return true; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/RestTemplateConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/RestTemplateConfig.java new file mode 100644 index 00000000..45707853 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/RestTemplateConfig.java @@ -0,0 +1,28 @@ +package com.jero.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** +* 优雅的http请求方式RestTemplate +* @Return: +*/ +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(5000);//ms + factory.setConnectTimeout(15000);//ms + return factory; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/StaticConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/StaticConfig.java new file mode 100644 index 00000000..d7eb5054 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/StaticConfig.java @@ -0,0 +1,31 @@ +package com.jero.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 设置静态参数初始化 + */ +@Component +@Data +public class StaticConfig { + + @Value("${jero.oss.accessKey}") + private String accessKeyId; + + @Value("${jero.oss.secretKey}") + private String accessKeySecret; + + @Value(value = "${spring.mail.username}") + private String emailFrom; + + + /*@Bean + public void initStatic() { + DySmsHelper.setAccessKeyId(accessKeyId); + DySmsHelper.setAccessKeySecret(accessKeySecret); + EmailSendMsgHandle.setEmailFrom(emailFrom); + }*/ + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/Swagger2Config.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/Swagger2Config.java new file mode 100644 index 00000000..36bce302 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/Swagger2Config.java @@ -0,0 +1,139 @@ +package com.jero.config; + + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.constant.CommonConstant; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import org.springframework.context.annotation.Import; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @Author scott + */ +@Configuration +@EnableSwagger2 +@EnableKnife4j +@Import(BeanValidatorPluginsConfiguration.class) +public class Swagger2Config implements WebMvcConfigurer { + + /** + * + * 显示swagger-ui.html文档展示页,还必须注入swagger资源: + * + * @param registry + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 + * + * @return Docket + */ + @Bean(value = "defaultApi2") + public Docket defaultApi2() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + //此包路径下的类,才生成接口文档 + .apis(RequestHandlerSelectors.basePackage("com.jero")) + //加了ApiOperation注解的类,才生成接口文档 + .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .paths(PathSelectors.any()) + .build() + .securitySchemes(Collections.singletonList(securityScheme())) + .securityContexts(securityContexts()); + //.globalOperationParameters(setHeaderToken()); + } + + /*** + * oauth2配置 + * 需要增加swagger授权回调地址 + * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html + * @return + */ + @Bean + SecurityScheme securityScheme() { + return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header"); + } + /** + * JWT token + * @return + */ + private List setHeaderToken() { + ParameterBuilder tokenPar = new ParameterBuilder(); + List pars = new ArrayList<>(); + tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); + pars.add(tokenPar.build()); + return pars; + } + + /** + * api文档的详细信息函数,注意这里的注解引用的是哪个 + * + * @return + */ + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + // //大标题 + .title("jero-boot 后台服务API接口文档") + // 版本号 + .version("1.0") +// .termsOfServiceUrl("NO terms of service") + // 描述 + .description("后台API接口") + // 作者 + .contact("JERO团队") + .license("The Apache License, Version 2.0") + .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") + .build(); + } + + /** + * 新增 securityContexts 保持登录状态 + */ + private List securityContexts() { + return new ArrayList( + Collections.singleton(SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("^(?!auth).*$")) + .build()) + ); + } + + private List defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + return new ArrayList( + Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes))); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebConfig.java new file mode 100644 index 00000000..f1406645 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebConfig.java @@ -0,0 +1,62 @@ +package com.jero.config; + +import com.jero.config.filter.cors.CorsFilter; +import com.jero.config.filter.csrf.CsrfFilter; +import com.jero.config.filter.xss.XssFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * @author hzwl + */ +@Configuration +public class WebConfig { + @Value("${jero.xssExcludedPages}") + private List xssExcluded; + + @Value("${jero.notFilter}") + private List notFilter; + + @Value("${jero.originIp}") + private String originIp; + + /** + * 白名单 + */ + @Value("${jero.whiteUrls}") + private List whiteUrls; + + @Bean + public FilterRegistrationBean csrfFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setFilter(new CsrfFilter(whiteUrls)); + registration.addUrlPatterns("/*"); + registration.setName("csrfFilter"); + registration.setOrder(1); + return registration; + } + + @Bean + public FilterRegistrationBean corsFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setFilter(new CorsFilter(originIp,notFilter)); + registration.addUrlPatterns("/*"); + registration.setName("corsFilter"); + registration.setOrder(2); + return registration; + } + + @Bean + public FilterRegistrationBean xssFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + filterRegistrationBean.setFilter(new XssFilter(xssExcluded)); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.setOrder(3); + return filterRegistrationBean; + } + +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebMvcConfiguration.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebMvcConfiguration.java new file mode 100644 index 00000000..bbb76537 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebMvcConfiguration.java @@ -0,0 +1,82 @@ +package com.jero.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +/** + * Spring Boot 2.0 解决跨域问题 + * + * @Author qinfeng + * + */ +@Configuration +public class WebMvcConfiguration implements WebMvcConfigurer { + + @Value("${jero.path.upload}") + private String upLoadPath; + @Value("${jero.path.webapp}") + private String webAppPath; + @Value("${spring.resource.static-locations}") + private String staticLocations; + + /** + * 静态资源的配置 - 使得可以从磁盘中读取 Html、图片、视频、音频等 + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("file:" + upLoadPath + "//", "file:" + webAppPath + "//") + .addResourceLocations(staticLocations.split(",")); + } + + /** + * 方案一: 默认访问根路径跳转 doc.html页面 (swagger文档页面) + * 方案二: 访问根路径改成跳转 index.html页面 (简化部署方案: 可以把前端打包直接放到项目的 webapp,上面的配置) + */ + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("doc.html"); + } + + /** + * 添加Long转json精度丢失是配置 + * @Return: void + */ + @Override + public void configureMessageConverters(List> converters) { + MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + objectMapper.registerModule(simpleModule); + jackson2HttpMessageConverter.setObjectMapper(objectMapper); + converters.add(jackson2HttpMessageConverter); + } + + /** + * SpringBootAdmin的Httptrace不见了 + * https://blog.csdn.net/u013810234/article/details/110097201 + */ + @Bean + public InMemoryHttpTraceRepository getInMemoryHttpTrace(){ + return new InMemoryHttpTraceRepository(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebSocketConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebSocketConfig.java new file mode 100644 index 00000000..fdd07440 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.jero.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/cors/CorsFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/cors/CorsFilter.java new file mode 100644 index 00000000..bb797b9b --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/cors/CorsFilter.java @@ -0,0 +1,90 @@ +package com.jero.config.filter.cors; + + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Objects; + +/** + * @author hzwl + * 设置响应信息 + */ +@WebFilter(urlPatterns = {"/verifyCode/**"}) +public class CorsFilter implements Filter { + + private static final Log LOGGER = LogFactory.getLog(CorsFilter.class); + + private final String originIp; + + private final List notFilter; + + public CorsFilter(String originIp, List notFilter) { + this.originIp = originIp; + this.notFilter = notFilter; + } + + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + + final String origin = ((HttpServletRequest) request).getHeader("Origin"); + //请求头与系统的origin不通则咔嚓 + if (Objects.nonNull(origin) && !originIp.contains(origin)){ + return; + } + //获取请求路径 + String url = req.getRequestURL().toString(); + if (!isMSBrowser(req)){ + for (String name : notFilter) { + //如果包含,不需要判断Origin是否合法 + if(url.contains(name)){ + responseInfo(request, response, chain); + return; + } + } + } + responseInfo(request, response, chain); + } + public boolean isMSBrowser(HttpServletRequest request) { + String[] IEBrowserSignals = {"MSIE", "Trident"}; + String userAgent = request.getHeader("User-Agent"); + for (String signal : IEBrowserSignals) { + if (userAgent.contains(signal)){ + return true; + } + } + return false; + } + private void responseInfo(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setHeader("Access-Control-Allow-Origin", originIp); + httpServletResponse.addHeader("Access-Control-Allow-Headers", "Authorization"); + httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, HEAD, OPTIONS, PUT, DELETE"); + httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); + httpServletResponse.setHeader("Content-Security-Policy", "upgrade-insecure-requests;connect-src *"); + httpServletResponse.setHeader("X-Content-Type-Options", "nosniff"); + httpServletResponse.setHeader("X-XSS-Protection", "1;mode=block"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, Accept, x-auth-token, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, authorization"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/csrf/CsrfFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/csrf/CsrfFilter.java new file mode 100644 index 00000000..28c481dc --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/csrf/CsrfFilter.java @@ -0,0 +1,124 @@ +package com.jero.config.filter.csrf; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.jero.common.api.vo.Result; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * 描述:跨站过滤器 + * + * @Author: 马志朝 + * @Date: 2021/4/16 14:09 + */ + +public class CsrfFilter implements Filter { + /** + * LOGGER + */ + private static final Log LOGGER = LogFactory.getLog(CsrfFilter.class); + + private final List whiteUrls; + + /** + * size + */ + private int size = 0; + + public CsrfFilter(List whiteUrls) { + this.whiteUrls = whiteUrls; + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + size = whiteUrls.size(); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException{ + //try { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + // 获取请求url地址 + String url = req.getRequestURL().toString(); + // 获取来源 + String referurl = req.getHeader("Referer"); + if(isWhiteReq(referurl)){ + chain.doFilter(request, response); + }else{ + String log = ""; + String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String ip = getIp(req); + log = "跨站请求---->>>" + ip + "||" + date + "||" + referurl + "||" + url; + LOGGER.warn(log); + //发送错误信息 + JSONObject json = JSONUtil.parseObj(Result.error("监测到跨站请求,请求失败"), false); + res.setCharacterEncoding("UTF-8"); + res.setContentType("application/json; charset=utf-8"); + PrintWriter out = res.getWriter(); + out.append(json.toStringPretty()); + } + //} catch (Exception e) { + // LOGGER.error("doFilter", e); + //} + } + /** + * 判断是否是白名单 + */ + private boolean isWhiteReq(String referUrl) { + if (referUrl == null || "".equals(referUrl) || size == 0) { + return true; + } else { + String refHost = ""; + referUrl = referUrl.toLowerCase(); + if (referUrl.startsWith("http://")) { + refHost = referUrl.substring(7); + } else if (referUrl.startsWith("https://")) { + refHost = referUrl.substring(8); + } + for (String urlTemp : whiteUrls) { + if (refHost.contains(urlTemp.toLowerCase())) { + return true; + } + } + } + return false; + } + /** + * 获取登录用户IP地址 + * @param request + * @return + */ + public String getIp(HttpServletRequest request) { + 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("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + if (ip.equals("0:0:0:0:0:0:0:1")) { + ip = "localhost"; + } + return ip; + } + @Override + public void destroy() { + + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/HTMLFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/HTMLFilter.java new file mode 100644 index 00000000..e067d1d9 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/HTMLFilter.java @@ -0,0 +1,446 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.jero.config.filter.xss; + +import cn.hutool.core.lang.Console; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author hzwl + */ +public final class HTMLFilter { + private static final int REGEX_FLAGS_SI = 34; + private static final Pattern P_COMMENTS = Pattern.compile("", 32); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", 34); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", 32); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", 34); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", 34); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", 34); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", 34); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", 34); + 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("(>|^)([^<]+?)(<|$)", 32); + 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("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']"); + 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("<>"); + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap(); + private final Map> vAllowed; + private final Map vTagCounts; + private final String[] vSelfClosingTags; + private final String[] vNeedClosingTags; + private final String[] vDisallowed; + private final String[] vProtocolAtts; + private final String[] vAllowedProtocols; + private final String[] vRemoveBlanks; + private final String[] vAllowedEntities; + private final boolean stripComment; + private final boolean encodeQuotes; + private boolean vDebug; + private final boolean alwaysMakeTags; + + public HTMLFilter() { + this.vTagCounts = new HashMap(); + this.vDebug = false; + this.vAllowed = new HashMap(); + ArrayList a_atts = new ArrayList(); + a_atts.add("href"); + a_atts.add("target"); + this.vAllowed.put("a", a_atts); + ArrayList img_atts = new ArrayList(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + this.vAllowed.put("img", img_atts); + ArrayList no_atts = new ArrayList(); + this.vAllowed.put("b", no_atts); + this.vAllowed.put("strong", no_atts); + this.vAllowed.put("i", no_atts); + this.vAllowed.put("em", no_atts); + this.vSelfClosingTags = new String[]{"img"}; + this.vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"}; + this.vDisallowed = new String[0]; + this.vAllowedProtocols = new String[]{"http", "mailto", "https"}; + this.vProtocolAtts = new String[]{"src", "href"}; + this.vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"}; + this.vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"}; + this.stripComment = true; + this.encodeQuotes = true; + this.alwaysMakeTags = true; + } + + public HTMLFilter(boolean debug) { + this(); + this.vDebug = debug; + } + + public HTMLFilter(Map conf) { + this.vTagCounts = new HashMap(); + this.vDebug = false; + + 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"; + + this.vAllowed = Collections.unmodifiableMap((HashMap)conf.get("vAllowed")); + this.vSelfClosingTags = (String[])((String[])conf.get("vSelfClosingTags")); + this.vNeedClosingTags = (String[])((String[])conf.get("vNeedClosingTags")); + this.vDisallowed = (String[])((String[])conf.get("vDisallowed")); + this.vAllowedProtocols = (String[])((String[])conf.get("vAllowedProtocols")); + this.vProtocolAtts = (String[])((String[])conf.get("vProtocolAtts")); + this.vRemoveBlanks = (String[])((String[])conf.get("vRemoveBlanks")); + this.vAllowedEntities = (String[])((String[])conf.get("vAllowedEntities")); + this.stripComment = conf.containsKey("stripComment") ? (Boolean)conf.get("stripComment") : true; + this.encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean)conf.get("encodeQuotes") : true; + this.alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean)conf.get("alwaysMakeTags") : true; + } + + private void reset() { + this.vTagCounts.clear(); + } + + private void debug(String msg) { + if (this.vDebug) { + Console.log(msg); + } + + } + + public static String chr(int decimal) { + return String.valueOf((char)decimal); + } + + public static String htmlSpecialChars(String s) { +// String result = regexReplace(P_AMP, "&", s); + String result = regexReplace(P_QUOTE, """, s); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + public String filter(String input) { + this.reset(); + this.debug("************************************************"); + this.debug(" INPUT: " + input); + String s = this.escapeComments(input); + this.debug(" escapeComments: " + s); + s = this.balanceHTML(s); + this.debug(" balanceHTML: " + s); + s = this.checkTags(s); + this.debug(" checkTags: " + s); + s = this.processRemoveBlanks(s); + this.debug("processRemoveBlanks: " + s); +// s = this.validateEntities(s); +// this.debug(" validateEntites: " + s); + this.debug("************************************************\n\n"); + return s; + } + + public boolean isAlwaysMakeTags() { + return this.alwaysMakeTags; + } + + public boolean isStripComments() { + return this.stripComment; + } + + private String escapeComments(String s) { + Matcher m = P_COMMENTS.matcher(s); + StringBuffer buf = new StringBuffer(); + if (m.find()) { + String match = m.group(1); + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + + m.appendTail(buf); + return buf.toString(); + } + + private String balanceHTML(String s) { + if (this.alwaysMakeTags) { +/* s = regexReplace(P_END_ARROW, "", s); + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s);*/ + } else { + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) { + Matcher m = P_TAGS.matcher(s); + StringBuffer buf = new StringBuffer(); + + while(m.find()) { + String replaceStr = m.group(1); + replaceStr = this.processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + + m.appendTail(buf); + StringBuilder sBuilder = new StringBuilder(buf.toString()); + Iterator var5 = this.vTagCounts.keySet().iterator(); + + while(var5.hasNext()) { + String key = (String)var5.next(); + + for(int ii = 0; ii < (Integer)this.vTagCounts.get(key); ++ii) { + sBuilder.append(""); + } + } + + s = sBuilder.toString(); + return s; + } + + private String processRemoveBlanks(String s) { + String result = s; + String[] var3 = this.vRemoveBlanks; + int var4 = var3.length; + + for(int var5 = 0; var5 < var4; ++var5) { + String tag = var3[var5]; + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + + result = regexReplace((Pattern)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((Pattern)P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(Pattern regex_pattern, String replacement, String s) { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(String s) { + Matcher m = P_END_TAG.matcher(s); + String name; + if (m.find()) { + name = m.group(1).toLowerCase(); + if (this.allowed(name) && !inArray(name, this.vSelfClosingTags) && this.vTagCounts.containsKey(name)) { + this.vTagCounts.put(name, (Integer)this.vTagCounts.get(name) - 1); + return ""; + } + } + + m = P_START_TAG.matcher(s); + if (!m.find()) { + m = P_COMMENT.matcher(s); + return !this.stripComment && m.find() ? "<" + m.group() + ">" : ""; + } else { + name = m.group(1).toLowerCase(); + String body = m.group(2); + String ending = m.group(3); + if (!this.allowed(name)) { + return ""; + } else { + StringBuilder params = new StringBuilder(); + Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + List paramNames = new ArrayList(); + ArrayList paramValues = new ArrayList(); + + while(m2.find()) { + paramNames.add(m2.group(1)); + paramValues.add(m2.group(3)); + } + + while(m3.find()) { + paramNames.add(m3.group(1)); + paramValues.add(m3.group(3)); + } + + for(int ii = 0; ii < paramNames.size(); ++ii) { + String paramName = ((String)paramNames.get(ii)).toLowerCase(); + String paramValue = (String)paramValues.get(ii); + if (this.allowedAttribute(name, paramName)) { + if (inArray(paramName, this.vProtocolAtts)) { + paramValue = this.processParamProtocol(paramValue); + } + + params.append(' ').append(paramName).append("=\"").append(paramValue).append("\""); + } + } + + if (inArray(name, this.vSelfClosingTags)) { + ending = " /"; + } + + if (inArray(name, this.vNeedClosingTags)) { + ending = ""; + } + + if (ending != null && ending.length() >= 1) { + ending = " /"; + } else if (this.vTagCounts.containsKey(name)) { + this.vTagCounts.put(name, (Integer)this.vTagCounts.get(name) + 1); + } else { + this.vTagCounts.put(name, 1); + } + + return "<" + name + params + ending + ">"; + } + } + } + + private String processParamProtocol(String s) { + s = this.decodeEntities(s); + Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) { + String protocol = m.group(1); + if (!inArray(protocol, this.vAllowedProtocols)) { + 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); + + String match; + int decimal; + while(m.find()) { + match = m.group(1); + decimal = Integer.decode(match); + 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()) { + match = m.group(1); + decimal = Integer.valueOf(match, 16); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + + m.appendTail(buf); + s = buf.toString(); + buf = new StringBuffer(); +// m = P_ENCODE.matcher(s); + + while(m.find()) { + match = m.group(1); + decimal = Integer.valueOf(match, 16); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + + m.appendTail(buf); + s = buf.toString(); + s = this.validateEntities(s); + return s; + } + + private String validateEntities(String s) { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_ENTITIES.matcher(s); + + while(m.find()) { + String one = m.group(1); + String two = m.group(2); + m.appendReplacement(buf, Matcher.quoteReplacement(this.checkEntity(one, two))); + } + + m.appendTail(buf); + return this.encodeQuotes(buf.toString()); + } + + private String encodeQuotes(String s) { + if (!this.encodeQuotes) { + return s; + } else { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + + while(m.find()) { + String one = m.group(1); + String two = m.group(2); + String three = m.group(3); + m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, """, two) + three)); + } + + m.appendTail(buf); + return buf.toString(); + } + } + + private String checkEntity(String preamble, String term) { + return ";".equals(term) && this.isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(String entity) { + return inArray(entity, this.vAllowedEntities); + } + + private static boolean inArray(String s, String[] array) { + String[] var2 = array; + int var3 = array.length; + + for(int var4 = 0; var4 < var3; ++var4) { + String item = var2[var4]; + if (item != null && item.equals(s)) { + return true; + } + } + + return false; + } + + private boolean allowed(String name) { + return (this.vAllowed.isEmpty() || this.vAllowed.containsKey(name)) && !inArray(name, this.vDisallowed); + } + + private boolean allowedAttribute(String name, String paramName) { + return this.allowed(name) && (this.vAllowed.isEmpty() || ((List)this.vAllowed.get(name)).contains(paramName)); + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/SqlFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/SqlFilter.java new file mode 100644 index 00000000..eb9ea6db --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/SqlFilter.java @@ -0,0 +1,34 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.jero.config.filter.xss; + +import org.apache.commons.lang.StringUtils; + +public class SqlFilter { + public SqlFilter() { + } + + public static String sqlInject(String str) { + if (StringUtils.isBlank(str)) { + return null; + } else { + str = StringUtils.replace(str, "\\n", "Line_Break"); + str = StringUtils.replace(str, "\\", ""); + String[] keywords = new String[]{"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"}; + String[] var2 = keywords; + int var3 = keywords.length; + + for(int var4 = 0; var4 < var3; ++var4) { + String keyword = var2[var4]; + if (StringUtils.indexOfIgnoreCase(str, keyword + " ") != -1) { + throw new RuntimeException("包含非法字符"); + } + } + str = StringUtils.replace(str, "Line_Break", "\\n"); + return str; + } + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssFilter.java new file mode 100644 index 00000000..dca9b096 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssFilter.java @@ -0,0 +1,57 @@ +package com.jero.config.filter.xss; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.List; + +/** + * @author hzwl + */ +public class XssFilter implements Filter { + private final List excludedPages; + + public XssFilter(List excludedPages) { + this.excludedPages=excludedPages; + } + + @Override + public void init(FilterConfig config) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + boolean isExcludedPage = false; + for (String excludedPage : excludedPages) { + if (((HttpServletRequest)request).getRequestURI().contains(excludedPage)) { + isExcludedPage = true; + break; + } + } + if (isExcludedPage) { + chain.doFilter(request, response); + } else { + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest)request); + chain.doFilter(xssRequest, response); + } + + } + + @Override + public void destroy() { + } + + + public static String filterNull(Object o) { + return o != null && !"null".equals(o.toString()) ? o.toString().trim() : ""; + } + + public static boolean isNotEmpty(Object o) { + if (o == null) { + return false; + } else { + return !"".equals(filterNull(o.toString())); + } + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssHttpServletRequestWrapper.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssHttpServletRequestWrapper.java new file mode 100644 index 00000000..7e554c1f --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/filter/xss/XssHttpServletRequestWrapper.java @@ -0,0 +1,134 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.jero.config.filter.xss; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author hzwl + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + HttpServletRequest orgRequest; + private static final HTMLFilter HTML_FILTER = new HTMLFilter(); + private static final SqlFilter sqlFilter = new SqlFilter(); + + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + this.orgRequest = request; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + String type = super.getHeader("Content-Type"); + if (StringUtils.indexOfIgnoreCase(type, "application/json") < 0) { + return super.getInputStream(); + } else { + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isBlank(json)) { + return super.getInputStream(); + } else { + json = this.xssSqlEncode(json); + final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8")); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return true; + } + @Override + public boolean isReady() { + return true; + } + @Override + public void setReadListener(ReadListener readListener) { + } + @Override + public int read() throws IOException { + return bis.read(); + } + }; + } + } + } + + @Override + public String getParameter(String name) { + String value = super.getParameter(this.xssSqlEncode(name)); + if (StringUtils.isNotBlank(value)) { + value = this.xssSqlEncode(value); + } + + return value; + } + + @Override + public String[] getParameterValues(String name) { + String[] parameters = super.getParameterValues(name); + if (parameters != null && parameters.length != 0) { + for(int i = 0; i < parameters.length; ++i) { + parameters[i] = this.xssSqlEncode(parameters[i]); + } + + return parameters; + } else { + return null; + } + } + + @Override + public Map getParameterMap() { + Map map = new LinkedHashMap(); + Map parameters = super.getParameterMap(); + Iterator var3 = parameters.keySet().iterator(); + + while(var3.hasNext()) { + String key = (String)var3.next(); + String[] values = (String[])parameters.get(key); + + for(int i = 0; i < values.length; ++i) { + values[i] = this.xssSqlEncode(values[i]); + } + + map.put(key, values); + } + + return map; + } + + @Override + public String getHeader(String name) { + String value = super.getHeader(this.xssSqlEncode(name)); + if (StringUtils.isNotBlank(value)) { + value = this.xssSqlEncode(value); + } + + return value; + } + + private String xssSqlEncode(String input) { + input=input.replaceAll("%5b","[").replaceAll("%5d","]"); + String htmlOutput= HTML_FILTER.filter(input); + return SqlFilter.sqlInject(htmlOutput); + } + + public HttpServletRequest getOrgRequest() { + return this.orgRequest; + } + + public static HttpServletRequest getOrgRequest(HttpServletRequest request) { + return request instanceof XssHttpServletRequestWrapper ? ((XssHttpServletRequestWrapper)request).getOrgRequest() : request; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/JeroTenantParser.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/JeroTenantParser.java new file mode 100644 index 00000000..4a3f856d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/JeroTenantParser.java @@ -0,0 +1,130 @@ +package com.jero.config.mybatis; + +import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser; +import net.sf.jsqlparser.expression.BinaryExpression; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Parenthesis; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.*; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.select.*; + +import java.util.List; + +/** + * 复写租户条件 + */ +public class JeroTenantParser extends TenantSqlParser { + + /** + * @param expression + * @param table + * @return + */ + protected Expression processTableAlias(Expression expression, Table table) { + String tableAliasName; + if (table.getAlias() == null) { + tableAliasName = table.getName(); + } else { + tableAliasName = table.getAlias().getName(); + } + + // in + if (expression instanceof InExpression) { + InExpression in = (InExpression) expression; + if (in.getLeftExpression() instanceof Column) { + setTableAliasNameForColumn((Column) in.getLeftExpression(), tableAliasName); + } + + // 比较操作 + } else if (expression instanceof BinaryExpression) { + BinaryExpression compare = (BinaryExpression) expression; + if (compare.getLeftExpression() instanceof Column) { + setTableAliasNameForColumn((Column) compare.getLeftExpression(), tableAliasName); + } else if (compare.getRightExpression() instanceof Column) { + setTableAliasNameForColumn((Column) compare.getRightExpression(), tableAliasName); + } + + // between + } else if (expression instanceof Between) { + Between between = (Between) expression; + if (between.getLeftExpression() instanceof Column) { + setTableAliasNameForColumn((Column) between.getLeftExpression(), tableAliasName); + } + } + return expression; + } + + private void setTableAliasNameForColumn(Column column, String tableAliasName) { + column.setColumnName(tableAliasName + "." + column.getColumnName()); + } + + /** + * 默认是按 tenant_id=1 按等于条件追加 + * + * @param currentExpression 现有的条件:比如你原来的sql查询条件 + * @param table + * @return + */ + @Override + protected Expression builderExpression(Expression currentExpression, Table table) { + final Expression tenantExpression = this.getTenantHandler().getTenantId(true); + Expression appendExpression; + if (!(tenantExpression instanceof SupportsOldOracleJoinSyntax)) { + appendExpression = new EqualsTo(); + ((EqualsTo) appendExpression).setLeftExpression(this.getAliasColumn(table)); + ((EqualsTo) appendExpression).setRightExpression(tenantExpression); + } else { + appendExpression = processTableAlias(tenantExpression, table); + } + if (currentExpression == null) { + return appendExpression; + } + if (currentExpression instanceof BinaryExpression) { + BinaryExpression binaryExpression = (BinaryExpression) currentExpression; + if (binaryExpression.getLeftExpression() instanceof FromItem) { + processFromItem((FromItem) binaryExpression.getLeftExpression()); + } + if (binaryExpression.getRightExpression() instanceof FromItem) { + processFromItem((FromItem) binaryExpression.getRightExpression()); + } + } else if (currentExpression instanceof InExpression) { + InExpression inExp = (InExpression) currentExpression; + ItemsList rightItems = inExp.getRightItemsList(); + if (rightItems instanceof SubSelect) { + processSelectBody(((SubSelect) rightItems).getSelectBody()); + } + } + if (currentExpression instanceof OrExpression) { + return new AndExpression(new Parenthesis(currentExpression), appendExpression); + } else { + return new AndExpression(currentExpression, appendExpression); + } + } + + @Override + protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) { + FromItem fromItem = plainSelect.getFromItem(); + if (fromItem instanceof Table) { + Table fromTable = (Table) fromItem; + if (!this.getTenantHandler().doTableFilter(fromTable.getName())) { + plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable)); + if (addColumn) { + plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.getTenantHandler().getTenantIdColumn()))); + } + } + } else { + processFromItem(fromItem); + } + List joins = plainSelect.getJoins(); + if (joins != null && joins.size() > 0) { + joins.forEach(j -> { + processJoin(j); + processFromItem(j.getRightItem()); + }); + } + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisInterceptor.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisInterceptor.java new file mode 100644 index 00000000..8af57233 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisInterceptor.java @@ -0,0 +1,161 @@ +package com.jero.config.mybatis; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.binding.MapperMethod.ParamMap; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.plugin.*; +import org.apache.shiro.SecurityUtils; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.util.Date; +import java.util.Properties; + +/** + * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间 + * @Author scott + * @Date 2019-01-19 + * + */ +@Slf4j +@Component +@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) }) +public class MybatisInterceptor implements Interceptor { + + @Override + public Object intercept(Invocation invocation) throws Throwable { + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; + String sqlId = mappedStatement.getId(); + log.debug("------sqlId------" + sqlId); + SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); + Object parameter = invocation.getArgs()[1]; + log.debug("------sqlCommandType------" + sqlCommandType); + + if (parameter == null) { + return invocation.proceed(); + } + if (SqlCommandType.INSERT == sqlCommandType) { + LoginUser sysUser = this.getLoginUser(); + Field[] fields = oConvertUtils.getAllFields(parameter); + for (Field field : fields) { + log.debug("------field.name------" + field.getName()); + try { + if ("createBy".equals(field.getName())) { + field.setAccessible(true); + Object local_createBy = field.get(parameter); + field.setAccessible(false); + if (local_createBy == null || local_createBy.equals("")) { + if (sysUser != null) { + // 登录人账号 + field.setAccessible(true); + field.set(parameter, sysUser.getUsername()); + field.setAccessible(false); + } + } + } + // 注入创建时间 + if ("createTime".equals(field.getName())) { + field.setAccessible(true); + Object local_createDate = field.get(parameter); + field.setAccessible(false); + if (local_createDate == null || local_createDate.equals("")) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + } + //注入部门编码 + if ("sysOrgCode".equals(field.getName())) { + field.setAccessible(true); + Object local_sysOrgCode = field.get(parameter); + field.setAccessible(false); + if (local_sysOrgCode == null || local_sysOrgCode.equals("")) { + // 获取登录用户信息 + if (sysUser != null) { + field.setAccessible(true); + field.set(parameter, sysUser.getOrgCode()); + field.setAccessible(false); + } + } + } + } catch (Exception e) { + } + } + } + if (SqlCommandType.UPDATE == sqlCommandType) { + LoginUser sysUser = this.getLoginUser(); + Field[] fields = null; + if (parameter instanceof ParamMap) { + ParamMap p = (ParamMap) parameter; + //update-begin-author:scott date:20190729 for:批量更新报错issues/IZA3Q-- + if (p.containsKey("et")) { + parameter = p.get("et"); + } else { + parameter = p.get("param1"); + } + //update-end-author:scott date:20190729 for:批量更新报错issues/IZA3Q- + + //update-begin-author:scott date:20190729 for:更新指定字段时报错 issues/#516- + if (parameter == null) { + return invocation.proceed(); + } + //update-end-author:scott date:20190729 for:更新指定字段时报错 issues/#516- + + fields = oConvertUtils.getAllFields(parameter); + } else { + fields = oConvertUtils.getAllFields(parameter); + } + + for (Field field : fields) { + log.debug("------field.name------" + field.getName()); + try { + if ("updateBy".equals(field.getName())) { + //获取登录用户信息 + if (sysUser != null) { + // 登录账号 + field.setAccessible(true); + field.set(parameter, sysUser.getUsername()); + field.setAccessible(false); + } + } + if ("updateTime".equals(field.getName())) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + // TODO Auto-generated method stub + } + + //update-begin--Author:scott Date:20191213 for:关于使用Quzrtz 开启线程任务, #465 + private LoginUser getLoginUser() { + LoginUser sysUser = null; + try { + sysUser = SecurityUtils.getSubject().getPrincipal() != null ? (LoginUser) SecurityUtils.getSubject().getPrincipal() : null; + } catch (Exception e) { + //e.printStackTrace(); + sysUser = null; + } + return sysUser; + } + //update-end--Author:scott Date:20191213 for:关于使用Quzrtz 开启线程任务, #465 + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisPlusConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisPlusConfig.java new file mode 100644 index 00000000..d90d84df --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/MybatisPlusConfig.java @@ -0,0 +1,142 @@ +package com.jero.config.mybatis; + +import com.baomidou.mybatisplus.core.parser.ISqlParser; +import com.baomidou.mybatisplus.core.parser.ISqlParserFilter; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler; +import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.schema.Column; +import org.apache.ibatis.reflection.MetaObject; +import com.jero.common.util.oConvertUtils; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * 单数据源配置(jero.datasource.open = false时生效) + * @Author zhoujf + * + */ +@Configuration +@MapperScan(value={"com.jero.**.mapper*"}) +public class MybatisPlusConfig { + + /** + * tenant_id 字段名 + */ + public static final String tenant_field = "tenant_id"; + + /** + * 有哪些表需要做多租户 这些表需要添加一个字段 ,字段名和tenant_field对应的值一样 + */ + private static final List tenantTable = new ArrayList(); + /** + * ddl 关键字 判断不走多租户的sql过滤 + */ + private static final List DDL_KEYWORD = new ArrayList(); + static { + tenantTable.add("jee_bug_danbiao"); + DDL_KEYWORD.add("alter"); + } + + /** + * 多租户属于 SQL 解析部分,依赖 MP 分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor paginationInterceptor = new PaginationInterceptor().setLimit(-1); + //多租户配置 配置后每次执行sql会走一遍他的转化器 如果不需要多租户功能 可以将其注释 + tenantConfig(paginationInterceptor); + return paginationInterceptor; + } + + /** + * 多租户的配置 + * @param paginationInterceptor + */ + private void tenantConfig(PaginationInterceptor paginationInterceptor){ + /* + * 【测试多租户】 SQL 解析处理拦截器
+ * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )
+ */ + List sqlParserList = new ArrayList<>(); + TenantSqlParser tenantSqlParser = new JeroTenantParser(); + tenantSqlParser.setTenantHandler(new TenantHandler() { + + @Override + public Expression getTenantId(boolean select) { + String tenant_id = oConvertUtils.getString(TenantContext.getTenant(),"0"); + return new LongValue(tenant_id); + } + @Override + public String getTenantIdColumn() { + return tenant_field; + } + + @Override + public boolean doTableFilter(String tableName) { + //true则不加租户条件查询 false则加 + // return excludeTable.contains(tableName); + if(tenantTable.contains(tableName)){ + return false; + } + return true; + } + + private Expression in(String ids){ + final InExpression inExpression = new InExpression(); + inExpression.setLeftExpression(new Column(getTenantIdColumn())); + final ExpressionList itemsList = new ExpressionList(); + final List inValues = new ArrayList<>(2); + for(String id:ids.split(",")){ + inValues.add(new LongValue(id)); + } + itemsList.setExpressions(inValues); + inExpression.setRightItemsList(itemsList); + return inExpression; + } + + }); + + sqlParserList.add(tenantSqlParser); + paginationInterceptor.setSqlParserList(sqlParserList); + paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() { + @Override + public boolean doFilter(MetaObject metaObject) { + String sql = (String) metaObject.getValue(PluginUtils.DELEGATE_BOUNDSQL_SQL); + for(String tableName: tenantTable){ + String sql_lowercase = sql.toLowerCase(); + if(sql_lowercase.indexOf(tableName.toLowerCase())>=0){ + for(String key: DDL_KEYWORD){ + if(sql_lowercase.indexOf(key)>=0){ + return true; + } + } + return false; + } + } + /*if ("mapper路径.方法名".equals(ms.getId())) { + //使用这种判断也可以避免走此过滤器 + return true; + }*/ + return true; + } + }); + } +// /** +// * mybatis-plus SQL执行效率插件【生产环境可以关闭】 +// */ +// @Bean +// public PerformanceInterceptor performanceInterceptor() { +// return new PerformanceInterceptor(); +// } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/TenantContext.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/TenantContext.java new file mode 100644 index 00000000..035e6937 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/mybatis/TenantContext.java @@ -0,0 +1,25 @@ +package com.jero.config.mybatis; + +import lombok.extern.slf4j.Slf4j; + +/** + * 多租户 tenant_id存储器 + */ +@Slf4j +public class TenantContext { + + private static ThreadLocal currentTenant = new ThreadLocal<>(); + + public static void setTenant(String tenant) { + log.debug(" setting tenant to " + tenant); + currentTenant.set(tenant); + } + + public static String getTenant() { + return currentTenant.get(); + } + + public static void clear(){ + currentTenant.remove(); + } +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/MinioConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/MinioConfig.java new file mode 100644 index 00000000..490da96a --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/MinioConfig.java @@ -0,0 +1,38 @@ +package com.jero.config.oss; + +import lombok.extern.slf4j.Slf4j; +import com.jero.common.util.MinioUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Minio文件上传配置文件 + */ +@Slf4j +@Configuration +public class MinioConfig { + @Value(value = "${jero.minio.minio_url}") + private String minioUrl; + @Value(value = "${jero.minio.minio_name}") + private String minioName; + @Value(value = "${jero.minio.minio_pass}") + private String minioPass; + @Value(value = "${jero.minio.bucketName}") + private String bucketName; + + @Bean + public void initMinio(){ + if(!minioUrl.startsWith("http")){ + minioUrl = "http://" + minioUrl; + } + if(!minioUrl.endsWith("/")){ + minioUrl = minioUrl.concat("/"); + } + MinioUtil.setMinioUrl(minioUrl); + MinioUtil.setMinioName(minioName); + MinioUtil.setMinioPass(minioPass); + MinioUtil.setBucketName(bucketName); + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/OssConfiguration.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/OssConfiguration.java new file mode 100644 index 00000000..1913c69c --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/oss/OssConfiguration.java @@ -0,0 +1,34 @@ +package com.jero.config.oss; + +import com.jero.common.util.oss.OssBootUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 云存储 配置 + */ +@Configuration +public class OssConfiguration { + + @Value("${jero.oss.endpoint}") + private String endpoint; + @Value("${jero.oss.accessKey}") + private String accessKeyId; + @Value("${jero.oss.secretKey}") + private String accessKeySecret; + @Value("${jero.oss.bucketName}") + private String bucketName; + @Value("${jero.oss.staticDomain}") + private String staticDomain; + + + @Bean + public void initOssBootConfiguration() { + OssBootUtil.setEndPoint(endpoint); + OssBootUtil.setAccessKeyId(accessKeyId); + OssBootUtil.setAccessKeySecret(accessKeySecret); + OssBootUtil.setBucketName(bucketName); + OssBootUtil.setStaticDomain(staticDomain); + } +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/redis/RedisConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/redis/RedisConfig.java new file mode 100644 index 00000000..0a189bff --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/redis/RedisConfig.java @@ -0,0 +1,112 @@ +package com.jero.config.redis; + +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.constant.CacheConstant; +import org.springframework.cache.CacheManager; +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.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.*; + +import javax.annotation.Resource; +import java.time.Duration; + +import static java.util.Collections.singletonMap; + +/** +* 开启缓存支持 +* @Return: +*/ +@Slf4j +@EnableCaching +@Configuration +public class RedisConfig extends CachingConfigurerSupport { + + @Resource + private LettuceConnectionFactory lettuceConnectionFactory; + +// /** +// * @description 自定义的缓存key的生成策略 若想使用这个key +// * 只需要讲注解上keyGenerator的值设置为keyGenerator即可
+// * @return 自定义策略生成的key +// */ +// @Override +// @Bean +// public KeyGenerator keyGenerator() { +// return new KeyGenerator() { +// @Override +// public Object generate(Object target, Method method, Object... params) { +// StringBuilder sb = new StringBuilder(); +// sb.append(target.getClass().getName()); +// sb.append(method.getDeclaringClass().getName()); +// Arrays.stream(params).map(Object::toString).forEach(sb::append); +// return sb.toString(); +// } +// }; +// } + + /** + * RedisTemplate配置 + * + * @param lettuceConnectionFactory + * @return + */ + @Bean + public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { + log.info(" --- redis config init --- "); + // 设置序列化 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, Visibility.ANY); + om.enableDefaultTyping(DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + // 配置redisTemplate + RedisTemplate redisTemplate = new RedisTemplate(); + redisTemplate.setConnectionFactory(lettuceConnectionFactory); + RedisSerializer stringSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringSerializer);// key序列化 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化 + redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化 + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化 + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + /** + * 缓存配置管理器 + * + * @param factory + * @return + */ + @Bean + public CacheManager cacheManager(LettuceConnectionFactory factory) { + // 配置序列化(缓存默认有效期 6小时) + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(6)); + RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); + + // 以锁写入的方式创建RedisCacheWriter对象 + //RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory); + // 创建默认缓存配置对象 + /* 默认配置,设置缓存有效期 1小时*/ + //RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)); + /* 自定义配置test:demo 的超时时间为 5分钟*/ + RedisCacheManager cacheManager = RedisCacheManager.builder(RedisCacheWriter.lockingRedisCacheWriter(factory)).cacheDefaults(redisCacheConfiguration) + .withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues())) + .withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_RANKING, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues())) + .withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_PAGE_LIST, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues())) + .transactionAware().build(); + return cacheManager; + } + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/JwtToken.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/JwtToken.java new file mode 100644 index 00000000..a632fbc1 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/JwtToken.java @@ -0,0 +1,28 @@ +package com.jero.config.shiro; + +import org.apache.shiro.authc.AuthenticationToken; + +/** + * @Author Scott + * @create 2018-07-12 15:19 + * @desc + **/ +public class JwtToken implements AuthenticationToken { + + private static final long serialVersionUID = 1L; + private String token; + + public JwtToken(String token) { + this.token = token; + } + + @Override + public Object getPrincipal() { + return token; + } + + @Override + public Object getCredentials() { + return token; + } +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java new file mode 100644 index 00000000..3ebbdd6d --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java @@ -0,0 +1,252 @@ +package com.jero.config.shiro; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.crazycake.shiro.IRedisManager; +import org.crazycake.shiro.RedisCacheManager; +import org.crazycake.shiro.RedisClusterManager; +import org.crazycake.shiro.RedisManager; +import com.jero.common.constant.CommonConstant; +import com.jero.common.util.oConvertUtils; +import com.jero.config.shiro.filters.CustomShiroFilterFactoryBean; +import com.jero.config.shiro.filters.JwtFilter; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +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 org.springframework.context.annotation.DependsOn; +import org.springframework.core.env.Environment; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.util.StringUtils; +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.JedisCluster; + +import javax.annotation.Resource; +import javax.servlet.Filter; +import java.util.*; + +/** + * @author: Scott + * @date: 2018/2/7 + * @description: shiro 配置类 + */ + +@Slf4j +@Configuration +public class ShiroConfig { + + @Value("${jero.shiro.excludeUrls}") + private String excludeUrls; + @Resource + LettuceConnectionFactory lettuceConnectionFactory; + @Autowired + private Environment env; + + + /** + * Filter Chain定义说明 + * + * 1、一个URL可以配置多个Filter,使用逗号分隔 + * 2、当设置多个过滤器时,全部验证通过,才视为通过 + * 3、部分过滤器可指定参数,如perms,roles + */ + @Bean("shiroFilter") + public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { + CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + // 拦截器 + Map filterChainDefinitionMap = new LinkedHashMap(); + if(oConvertUtils.isNotEmpty(excludeUrls)){ + String[] permissionUrl = excludeUrls.split(","); + for(String url : permissionUrl){ + filterChainDefinitionMap.put(url,"anon"); + } + } + // 配置不会被拦截的链接 顺序判断 + filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); //cas验证登录 + filterChainDefinitionMap.put("/sys/randomImage/**", "anon"); //登录验证码接口排除 + filterChainDefinitionMap.put("/sys/checkCaptcha", "anon"); //登录验证码接口排除 + filterChainDefinitionMap.put("/sys/getRSAPublicKey", "anon"); //获取RSA公钥接口排除 + filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除 + filterChainDefinitionMap.put("/sys/mLogin", "anon"); //登录接口排除 + filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除 + filterChainDefinitionMap.put("/sys/thirdLogin/**", "anon"); //第三方登录 + filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串 + filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码 + filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//手机登录 + filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//校验用户是否存在 + filterChainDefinitionMap.put("/sys/user/register", "anon");//用户注册 + filterChainDefinitionMap.put("/sys/user/querySysUser", "anon");//根据手机号获取用户信息 + filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");//用户忘记密码验证手机号 + filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");//用户更改密码 + filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码 + filterChainDefinitionMap.put("/sys/common/static/**", "anon");//图片预览 &下载文件不限制token + filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览 + filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件 + filterChainDefinitionMap.put("/", "anon"); + filterChainDefinitionMap.put("/doc.html", "anon"); + filterChainDefinitionMap.put("/**/*.js", "anon"); + filterChainDefinitionMap.put("/**/*.css", "anon"); + filterChainDefinitionMap.put("/**/*.html", "anon"); + filterChainDefinitionMap.put("/**/*.svg", "anon"); + filterChainDefinitionMap.put("/**/*.pdf", "anon"); + filterChainDefinitionMap.put("/**/*.jpg", "anon"); + filterChainDefinitionMap.put("/**/*.png", "anon"); + filterChainDefinitionMap.put("/**/*.ico", "anon"); + + filterChainDefinitionMap.put("/**/*.ttf", "anon"); + filterChainDefinitionMap.put("/**/*.woff", "anon"); + filterChainDefinitionMap.put("/**/*.woff2", "anon"); + + filterChainDefinitionMap.put("/druid/**", "anon"); + filterChainDefinitionMap.put("/swagger-ui.html", "anon"); + filterChainDefinitionMap.put("/swagger**/**", "anon"); + filterChainDefinitionMap.put("/webjars/**", "anon"); + filterChainDefinitionMap.put("/v2/**", "anon"); + + //积木报表排除 + filterChainDefinitionMap.put("/jmreport/**", "anon"); + filterChainDefinitionMap.put("/**/*.js.map", "anon"); + filterChainDefinitionMap.put("/**/*.css.map", "anon"); + //大屏设计器排除 + filterChainDefinitionMap.put("/bigscreen/**", "anon"); + + //测试示例 + filterChainDefinitionMap.put("/test/bigScreen/**", "anon"); //大屏模板例子 + //filterChainDefinitionMap.put("/test/JeroDemo/rabbitMqClientTest/**", "anon"); //MQ测试 + //filterChainDefinitionMap.put("/test/JeroDemo/html", "anon"); //模板页面 + //filterChainDefinitionMap.put("/test/JeroDemo/redis/**", "anon"); //redis测试 + + //websocket排除 + filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告 + filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块 + filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例 + filterChainDefinitionMap.put("/eoaSocket/**","anon");//我的聊天 + + //性能监控 TODO 存在安全漏洞泄露TOEKN(durid连接池也有) + filterChainDefinitionMap.put("/actuator/**", "anon"); + + // 添加自己的过滤器并且取名为jwt + Map filterMap = new HashMap(1); + //如果cloudServer为空 则说明是单体 需要加载跨域配置 + Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY); + filterMap.put("jwt", new JwtFilter(cloudServer==null)); + shiroFilterFactoryBean.setFilters(filterMap); + // + + insert into sys_log (id, log_type, log_content, method, operate_type, request_param, ip, userid, username, cost_time, create_time) + values( + #{dto.id,jdbcType=VARCHAR}, + #{dto.logType,jdbcType=INTEGER}, + #{dto.logContent,jdbcType=VARCHAR}, + #{dto.method,jdbcType=VARCHAR}, + #{dto.operateType,jdbcType=INTEGER}, + #{dto.requestParam,jdbcType=VARCHAR}, + #{dto.ip,jdbcType=VARCHAR}, + #{dto.userid,jdbcType=VARCHAR}, + #{dto.username,jdbcType=VARCHAR}, + #{dto.costTime,jdbcType=BIGINT}, + #{dto.createTime,jdbcType=TIMESTAMP} + ) + + + \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/BaseCommonService.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/BaseCommonService.java new file mode 100644 index 00000000..81733b55 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/BaseCommonService.java @@ -0,0 +1,34 @@ +package com.jero.modules.base.service; + +import com.jero.common.api.dto.LogDTO; +import com.jero.common.system.vo.LoginUser; + +/** + * common接口 + */ +public interface BaseCommonService { + + /** + * 保存日志 + * @param logDTO + */ + void addLog(LogDTO logDTO); + + /** + * 保存日志 + * @param LogContent + * @param logType + * @param operateType + * @param user + */ + void addLog(String LogContent, Integer logType, Integer operateType, LoginUser user); + + /** + * 保存日志 + * @param LogContent + * @param logType + * @param operateType + */ + void addLog(String LogContent, Integer logType, Integer operateType); + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/impl/BaseCommonServiceImpl.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/impl/BaseCommonServiceImpl.java new file mode 100644 index 00000000..8c93f605 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/modules/base/service/impl/BaseCommonServiceImpl.java @@ -0,0 +1,91 @@ +package com.jero.modules.base.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.dto.LogDTO; +import com.jero.common.constant.CacheConstant; +import com.jero.modules.base.mapper.BaseCommonMapper; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.system.vo.SysPermissionDataRuleModel; +import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.common.util.IPUtils; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.*; + +@Service +@Slf4j +public class BaseCommonServiceImpl implements BaseCommonService { + + @Resource + private BaseCommonMapper baseCommonMapper; + + @Override + public void addLog(LogDTO logDTO) { + if(oConvertUtils.isEmpty(logDTO.getId())){ + logDTO.setId(String.valueOf(IdWorker.getId())); + } + //保存日志(异常捕获处理,防止数据太大存储失败,导致业务失败)JT-238 + try { + baseCommonMapper.saveLog(logDTO); + } catch (Exception e) { + log.warn(" LogContent length : "+logDTO.getLogContent().length()); + log.warn(e.getMessage()); + } + } + + @Override + public void addLog(String logContent, Integer logType, Integer operatetype, LoginUser user) { + LogDTO sysLog = new LogDTO(); + sysLog.setId(String.valueOf(IdWorker.getId())); + //注解上的描述,操作日志内容 + sysLog.setLogContent(logContent); + sysLog.setLogType(logType); + sysLog.setOperateType(operatetype); + try { + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //设置IP地址 + sysLog.setIp(IPUtils.getIpAddr(request)); + } catch (Exception e) { + sysLog.setIp("127.0.0.1"); + } + //获取登录用户信息 + if(user==null){ + try { + user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + } catch (Exception e) { + //e.printStackTrace(); + } + } + if(user!=null){ + sysLog.setUserid(user.getUsername()); + sysLog.setUsername(user.getRealname()); + } + sysLog.setCreateTime(new Date()); + //保存日志(异常捕获处理,防止数据太大存储失败,导致业务失败)JT-238 + try { + baseCommonMapper.saveLog(sysLog); + } catch (Exception e) { + log.warn(" LogContent length : "+sysLog.getLogContent().length()); + log.warn(e.getMessage()); + } + } + + @Override + public void addLog(String logContent, Integer logType, Integer operateType) { + addLog(logContent, logType, operateType, null); + } + + + +} diff --git a/jero-boot-base/jero-boot-base-core/src/main/resources/static/pca.json b/jero-boot-base/jero-boot-base-core/src/main/resources/static/pca.json new file mode 100644 index 00000000..777dc3df --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/resources/static/pca.json @@ -0,0 +1,51 @@ +{ + "86":{ + "110000":"北京市", + "120000":"天津市", + "130000":"河北省", + "140000":"山西省", + "150000":"内蒙古自治区", + "210000":"辽宁省", + "220000":"吉林省", + "230000":"黑龙江省", + "310000":"上海市", + "320000":"江苏省", + "330000":"浙江省", + "340000":"安徽省", + "350000":"福建省", + "360000":"江西省", + "370000":"山东省", + "410000":"河南省", + "420000":"湖北省", + "430000":"湖南省", + "440000":"广东省", + "450000":"广西壮族自治区", + "460000":"海南省", + "500000":"重庆市", + "510000":"四川省", + "520000":"贵州省", + "530000":"云南省", + "540000":"西藏自治区", + "610000":"陕西省", + "620000":"甘肃省", + "630000":"青海省", + "640000":"宁夏回族自治区", + "650000":"新疆维吾尔自治区", + "710000":"台湾省", + "910000":"港澳" + }, + "110000":{"110100":"市辖区"}, + "110100":{"110101":"东城区","110102":"西城区","110105":"朝阳区","110106":"丰台区","110107":"石景山区","110108":"海淀区","110109":"门头沟区","110111":"房山区","110112":"通州区","110113":"顺义区","110114":"昌平区","110115":"大兴区","110116":"怀柔区","110117":"平谷区","110118":"密云区","110119":"延庆区"}, + "120000":{"120100":"市辖区"}, + "120100":{"120101":"和平区","120102":"河东区","120103":"河西区","120104":"南开区","120105":"河北区","120106":"红桥区","120110":"东丽区","120111":"西青区","120112":"津南区","120113":"北辰区","120114":"武清区","120115":"宝坻区","120116":"滨海新区","120117":"宁河区","120118":"静海区","120119":"蓟州区"},"130000":{"130100":"石家庄市","130200":"唐山市","130300":"秦皇岛市","130400":"邯郸市","130500":"邢台市","130600":"保定市","130700":"张家口市","130800":"承德市","130900":"沧州市","131000":"廊坊市","131100":"衡水市","139001":"定州市","139002":"辛集市"},"130100":{"130102":"长安区","130104":"桥西区","130105":"新华区","130107":"井陉矿区","130108":"裕华区","130109":"藁城区","130110":"鹿泉区","130111":"栾城区","130121":"井陉县","130123":"正定县","130125":"行唐县","130126":"灵寿县","130127":"高邑县","130128":"深泽县","130129":"赞皇县","130130":"无极县","130131":"平山县","130132":"元氏县","130133":"赵县","130183":"晋州市","130184":"新乐市"},"130200":{"130202":"路南区","130203":"路北区","130204":"古冶区","130205":"开平区","130207":"丰南区","130208":"丰润区","130209":"曹妃甸区","130223":"滦县","130224":"滦南县","130225":"乐亭县","130227":"迁西县","130229":"玉田县","130281":"遵化市","130283":"迁安市"},"130300":{"130302":"海港区","130303":"山海关区","130304":"北戴河区","130306":"抚宁区","130321":"青龙满族自治县","130322":"昌黎县","130324":"卢龙县"},"130400":{"130402":"邯山区","130403":"丛台区","130404":"复兴区","130406":"峰峰矿区","130421":"邯郸县","130423":"临漳县","130424":"成安县","130425":"大名县","130426":"涉县","130427":"磁县","130428":"肥乡县","130429":"永年县","130430":"邱县","130431":"鸡泽县","130432":"广平县","130433":"馆陶县","130434":"魏县","130435":"曲周县","130481":"武安市"},"130500":{"130502":"桥东区","130503":"桥西区","130521":"邢台县","130522":"临城县","130523":"内丘县","130524":"柏乡县","130525":"隆尧县","130526":"任县","130527":"南和县","130528":"宁晋县","130529":"巨鹿县","130530":"新河县","130531":"广宗县","130532":"平乡县","130533":"威县","130534":"清河县","130535":"临西县","130581":"南宫市","130582":"沙河市"},"130600":{"130602":"竞秀区","130606":"莲池区","130607":"满城区","130608":"清苑区","130609":"徐水区","130623":"涞水县","130624":"阜平县","130626":"定兴县","130627":"唐县","130628":"高阳县","130629":"容城县","130630":"涞源县","130631":"望都县","130632":"安新县","130633":"易县","130634":"曲阳县","130635":"蠡县","130636":"顺平县","130637":"博野县","130638":"雄县","130681":"涿州市","130683":"安国市","130684":"高碑店市"},"130700":{"130702":"桥东区","130703":"桥西区","130705":"宣化区","130706":"下花园区","130708":"万全区","130709":"崇礼区","130722":"张北县","130723":"康保县","130724":"沽源县","130725":"尚义县","130726":"蔚县","130727":"阳原县","130728":"怀安县","130730":"怀来县","130731":"涿鹿县","130732":"赤城县"},"130800":{"130802":"双桥区","130803":"双滦区","130804":"鹰手营子矿区","130821":"承德县","130822":"兴隆县","130823":"平泉县","130824":"滦平县","130825":"隆化县","130826":"丰宁满族自治县","130827":"宽城满族自治县","130828":"围场满族蒙古族自治县"},"130900":{"130902":"新华区","130903":"运河区","130921":"沧县","130922":"青县","130923":"东光县","130924":"海兴县","130925":"盐山县","130926":"肃宁县","130927":"南皮县","130928":"吴桥县","130929":"献县","130930":"孟村回族自治县","130981":"泊头市","130982":"任丘市","130983":"黄骅市","130984":"河间市"},"131000":{"131002":"安次区","131003":"广阳区","131022":"固安县","131023":"永清县","131024":"香河县","131025":"大城县","131026":"文安县","131028":"大厂回族自治县","131081":"霸州市","131082":"三河市"},"131100":{"131102":"桃城区","131103":"冀州区","131121":"枣强县","131122":"武邑县","131123":"武强县","131124":"饶阳县","131125":"安平县","131126":"故城县","131127":"景县","131128":"阜城县","131182":"深州市"},"139001":{"1390011":"留早镇","13900111":"邢邑镇","139001001":"南城区街道","139001002":"北城区街道","139001003":"西城区街道","139001004":"长安路街道","139001101":"清风店镇","139001102":"庞村镇","139001103":"砖路镇","139001104":"明月店镇","139001105":"叮咛店镇","139001106":"东亭镇","139001107":"大辛庄镇","139001108":"东旺镇","139001109":"高蓬镇","139001111":"李亲顾镇","139001112":"子位镇","139001113":"开元镇","139001115":"周村镇","139001116":"息冢镇","139001203":"东留春乡","139001204":"号头庄回族乡","139001205":"杨家庄乡","139001206":"大鹿庄乡","139001208":"西城乡"},"139002":{"1390021":"辛集镇","1390022":"天宫营乡","1390025":"辛集经济开发区","139002101":"旧城镇","139002102":"张古庄镇","139002103":"位伯镇","139002104":"新垒头镇","139002105":"新城镇","139002106":"南智邱镇","139002107":"王口镇","139002201":"前营乡","139002202":"马庄乡","139002203":"和睦井乡","139002204":"田家庄乡","139002205":"中里厢乡","139002206":"小辛庄乡"},"140000":{"140100":"太原市","140200":"大同市","140300":"阳泉市","140400":"长治市","140500":"晋城市","140600":"朔州市","140700":"晋中市","140800":"运城市","140900":"忻州市","141000":"临汾市","141100":"吕梁市"},"140100":{"140105":"小店区","140106":"迎泽区","140107":"杏花岭区","140108":"尖草坪区","140109":"万柏林区","140110":"晋源区","140121":"清徐县","140122":"阳曲县","140123":"娄烦县","140181":"古交市"},"140200":{"140202":"城区","140203":"矿区","140211":"南郊区","140212":"新荣区","140221":"阳高县","140222":"天镇县","140223":"广灵县","140224":"灵丘县","140225":"浑源县","140226":"左云县","140227":"大同县"},"140300":{"140302":"城区","140303":"矿区","140311":"郊区","140321":"平定县","140322":"盂县"},"140400":{"140402":"城区","140411":"郊区","140421":"长治县","140423":"襄垣县","140424":"屯留县","140425":"平顺县","140426":"黎城县","140427":"壶关县","140428":"长子县","140429":"武乡县","140430":"沁县","140431":"沁源县","140481":"潞城市"},"140500":{"140502":"城区","140521":"沁水县","140522":"阳城县","140524":"陵川县","140525":"泽州县","140581":"高平市"},"140600":{"140602":"朔城区","140603":"平鲁区","140621":"山阴县","140622":"应县","140623":"右玉县","140624":"怀仁县"},"140700":{"140702":"榆次区","140721":"榆社县","140722":"左权县","140723":"和顺县","140724":"昔阳县","140725":"寿阳县","140726":"太谷县","140727":"祁县","140728":"平遥县","140729":"灵石县","140781":"介休市"},"140800":{"140802":"盐湖区","140821":"临猗县","140822":"万荣县","140823":"闻喜县","140824":"稷山县","140825":"新绛县","140826":"绛县","140827":"垣曲县","140828":"夏县","140829":"平陆县","140830":"芮城县","140881":"永济市","140882":"河津市"},"140900":{"140902":"忻府区","140921":"定襄县","140922":"五台县","140923":"代县","140924":"繁峙县","140925":"宁武县","140926":"静乐县","140927":"神池县","140928":"五寨县","140929":"岢岚县","140930":"河曲县","140931":"保德县","140932":"偏关县","140981":"原平市"}, + "141000":{"141002":"尧都区","141021":"曲沃县","141022":"翼城县","141023":"襄汾县","141024":"洪洞县","141025":"古县","141026":"安泽县","141027":"浮山县","141028":"吉县","141029":"乡宁县","141030":"大宁县","141031":"隰县","141032":"永和县","141033":"蒲县","141034":"汾西县","141081":"侯马市","141082":"霍州市"},"141100":{"141102":"离石区","141121":"文水县","141122":"交城县","141123":"兴县","141124":"临县","141125":"柳林县","141126":"石楼县","141127":"岚县","141128":"方山县","141129":"中阳县","141130":"交口县","141181":"孝义市","141182":"汾阳市"},"150000":{"150100":"呼和浩特市","150200":"包头市","150300":"乌海市","150400":"赤峰市","150500":"通辽市","150600":"鄂尔多斯市","150700":"呼伦贝尔市","150800":"巴彦淖尔市","150900":"乌兰察布市","152200":"兴安盟","152500":"锡林郭勒盟","152900":"阿拉善盟"},"150100":{"150102":"新城区","150103":"回民区","150104":"玉泉区","150105":"赛罕区","150121":"土默特左旗","150122":"托克托县","150123":"和林格尔县","150124":"清水河县","150125":"武川县"},"150200":{"150202":"东河区","150203":"昆都仑区","150204":"青山区","150205":"石拐区","150206":"白云鄂博矿区","150207":"九原区","150221":"土默特右旗","150222":"固阳县","150223":"达尔罕茂明安联合旗"},"150300":{"150302":"海勃湾区","150303":"海南区","150304":"乌达区"},"150400":{"150402":"红山区","150403":"元宝山区","150404":"松山区","150421":"阿鲁科尔沁旗","150422":"巴林左旗","150423":"巴林右旗","150424":"林西县","150425":"克什克腾旗","150426":"翁牛特旗","150428":"喀喇沁旗","150429":"宁城县","150430":"敖汉旗"},"150500":{"150502":"科尔沁区","150521":"科尔沁左翼中旗","150522":"科尔沁左翼后旗","150523":"开鲁县","150524":"库伦旗","150525":"奈曼旗","150526":"扎鲁特旗","150581":"霍林郭勒市"},"150600":{"150602":"东胜区","150603":"康巴什区","150621":"达拉特旗","150622":"准格尔旗","150623":"鄂托克前旗","150624":"鄂托克旗","150625":"杭锦旗","150626":"乌审旗","150627":"伊金霍洛旗"},"150700":{"150702":"海拉尔区","150703":"扎赉诺尔区","150721":"阿荣旗","150722":"莫力达瓦达斡尔族自治旗","150723":"鄂伦春自治旗","150724":"鄂温克族自治旗","150725":"陈巴尔虎旗","150726":"新巴尔虎左旗","150727":"新巴尔虎右旗","150781":"满洲里市","150782":"牙克石市","150783":"扎兰屯市","150784":"额尔古纳市","150785":"根河市"},"150800":{"150802":"临河区","150821":"五原县","150822":"磴口县","150823":"乌拉特前旗","150824":"乌拉特中旗","150825":"乌拉特后旗","150826":"杭锦后旗"},"150900":{"150902":"集宁区","150921":"卓资县","150922":"化德县","150923":"商都县","150924":"兴和县","150925":"凉城县","150926":"察哈尔右翼前旗","150927":"察哈尔右翼中旗","150928":"察哈尔右翼后旗","150929":"四子王旗","150981":"丰镇市"},"152200":{"152201":"乌兰浩特市","152202":"阿尔山市","152221":"科尔沁右翼前旗","152222":"科尔沁右翼中旗","152223":"扎赉特旗","152224":"突泉县"},"152500":{"152501":"二连浩特市","152502":"锡林浩特市","152522":"阿巴嘎旗","152523":"苏尼特左旗","152524":"苏尼特右旗","152525":"东乌珠穆沁旗","152526":"西乌珠穆沁旗","152527":"太仆寺旗","152528":"镶黄旗","152529":"正镶白旗","152530":"正蓝旗","152531":"多伦县"},"152900":{"152921":"阿拉善左旗","152922":"阿拉善右旗","152923":"额济纳旗"},"210000":{"210100":"沈阳市","210200":"大连市","210300":"鞍山市","210400":"抚顺市","210500":"本溪市","210600":"丹东市","210700":"锦州市","210800":"营口市","210900":"阜新市","211000":"辽阳市","211100":"盘锦市","211200":"铁岭市","211300":"朝阳市","211400":"葫芦岛市"},"210100":{"210102":"和平区","210103":"沈河区","210104":"大东区","210105":"皇姑区","210106":"铁西区","210111":"苏家屯区","210112":"浑南区","210113":"沈北新区","210114":"于洪区","210115":"辽中区","210123":"康平县","210124":"法库县","210181":"新民市"},"210200":{"210202":"中山区","210203":"西岗区","210204":"沙河口区","210211":"甘井子区","210212":"旅顺口区","210213":"金州区","210214":"普兰店区","210224":"长海县","210281":"瓦房店市","210283":"庄河市"},"210300":{"210302":"铁东区","210303":"铁西区","210304":"立山区","210311":"千山区","210321":"台安县","210323":"岫岩满族自治县","210381":"海城市"},"210400":{"210402":"新抚区","210403":"东洲区","210404":"望花区","210411":"顺城区","210421":"抚顺县","210422":"新宾满族自治县","210423":"清原满族自治县"},"210500":{"210502":"平山区","210503":"溪湖区","210504":"明山区","210505":"南芬区","210521":"本溪满族自治县","210522":"桓仁满族自治县"},"210600":{"210602":"元宝区","210603":"振兴区","210604":"振安区","210624":"宽甸满族自治县","210681":"东港市","210682":"凤城市"},"210700":{"210702":"古塔区","210703":"凌河区","210711":"太和区","210726":"黑山县","210727":"义县","210781":"凌海市","210782":"北镇市"},"210800":{"210802":"站前区","210803":"西市区","210804":"鲅鱼圈区","210811":"老边区","210881":"盖州市","210882":"大石桥市"},"210900":{"210902":"海州区","210903":"新邱区","210904":"太平区","210905":"清河门区","210911":"细河区","210921":"阜新蒙古族自治县","210922":"彰武县"},"211000":{"211002":"白塔区","211003":"文圣区","211004":"宏伟区","211005":"弓长岭区","211011":"太子河区","211021":"辽阳县","211081":"灯塔市"},"211100":{"211102":"双台子区","211103":"兴隆台区","211104":"大洼区","211122":"盘山县"},"211200":{"211202":"银州区","211204":"清河区","211221":"铁岭县","211223":"西丰县","211224":"昌图县","211281":"调兵山市","211282":"开原市"},"211300":{"211302":"双塔区","211303":"龙城区","211321":"朝阳县","211322":"建平县","211324":"喀喇沁左翼蒙古族自治县","211381":"北票市","211382":"凌源市"},"211400":{"211402":"连山区","211403":"龙港区","211404":"南票区","211421":"绥中县","211422":"建昌县","211481":"兴城市"},"220000":{"220100":"长春市","220200":"吉林市","220300":"四平市","220400":"辽源市","220500":"通化市","220600":"白山市","220700":"松原市","220800":"白城市","222400":"延边朝鲜族自治州"},"220100":{"220102":"南关区","220103":"宽城区","220104":"朝阳区","220105":"二道区","220106":"绿园区","220112":"双阳区","220113":"九台区","220122":"农安县","220182":"榆树市","220183":"德惠市"},"220200":{"220202":"昌邑区","220203":"龙潭区","220204":"船营区","220211":"丰满区","220221":"永吉县","220281":"蛟河市","220282":"桦甸市","220283":"舒兰市","220284":"磐石市"},"220300":{"220302":"铁西区","220303":"铁东区","220322":"梨树县","220323":"伊通满族自治县","220381":"公主岭市","220382":"双辽市"},"220400":{"220402":"龙山区","220403":"西安区","220421":"东丰县","220422":"东辽县"},"220500":{"220502":"东昌区","220503":"二道江区","220521":"通化县","220523":"辉南县","220524":"柳河县","220581":"梅河口市","220582":"集安市"},"220600":{"220602":"浑江区","220605":"江源区","220621":"抚松县","220622":"靖宇县","220623":"长白朝鲜族自治县","220681":"临江市"},"220700":{"220702":"宁江区","220721":"前郭尔罗斯蒙古族自治县","220722":"长岭县","220723":"乾安县","220781":"扶余市"},"220800":{"220802":"洮北区","220821":"镇赉县","220822":"通榆县","220881":"洮南市","220882":"大安市"},"222400":{"222401":"延吉市","222402":"图们市","222403":"敦化市","222404":"珲春市","222405":"龙井市","222406":"和龙市","222424":"汪清县","222426":"安图县"},"230000":{"230100":"哈尔滨市","230200":"齐齐哈尔市","230300":"鸡西市","230400":"鹤岗市","230500":"双鸭山市","230600":"大庆市","230700":"伊春市","230800":"佳木斯市","230900":"七台河市","231000":"牡丹江市","231100":"黑河市","231200":"绥化市","232700":"大兴安岭地区"},"230100":{"230102":"道里区","230103":"南岗区","230104":"道外区","230108":"平房区","230109":"松北区","230110":"香坊区","230111":"呼兰区","230112":"阿城区","230113":"双城区","230123":"依兰县","230124":"方正县","230125":"宾县","230126":"巴彦县","230127":"木兰县","230128":"通河县","230129":"延寿县","230183":"尚志市","230184":"五常市"},"230200":{"230202":"龙沙区","230203":"建华区","230204":"铁锋区","230205":"昂昂溪区","230206":"富拉尔基区","230207":"碾子山区","230208":"梅里斯达斡尔族区","230221":"龙江县","230223":"依安县","230224":"泰来县","230225":"甘南县","230227":"富裕县","230229":"克山县","230230":"克东县","230231":"拜泉县","230281":"讷河市"},"230300":{"230302":"鸡冠区","230303":"恒山区","230304":"滴道区","230305":"梨树区","230306":"城子河区","230307":"麻山区","230321":"鸡东县","230381":"虎林市","230382":"密山市"},"230400":{"230402":"向阳区","230403":"工农区","230404":"南山区","230405":"兴安区","230406":"东山区","230407":"兴山区","230421":"萝北县","230422":"绥滨县"},"230500":{"230502":"尖山区","230503":"岭东区","230505":"四方台区","230506":"宝山区","230521":"集贤县","230522":"友谊县","230523":"宝清县","230524":"饶河县"},"230600":{"230602":"萨尔图区","230603":"龙凤区","230604":"让胡路区","230605":"红岗区","230606":"大同区","230621":"肇州县","230622":"肇源县","230623":"林甸县","230624":"杜尔伯特蒙古族自治县"},"230700":{"230702":"伊春区","230703":"南岔区","230704":"友好区","230705":"西林区","230706":"翠峦区","230707":"新青区","230708":"美溪区","230709":"金山屯区","230710":"五营区","230711":"乌马河区","230712":"汤旺河区","230713":"带岭区","230714":"乌伊岭区","230715":"红星区","230716":"上甘岭区","230722":"嘉荫县","230781":"铁力市"},"230800":{"230803":"向阳区","230804":"前进区","230805":"东风区","230811":"郊区","230822":"桦南县","230826":"桦川县","230828":"汤原县","230881":"同江市","230882":"富锦市","230883":"抚远市"},"230900":{"230902":"新兴区","230903":"桃山区","230904":"茄子河区","230921":"勃利县"},"231000":{"231002":"东安区","231003":"阳明区","231004":"爱民区","231005":"西安区","231025":"林口县","231081":"绥芬河市","231083":"海林市","231084":"宁安市","231085":"穆棱市","231086":"东宁市"},"231100":{"231102":"爱辉区","231121":"嫩江县","231123":"逊克县","231124":"孙吴县","231181":"北安市","231182":"五大连池市"},"231200":{"231202":"北林区","231221":"望奎县","231222":"兰西县","231223":"青冈县","231224":"庆安县","231225":"明水县","231226":"绥棱县","231281":"安达市","231282":"肇东市","231283":"海伦市"},"232700":{"232721":"呼玛县","232722":"塔河县","232723":"漠河县"},"310000":{"310100":"市辖区"}, + "310100":{"310101":"黄浦区","310104":"徐汇区","310105":"长宁区","310106":"静安区","310107":"普陀区","310109":"虹口区","310110":"杨浦区","310112":"闵行区","310113":"宝山区","310114":"嘉定区","310115":"浦东新区","310116":"金山区","310117":"松江区","310118":"青浦区","310120":"奉贤区","310151":"崇明区"},"320000":{"320100":"南京市","320200":"无锡市","320300":"徐州市","320400":"常州市","320500":"苏州市","320600":"南通市","320700":"连云港市","320800":"淮安市","320900":"盐城市","321000":"扬州市","321100":"镇江市","321200":"泰州市","321300":"宿迁市"},"320100":{"320102":"玄武区","320104":"秦淮区","320105":"建邺区","320106":"鼓楼区","320111":"浦口区","320113":"栖霞区","320114":"雨花台区","320115":"江宁区","320116":"六合区","320117":"溧水区","320118":"高淳区"}, + "320200":{"320205":"锡山区","320206":"惠山区","320211":"滨湖区","320213":"梁溪区","320214":"新吴区","320281":"江阴市","320282":"宜兴市"},"320300":{"320302":"鼓楼区","320303":"云龙区","320305":"贾汪区","320311":"泉山区","320312":"铜山区","320321":"丰县","320322":"沛县","320324":"睢宁县","320381":"新沂市","320382":"邳州市"}, + "320400":{"320402":"天宁区","320404":"钟楼区","320411":"新北区","320412":"武进区","320413":"金坛区","320481":"溧阳市"},"320500":{"320505":"虎丘区","320506":"吴中区","320507":"相城区","320508":"姑苏区","320509":"吴江区","320581":"常熟市","320582":"张家港市","320583":"昆山市","320585":"太仓市"},"320600":{"320602":"崇川区","320611":"港闸区","320612":"通州区","320621":"海安县","320623":"如东县","320681":"启东市","320682":"如皋市","320684":"海门市"},"320700":{"320703":"连云区","320706":"海州区","320707":"赣榆区","320722":"东海县","320723":"灌云县","320724":"灌南县"},"320800":{"320803":"淮安区","320804":"淮阴区","320812":"清江浦区","320813":"洪泽区","320826":"涟水县","320830":"盱眙县","320831":"金湖县"},"320900":{"320902":"亭湖区","320903":"盐都区","320904":"大丰区","320921":"响水县","320922":"滨海县","320923":"阜宁县","320924":"射阳县","320925":"建湖县","320981":"东台市"},"321000":{"321002":"广陵区","321003":"邗江区","321012":"江都区","321023":"宝应县","321081":"仪征市","321084":"高邮市"},"321100":{"321102":"京口区","321111":"润州区","321112":"丹徒区","321181":"丹阳市","321182":"扬中市","321183":"句容市"},"321200":{"321202":"海陵区","321203":"高港区","321204":"姜堰区","321281":"兴化市","321282":"靖江市","321283":"泰兴市"},"321300":{"321302":"宿城区","321311":"宿豫区","321322":"沭阳县","321323":"泗阳县","321324":"泗洪县"},"330000":{"330100":"杭州市","330200":"宁波市","330300":"温州市","330400":"嘉兴市","330500":"湖州市","330600":"绍兴市","330700":"金华市","330800":"衢州市","330900":"舟山市","331000":"台州市","331100":"丽水市"},"330100":{"330102":"上城区","330103":"下城区","330104":"江干区","330105":"拱墅区","330106":"西湖区","330108":"滨江区","330109":"萧山区","330110":"余杭区","330111":"富阳区","330122":"桐庐县","330127":"淳安县","330182":"建德市","330185":"临安市"},"330200":{"330203":"海曙区","330204":"江东区","330205":"江北区","330206":"北仑区","330211":"镇海区","330212":"鄞州区","330225":"象山县","330226":"宁海县","330281":"余姚市","330282":"慈溪市","330283":"奉化市"},"330300":{"330302":"鹿城区","330303":"龙湾区","330304":"瓯海区","330305":"洞头区","330324":"永嘉县","330326":"平阳县","330327":"苍南县","330328":"文成县","330329":"泰顺县","330381":"瑞安市","330382":"乐清市"},"330400":{"330402":"南湖区","330411":"秀洲区","330421":"嘉善县","330424":"海盐县","330481":"海宁市","330482":"平湖市","330483":"桐乡市"},"330500":{"330502":"吴兴区","330503":"南浔区","330521":"德清县","330522":"长兴县","330523":"安吉县"},"330600":{"330602":"越城区","330603":"柯桥区","330604":"上虞区","330624":"新昌县","330681":"诸暨市","330683":"嵊州市"},"330700":{"330702":"婺城区","330703":"金东区","330723":"武义县","330726":"浦江县","330727":"磐安县","330781":"兰溪市","330782":"义乌市","330783":"东阳市","330784":"永康市"},"330800":{"330802":"柯城区","330803":"衢江区","330822":"常山县","330824":"开化县","330825":"龙游县","330881":"江山市"},"330900":{"330902":"定海区","330903":"普陀区","330921":"岱山县","330922":"嵊泗县"},"331000":{"331002":"椒江区","331003":"黄岩区","331004":"路桥区","331021":"玉环县","331022":"三门县","331023":"天台县","331024":"仙居县","331081":"温岭市","331082":"临海市"},"331100":{"331102":"莲都区","331121":"青田县","331122":"缙云县","331123":"遂昌县","331124":"松阳县","331125":"云和县","331126":"庆元县","331127":"景宁畲族自治县","331181":"龙泉市"},"340000":{"340100":"合肥市","340200":"芜湖市","340300":"蚌埠市","340400":"淮南市","340500":"马鞍山市","340600":"淮北市","340700":"铜陵市","340800":"安庆市","341000":"黄山市","341100":"滁州市","341200":"阜阳市","341300":"宿州市","341500":"六安市","341600":"亳州市","341700":"池州市","341800":"宣城市"},"340100":{"340102":"瑶海区","340103":"庐阳区","340104":"蜀山区","340111":"包河区","340121":"长丰县","340122":"肥东县","340123":"肥西县","340124":"庐江县","340181":"巢湖市"},"340200":{"340202":"镜湖区","340203":"弋江区","340207":"鸠江区","340208":"三山区","340221":"芜湖县","340222":"繁昌县","340223":"南陵县","340225":"无为县"},"340300":{"340302":"龙子湖区","340303":"蚌山区","340304":"禹会区","340311":"淮上区","340321":"怀远县","340322":"五河县","340323":"固镇县"},"340400":{"340402":"大通区","340403":"田家庵区","340404":"谢家集区","340405":"八公山区","340406":"潘集区","340421":"凤台县","340422":"寿县"},"340500":{"340503":"花山区","340504":"雨山区","340506":"博望区","340521":"当涂县","340522":"含山县","340523":"和县"},"340600":{"340602":"杜集区","340603":"相山区","340604":"烈山区","340621":"濉溪县"},"340700":{"340705":"铜官区","340706":"义安区","340711":"郊区","340722":"枞阳县"},"340800":{"340802":"迎江区","340803":"大观区","340811":"宜秀区","340822":"怀宁县","340824":"潜山县","340825":"太湖县","340826":"宿松县","340827":"望江县","340828":"岳西县","340881":"桐城市"},"341000":{"341002":"屯溪区","341003":"黄山区","341004":"徽州区","341021":"歙县","341022":"休宁县","341023":"黟县","341024":"祁门县"},"341100":{"341102":"琅琊区","341103":"南谯区","341122":"来安县","341124":"全椒县","341125":"定远县","341126":"凤阳县","341181":"天长市","341182":"明光市"},"341200":{"341202":"颍州区","341203":"颍东区","341204":"颍泉区","341221":"临泉县","341222":"太和县","341225":"阜南县","341226":"颍上县","341282":"界首市"},"341300":{"341302":"埇桥区","341321":"砀山县","341322":"萧县","341323":"灵璧县","341324":"泗县"},"341500":{"341502":"金安区","341503":"裕安区","341504":"叶集区","341522":"霍邱县","341523":"舒城县","341524":"金寨县","341525":"霍山县"},"341600":{"341602":"谯城区","341621":"涡阳县","341622":"蒙城县","341623":"利辛县"},"341700":{"341702":"贵池区","341721":"东至县","341722":"石台县","341723":"青阳县"},"341800":{"341802":"宣州区","341821":"郎溪县","341822":"广德县","341823":"泾县","341824":"绩溪县","341825":"旌德县","341881":"宁国市"},"350000":{"350100":"福州市","350200":"厦门市","350300":"莆田市","350400":"三明市","350500":"泉州市","350600":"漳州市","350700":"南平市","350800":"龙岩市","350900":"宁德市"},"350100":{"350102":"鼓楼区","350103":"台江区","350104":"仓山区","350105":"马尾区","350111":"晋安区","350121":"闽侯县","350122":"连江县","350123":"罗源县","350124":"闽清县","350125":"永泰县","350128":"平潭县","350181":"福清市","350182":"长乐市"},"350200":{"350203":"思明区","350205":"海沧区","350206":"湖里区","350211":"集美区","350212":"同安区","350213":"翔安区"},"350300":{"350302":"城厢区","350303":"涵江区","350304":"荔城区","350305":"秀屿区","350322":"仙游县"},"350400":{"350402":"梅列区","350403":"三元区","350421":"明溪县","350423":"清流县","350424":"宁化县","350425":"大田县","350426":"尤溪县","350427":"沙县","350428":"将乐县","350429":"泰宁县","350430":"建宁县","350481":"永安市"},"350500":{"350502":"鲤城区","350503":"丰泽区","350504":"洛江区","350505":"泉港区","350521":"惠安县","350524":"安溪县","350525":"永春县","350526":"德化县","350527":"金门县","350581":"石狮市","350582":"晋江市","350583":"南安市"},"350600":{"350602":"芗城区","350603":"龙文区","350622":"云霄县","350623":"漳浦县","350624":"诏安县","350625":"长泰县","350626":"东山县","350627":"南靖县","350628":"平和县","350629":"华安县","350681":"龙海市"},"350700":{"350702":"延平区","350703":"建阳区","350721":"顺昌县","350722":"浦城县","350723":"光泽县","350724":"松溪县","350725":"政和县","350781":"邵武市","350782":"武夷山市","350783":"建瓯市"},"350800":{"350802":"新罗区","350803":"永定区","350821":"长汀县","350823":"上杭县","350824":"武平县","350825":"连城县","350881":"漳平市"},"350900":{"350902":"蕉城区","350921":"霞浦县","350922":"古田县","350923":"屏南县","350924":"寿宁县","350925":"周宁县","350926":"柘荣县","350981":"福安市","350982":"福鼎市"},"360000":{"360100":"南昌市","360200":"景德镇市","360300":"萍乡市","360400":"九江市","360500":"新余市","360600":"鹰潭市","360700":"赣州市","360800":"吉安市","360900":"宜春市","361000":"抚州市","361100":"上饶市"},"360100":{"360102":"东湖区","360103":"西湖区","360104":"青云谱区","360105":"湾里区","360111":"青山湖区","360112":"新建区","360121":"南昌县","360123":"安义县","360124":"进贤县"},"360200":{"360202":"昌江区","360203":"珠山区","360222":"浮梁县","360281":"乐平市"},"360300":{"360302":"安源区","360313":"湘东区","360321":"莲花县","360322":"上栗县","360323":"芦溪县"},"360400":{"360402":"濂溪区","360403":"浔阳区","360421":"九江县","360423":"武宁县","360424":"修水县","360425":"永修县","360426":"德安县","360428":"都昌县","360429":"湖口县","360430":"彭泽县","360481":"瑞昌市","360482":"共青城市","360483":"庐山市"},"360500":{"360502":"渝水区","360521":"分宜县"},"360600":{"360602":"月湖区","360622":"余江县","360681":"贵溪市"},"360700":{"360702":"章贡区","360703":"南康区","360721":"赣县","360722":"信丰县","360723":"大余县","360724":"上犹县","360725":"崇义县","360726":"安远县","360727":"龙南县","360728":"定南县","360729":"全南县","360730":"宁都县","360731":"于都县","360732":"兴国县","360733":"会昌县","360734":"寻乌县","360735":"石城县","360781":"瑞金市"},"360800":{"360802":"吉州区","360803":"青原区","360821":"吉安县","360822":"吉水县","360823":"峡江县","360824":"新干县","360825":"永丰县","360826":"泰和县","360827":"遂川县","360828":"万安县","360829":"安福县","360830":"永新县","360881":"井冈山市"},"360900":{"360902":"袁州区","360921":"奉新县","360922":"万载县","360923":"上高县","360924":"宜丰县","360925":"靖安县","360926":"铜鼓县","360981":"丰城市","360982":"樟树市","360983":"高安市"},"361000":{"361002":"临川区","361021":"南城县","361022":"黎川县","361023":"南丰县","361024":"崇仁县","361025":"乐安县","361026":"宜黄县","361027":"金溪县","361028":"资溪县","361029":"东乡县","361030":"广昌县"},"361100":{"361102":"信州区","361103":"广丰区","361121":"上饶县","361123":"玉山县","361124":"铅山县","361125":"横峰县","361126":"弋阳县","361127":"余干县","361128":"鄱阳县","361129":"万年县","361130":"婺源县","361181":"德兴市"},"370000":{"370100":"济南市","370200":"青岛市","370300":"淄博市","370400":"枣庄市","370500":"东营市","370600":"烟台市","370700":"潍坊市","370800":"济宁市","370900":"泰安市","371000":"威海市","371100":"日照市","371200":"莱芜市","371300":"临沂市","371400":"德州市","371500":"聊城市","371600":"滨州市","371700":"菏泽市"},"370100":{"370102":"历下区","370103":"市中区","370104":"槐荫区","370105":"天桥区","370112":"历城区","370113":"长清区","370124":"平阴县","370125":"济阳县","370126":"商河县","370181":"章丘市"},"370200":{"370202":"市南区","370203":"市北区","370211":"黄岛区","370212":"崂山区","370213":"李沧区","370214":"城阳区","370281":"胶州市","370282":"即墨市","370283":"平度市","370285":"莱西市"},"370300":{"370302":"淄川区","370303":"张店区","370304":"博山区","370305":"临淄区","370306":"周村区","370321":"桓台县","370322":"高青县","370323":"沂源县"},"370400":{"370402":"市中区","370403":"薛城区","370404":"峄城区","370405":"台儿庄区","370406":"山亭区","370481":"滕州市"},"370500":{"370502":"东营区","370503":"河口区","370505":"垦利区","370522":"利津县","370523":"广饶县"},"370600":{"370602":"芝罘区","370611":"福山区","370612":"牟平区","370613":"莱山区","370634":"长岛县","370681":"龙口市","370682":"莱阳市","370683":"莱州市","370684":"蓬莱市","370685":"招远市","370686":"栖霞市","370687":"海阳市"},"370700":{"370702":"潍城区","370703":"寒亭区","370704":"坊子区","370705":"奎文区","370724":"临朐县","370725":"昌乐县","370781":"青州市","370782":"诸城市","370783":"寿光市","370784":"安丘市","370785":"高密市","370786":"昌邑市"},"370800":{"370811":"任城区","370812":"兖州区","370826":"微山县","370827":"鱼台县","370828":"金乡县","370829":"嘉祥县","370830":"汶上县","370831":"泗水县","370832":"梁山县","370881":"曲阜市","370883":"邹城市"},"370900":{"370902":"泰山区","370911":"岱岳区","370921":"宁阳县","370923":"东平县","370982":"新泰市","370983":"肥城市"},"371000":{"371002":"环翠区","371003":"文登区","371082":"荣成市","371083":"乳山市"},"371100":{"371102":"东港区","371103":"岚山区","371121":"五莲县","371122":"莒县"},"371200":{"371202":"莱城区","371203":"钢城区"},"371300":{"371302":"兰山区","371311":"罗庄区","371312":"河东区","371321":"沂南县","371322":"郯城县","371323":"沂水县","371324":"兰陵县","371325":"费县","371326":"平邑县","371327":"莒南县","371328":"蒙阴县","371329":"临沭县"},"371400":{"371402":"德城区","371403":"陵城区","371422":"宁津县","371423":"庆云县","371424":"临邑县","371425":"齐河县","371426":"平原县","371427":"夏津县","371428":"武城县","371481":"乐陵市","371482":"禹城市"},"371500":{"371502":"东昌府区","371521":"阳谷县","371522":"莘县","371523":"茌平县","371524":"东阿县","371525":"冠县","371526":"高唐县","371581":"临清市"},"371600":{"371602":"滨城区","371603":"沾化区","371621":"惠民县","371622":"阳信县","371623":"无棣县","371625":"博兴县","371626":"邹平县"},"371700":{"371702":"牡丹区","371703":"定陶区","371721":"曹县","371722":"单县","371723":"成武县","371724":"巨野县","371725":"郓城县","371726":"鄄城县","371728":"东明县"},"410000":{"410100":"郑州市","410200":"开封市","410300":"洛阳市","410400":"平顶山市","410500":"安阳市","410600":"鹤壁市","410700":"新乡市","410800":"焦作市","410900":"濮阳市","411000":"许昌市","411100":"漯河市","411200":"三门峡市","411300":"南阳市","411400":"商丘市","411500":"信阳市","411600":"周口市","411700":"驻马店市","419001":"济源市"},"410100":{"410102":"中原区","410103":"二七区","410104":"管城回族区","410105":"金水区","410106":"上街区","410108":"惠济区","410122":"中牟县","410181":"巩义市","410182":"荥阳市","410183":"新密市","410184":"新郑市","410185":"登封市"},"410200":{"410202":"龙亭区","410203":"顺河回族区","410204":"鼓楼区","410205":"禹王台区","410211":"金明区","410212":"祥符区","410221":"杞县","410222":"通许县","410223":"尉氏县","410225":"兰考县"},"410300":{"410302":"老城区","410303":"西工区","410304":"瀍河回族区","410305":"涧西区","410306":"吉利区","410311":"洛龙区","410322":"孟津县","410323":"新安县","410324":"栾川县","410325":"嵩县","410326":"汝阳县","410327":"宜阳县","410328":"洛宁县","410329":"伊川县","410381":"偃师市"},"410400":{"410402":"新华区","410403":"卫东区","410404":"石龙区","410411":"湛河区","410421":"宝丰县","410422":"叶县","410423":"鲁山县","410425":"郏县","410481":"舞钢市","410482":"汝州市"},"410500":{"410502":"文峰区","410503":"北关区","410505":"殷都区","410506":"龙安区","410522":"安阳县","410523":"汤阴县","410526":"滑县","410527":"内黄县","410581":"林州市"},"410600":{"410602":"鹤山区","410603":"山城区","410611":"淇滨区","410621":"浚县","410622":"淇县"},"410700":{"410702":"红旗区","410703":"卫滨区","410704":"凤泉区","410711":"牧野区","410721":"新乡县","410724":"获嘉县","410725":"原阳县","410726":"延津县","410727":"封丘县","410728":"长垣县","410781":"卫辉市","410782":"辉县市"},"410800":{"410802":"解放区","410803":"中站区","410804":"马村区","410811":"山阳区","410821":"修武县","410822":"博爱县","410823":"武陟县","410825":"温县","410882":"沁阳市","410883":"孟州市"},"410900":{"410902":"华龙区","410922":"清丰县","410923":"南乐县","410926":"范县","410927":"台前县","410928":"濮阳县"},"411000":{"411002":"魏都区","411023":"许昌县","411024":"鄢陵县","411025":"襄城县","411081":"禹州市","411082":"长葛市"},"411100":{"411102":"源汇区","411103":"郾城区","411104":"召陵区","411121":"舞阳县","411122":"临颍县"},"411200":{"411202":"湖滨区","411203":"陕州区","411221":"渑池县","411224":"卢氏县","411281":"义马市","411282":"灵宝市"},"411300":{"411302":"宛城区","411303":"卧龙区","411321":"南召县","411322":"方城县","411323":"西峡县","411324":"镇平县","411325":"内乡县","411326":"淅川县","411327":"社旗县","411328":"唐河县","411329":"新野县","411330":"桐柏县","411381":"邓州市"},"411400":{"411402":"梁园区","411403":"睢阳区","411421":"民权县","411422":"睢县","411423":"宁陵县","411424":"柘城县","411425":"虞城县","411426":"夏邑县","411481":"永城市"},"411500":{"411502":"浉河区","411503":"平桥区","411521":"罗山县","411522":"光山县","411523":"新县","411524":"商城县","411525":"固始县","411526":"潢川县","411527":"淮滨县","411528":"息县"},"411600":{"411602":"川汇区","411621":"扶沟县","411622":"西华县","411623":"商水县","411624":"沈丘县","411625":"郸城县","411626":"淮阳县","411627":"太康县","411628":"鹿邑县","411681":"项城市"},"411700":{"411702":"驿城区","411721":"西平县","411722":"上蔡县","411723":"平舆县","411724":"正阳县","411725":"确山县","411726":"泌阳县","411727":"汝南县","411728":"遂平县","411729":"新蔡县"},"419001":{"4190011":"济源市克井镇","41900111":"济源市下冶镇","419001001":"济源市沁园街道","419001002":"济源市济水街道","419001003":"济源市北海街道","419001004":"济源市天坛街道","419001005":"济源市玉泉街道","419001101":"济源市五龙口镇","419001102":"济源市轵城镇","419001103":"济源市承留镇","419001104":"济源市邵原镇","419001105":"济源市坡头镇","419001106":"济源市梨林镇","419001107":"济源市大峪镇","419001108":"济源市思礼镇","419001109":"济源市王屋镇"},"420000":{"420100":"武汉市","420200":"黄石市","420300":"十堰市","420500":"宜昌市","420600":"襄阳市","420700":"鄂州市","420800":"荆门市","420900":"孝感市","421000":"荆州市","421100":"黄冈市","421200":"咸宁市","421300":"随州市","422800":"恩施土家族苗族自治州","429004":"仙桃市","429005":"潜江市","429006":"天门市","429021":"神农架林区"},"420100":{"420102":"江岸区","420103":"江汉区","420104":"硚口区","420105":"汉阳区","420106":"武昌区","420107":"青山区","420111":"洪山区","420112":"东西湖区","420113":"汉南区","420114":"蔡甸区","420115":"江夏区","420116":"黄陂区","420117":"新洲区"},"420200":{"420202":"黄石港区","420203":"西塞山区","420204":"下陆区","420205":"铁山区","420222":"阳新县","420281":"大冶市"},"420300":{"420302":"茅箭区","420303":"张湾区","420304":"郧阳区","420322":"郧西县","420323":"竹山县","420324":"竹溪县","420325":"房县","420381":"丹江口市"},"420500":{"420502":"西陵区","420503":"伍家岗区","420504":"点军区","420505":"猇亭区","420506":"夷陵区","420525":"远安县","420526":"兴山县","420527":"秭归县","420528":"长阳土家族自治县","420529":"五峰土家族自治县","420581":"宜都市","420582":"当阳市","420583":"枝江市"},"420600":{"420602":"襄城区","420606":"樊城区","420607":"襄州区","420624":"南漳县","420625":"谷城县","420626":"保康县","420682":"老河口市","420683":"枣阳市","420684":"宜城市"},"420700":{"420702":"梁子湖区","420703":"华容区","420704":"鄂城区"},"420800":{"420802":"东宝区","420804":"掇刀区","420821":"京山县","420822":"沙洋县","420881":"钟祥市"},"420900":{"420902":"孝南区","420921":"孝昌县","420922":"大悟县","420923":"云梦县","420981":"应城市","420982":"安陆市","420984":"汉川市"},"421000":{"421002":"沙市区","421003":"荆州区","421022":"公安县","421023":"监利县","421024":"江陵县","421081":"石首市","421083":"洪湖市","421087":"松滋市"},"421100":{"421102":"黄州区","421121":"团风县","421122":"红安县","421123":"罗田县","421124":"英山县","421125":"浠水县","421126":"蕲春县","421127":"黄梅县","421181":"麻城市","421182":"武穴市"},"421200":{"421202":"咸安区","421221":"嘉鱼县","421222":"通城县","421223":"崇阳县","421224":"通山县","421281":"赤壁市"},"421300":{"421303":"曾都区","421321":"随县","421381":"广水市"},"422800":{"422801":"恩施市","422802":"利川市","422822":"建始县","422823":"巴东县","422825":"宣恩县","422826":"咸丰县","422827":"来凤县","422828":"鹤峰县"},"429004":{"4290041":"郑场镇","4290044":"工业园区","42900411":"张沟镇","429004001":"沙嘴街道","429004002":"干河街道","429004003":"龙华山","429004101":"毛嘴镇","429004102":"豆河镇","429004103":"三伏潭镇","429004104":"胡场镇","429004105":"长倘口镇","429004106":"西流河镇","429004107":"沙湖镇","429004108":"杨林尾镇","429004109":"彭场镇","429004111":"郭河镇","429004112":"沔城回族镇","429004113":"通海口镇","429004114":"陈场镇","429004401":"九合垸原种场","429004402":"沙湖原种场","429004404":"五湖渔场","429004405":"赵西垸林场","429004407":"畜禽良种场","429004408":"排湖风景区"},"429005":{"4290051":"竹根滩镇","4290054":"江汉石油管理局","42900545":"周矶管理区","429005001":"园林","429005002":"杨市","429005003":"周矶","429005004":"广华","429005005":"泰丰","429005006":"高场","429005101":"渔洋镇","429005102":"王场镇","429005103":"高石碑镇","429005104":"熊口镇","429005105":"老新镇","429005106":"浩口镇","429005107":"积玉口镇","429005108":"张金镇","429005109":"龙湾镇","429005401":"潜江经济开发区","429005451":"后湖管理区","429005452":"熊口管理区","429005453":"总口管理区","429005454":"白鹭湖管理区","429005455":"运粮湖管理区","429005457":"浩口原种场"},"429006":{"4290061":"多宝镇","42900611":"麻洋镇","42900612":"石河镇","42900645":"蒋湖农场","429006001":"竟陵街道","429006002":"侨乡街道开发区","429006003":"杨林街道","429006101":"拖市镇","429006102":"张港镇","429006103":"蒋场镇","429006104":"汪场镇","429006105":"渔薪镇","429006106":"黄潭镇","429006107":"岳口镇","429006108":"横林镇","429006109":"彭市镇","429006111":"多祥镇","429006112":"干驿镇","429006113":"马湾镇","429006114":"卢市镇","429006115":"小板镇","429006116":"九真镇","429006118":"皂市镇","429006119":"胡市镇","429006121":"佛子山镇","429006201":"净潭乡","429006451":"白茅湖农场","429006452":"沉湖管委会"},"429021":{"4290211":"松柏镇","4290212":"宋洛乡","429021101":"阳日镇","429021102":"木鱼镇","429021103":"红坪镇","429021104":"新华镇","429021105":"九湖镇","429021202":"下谷坪土家族乡"},"430000":{"430100":"长沙市","430200":"株洲市","430300":"湘潭市","430400":"衡阳市","430500":"邵阳市","430600":"岳阳市","430700":"常德市","430800":"张家界市","430900":"益阳市","431000":"郴州市","431100":"永州市","431200":"怀化市","431300":"娄底市","433100":"湘西土家族苗族自治州"},"430100":{"430102":"芙蓉区","430103":"天心区","430104":"岳麓区","430105":"开福区","430111":"雨花区","430112":"望城区","430121":"长沙县","430124":"宁乡县","430181":"浏阳市"},"430200":{"430202":"荷塘区","430203":"芦淞区","430204":"石峰区","430211":"天元区","430221":"株洲县","430223":"攸县","430224":"茶陵县","430225":"炎陵县","430281":"醴陵市"},"430300":{"430302":"雨湖区","430304":"岳塘区","430321":"湘潭县","430381":"湘乡市","430382":"韶山市"},"430400":{"430405":"珠晖区","430406":"雁峰区","430407":"石鼓区","430408":"蒸湘区","430412":"南岳区","430421":"衡阳县","430422":"衡南县","430423":"衡山县","430424":"衡东县","430426":"祁东县","430481":"耒阳市","430482":"常宁市"},"430500":{"430502":"双清区","430503":"大祥区","430511":"北塔区","430521":"邵东县","430522":"新邵县","430523":"邵阳县","430524":"隆回县","430525":"洞口县","430527":"绥宁县","430528":"新宁县","430529":"城步苗族自治县","430581":"武冈市"},"430600":{"430602":"岳阳楼区","430603":"云溪区","430611":"君山区","430621":"岳阳县","430623":"华容县","430624":"湘阴县","430626":"平江县","430681":"汨罗市","430682":"临湘市"},"430700":{"430702":"武陵区","430703":"鼎城区","430721":"安乡县","430722":"汉寿县","430723":"澧县","430724":"临澧县","430725":"桃源县","430726":"石门县","430781":"津市市"},"430800":{"430802":"永定区","430811":"武陵源区","430821":"慈利县","430822":"桑植县"},"430900":{"430902":"资阳区","430903":"赫山区","430921":"南县","430922":"桃江县","430923":"安化县","430981":"沅江市"},"431000":{"431002":"北湖区","431003":"苏仙区","431021":"桂阳县","431022":"宜章县","431023":"永兴县","431024":"嘉禾县","431025":"临武县","431026":"汝城县","431027":"桂东县","431028":"安仁县","431081":"资兴市"},"431100":{"431102":"零陵区","431103":"冷水滩区","431121":"祁阳县","431122":"东安县","431123":"双牌县","431124":"道县","431125":"江永县","431126":"宁远县","431127":"蓝山县","431128":"新田县","431129":"江华瑶族自治县"},"431200":{"431202":"鹤城区","431221":"中方县","431222":"沅陵县","431223":"辰溪县","431224":"溆浦县","431225":"会同县","431226":"麻阳苗族自治县","431227":"新晃侗族自治县","431228":"芷江侗族自治县","431229":"靖州苗族侗族自治县","431230":"通道侗族自治县","431281":"洪江市"},"431300":{"431302":"娄星区","431321":"双峰县","431322":"新化县","431381":"冷水江市","431382":"涟源市"},"433100":{"433101":"吉首市","433122":"泸溪县","433123":"凤凰县","433124":"花垣县","433125":"保靖县","433126":"古丈县","433127":"永顺县","433130":"龙山县"},"440000":{"440100":"广州市","440200":"韶关市","440300":"深圳市","440400":"珠海市","440500":"汕头市","440600":"佛山市","440700":"江门市","440800":"湛江市","440900":"茂名市","441200":"肇庆市","441300":"惠州市","441400":"梅州市","441500":"汕尾市","441600":"河源市","441700":"阳江市","441800":"清远市","441900":"东莞市","442000":"中山市","445100":"潮州市","445200":"揭阳市","445300":"云浮市"},"440100":{"440103":"荔湾区","440104":"越秀区","440105":"海珠区","440106":"天河区","440111":"白云区","440112":"黄埔区","440113":"番禺区","440114":"花都区","440115":"南沙区","440117":"从化区","440118":"增城区"},"440200":{"440203":"武江区","440204":"浈江区","440205":"曲江区","440222":"始兴县","440224":"仁化县","440229":"翁源县","440232":"乳源瑶族自治县","440233":"新丰县","440281":"乐昌市","440282":"南雄市"},"440300":{"440303":"罗湖区","440304":"福田区","440305":"南山区","440306":"宝安区","440307":"龙岗区","440308":"盐田区"},"440400":{"440402":"香洲区","440403":"斗门区","440404":"金湾区"},"440500":{"440507":"龙湖区","440511":"金平区","440512":"濠江区","440513":"潮阳区","440514":"潮南区","440515":"澄海区","440523":"南澳县"},"440600":{"440604":"禅城区","440605":"南海区","440606":"顺德区","440607":"三水区","440608":"高明区"},"440700":{"440703":"蓬江区","440704":"江海区","440705":"新会区","440781":"台山市","440783":"开平市","440784":"鹤山市","440785":"恩平市"},"440800":{"440802":"赤坎区","440803":"霞山区","440804":"坡头区","440811":"麻章区","440823":"遂溪县","440825":"徐闻县","440881":"廉江市","440882":"雷州市","440883":"吴川市"},"440900":{"440902":"茂南区","440904":"电白区","440981":"高州市","440982":"化州市","440983":"信宜市"},"441200":{"441202":"端州区","441203":"鼎湖区","441204":"高要区","441223":"广宁县","441224":"怀集县","441225":"封开县","441226":"德庆县","441284":"四会市"},"441300":{"441302":"惠城区","441303":"惠阳区","441322":"博罗县","441323":"惠东县","441324":"龙门县"},"441400":{"441402":"梅江区","441403":"梅县区","441422":"大埔县","441423":"丰顺县","441424":"五华县","441426":"平远县","441427":"蕉岭县","441481":"兴宁市"},"441500":{"441502":"城区","441521":"海丰县","441523":"陆河县","441581":"陆丰市"},"441600":{"441602":"源城区","441621":"紫金县","441622":"龙川县","441623":"连平县","441624":"和平县","441625":"东源县"},"441700":{"441702":"江城区","441704":"阳东区","441721":"阳西县","441781":"阳春市"},"441800":{"441802":"清城区","441803":"清新区","441821":"佛冈县","441823":"阳山县","441825":"连山壮族瑶族自治县","441826":"连南瑶族自治县","441881":"英德市","441882":"连州市"},"441900":{"441900003":"东城街道","441900004":"南城街道","441900005":"万江街道","441900006":"莞城街道","441900101":"石碣镇","441900102":"石龙镇","441900103":"茶山镇","441900104":"石排镇","441900105":"企石镇","441900106":"横沥镇","441900107":"桥头镇","441900108":"谢岗镇","441900109":"东坑镇","441900110":"常平镇","441900111":"寮步镇","441900112":"樟木头镇","441900113":"大朗镇","441900114":"黄江镇","441900115":"清溪镇","441900116":"塘厦镇","441900117":"凤岗镇","441900118":"大岭山镇","441900119":"长安镇","441900121":"虎门镇","441900122":"厚街镇","441900123":"沙田镇","441900124":"道滘镇","441900125":"洪梅镇","441900126":"麻涌镇","441900127":"望牛墩镇","441900128":"中堂镇","441900129":"高埗镇","441900401":"松山湖管委会","441900402":"虎门港管委会","441900403":"东莞生态园"},"442000":{"442000001":"石岐区街道","442000002":"东区街道","442000003":"火炬开发区街道","442000004":"西区街道","442000005":"南区街道","442000006":"五桂山街道","442000100":"小榄镇","442000101":"黄圃镇","442000102":"民众镇","442000103":"东凤镇","442000104":"东升镇","442000105":"古镇镇","442000106":"沙溪镇","442000107":"坦洲镇","442000108":"港口镇","442000109":"三角镇","442000110":"横栏镇","442000111":"南头镇","442000112":"阜沙镇","442000113":"南朗镇","442000114":"三乡镇","442000115":"板芙镇","442000116":"大涌镇","442000117":"神湾镇"},"445100":{"445102":"湘桥区","445103":"潮安区","445122":"饶平县"},"445200":{"445202":"榕城区","445203":"揭东区","445222":"揭西县","445224":"惠来县","445281":"普宁市"},"445300":{"445302":"云城区","445303":"云安区","445321":"新兴县","445322":"郁南县","445381":"罗定市"},"450000":{"450100":"南宁市","450200":"柳州市","450300":"桂林市","450400":"梧州市","450500":"北海市","450600":"防城港市","450700":"钦州市","450800":"贵港市","450900":"玉林市","451000":"百色市","451100":"贺州市","451200":"河池市","451300":"来宾市","451400":"崇左市"},"450100":{"450102":"兴宁区","450103":"青秀区","450105":"江南区","450107":"西乡塘区","450108":"良庆区","450109":"邕宁区","450110":"武鸣区","450123":"隆安县","450124":"马山县","450125":"上林县","450126":"宾阳县","450127":"横县"},"450200":{"450202":"城中区","450203":"鱼峰区","450204":"柳南区","450205":"柳北区","450206":"柳江区","450222":"柳城县","450223":"鹿寨县","450224":"融安县","450225":"融水苗族自治县","450226":"三江侗族自治县"},"450300":{"450302":"秀峰区","450303":"叠彩区","450304":"象山区","450305":"七星区","450311":"雁山区","450312":"临桂区","450321":"阳朔县","450323":"灵川县","450324":"全州县","450325":"兴安县","450326":"永福县","450327":"灌阳县","450328":"龙胜各族自治县","450329":"资源县","450330":"平乐县","450331":"荔浦县","450332":"恭城瑶族自治县"},"450400":{"450403":"万秀区","450405":"长洲区","450406":"龙圩区","450421":"苍梧县","450422":"藤县","450423":"蒙山县","450481":"岑溪市"},"450500":{"450502":"海城区","450503":"银海区","450512":"铁山港区","450521":"合浦县"},"450600":{"450602":"港口区","450603":"防城区","450621":"上思县","450681":"东兴市"},"450700":{"450702":"钦南区","450703":"钦北区","450721":"灵山县","450722":"浦北县"},"450800":{"450802":"港北区","450803":"港南区","450804":"覃塘区","450821":"平南县","450881":"桂平市"},"450900":{"450902":"玉州区","450903":"福绵区","450921":"容县","450922":"陆川县","450923":"博白县","450924":"兴业县","450981":"北流市"},"451000":{"451002":"右江区","451021":"田阳县","451022":"田东县","451023":"平果县","451024":"德保县","451026":"那坡县","451027":"凌云县","451028":"乐业县","451029":"田林县","451030":"西林县","451031":"隆林各族自治县","451081":"靖西市"},"451100":{"451102":"八步区","451103":"平桂区","451121":"昭平县","451122":"钟山县","451123":"富川瑶族自治县"},"451200":{"451202":"金城江区","451221":"南丹县","451222":"天峨县","451223":"凤山县","451224":"东兰县","451225":"罗城仫佬族自治县","451226":"环江毛南族自治县","451227":"巴马瑶族自治县","451228":"都安瑶族自治县","451229":"大化瑶族自治县","451281":"宜州市"},"451300":{"451302":"兴宾区","451321":"忻城县","451322":"象州县","451323":"武宣县","451324":"金秀瑶族自治县","451381":"合山市"},"451400":{"451402":"江州区","451421":"扶绥县","451422":"宁明县","451423":"龙州县","451424":"大新县","451425":"天等县","451481":"凭祥市"},"460000":{"460100":"海口市","460200":"三亚市","460300":"三沙市","460400":"儋州市","469001":"五指山市","469002":"琼海市","469005":"文昌市","469006":"万宁市","469007":"东方市","469021":"定安县","469022":"屯昌县","469023":"澄迈县","469024":"临高县","469025":"白沙黎族自治县","469026":"昌江黎族自治县","469027":"乐东黎族自治县","469028":"陵水黎族自治县","469029":"保亭黎族苗族自治县","469030":"琼中黎族苗族自治县"},"460100":{"460105":"秀英区","460106":"龙华区","460107":"琼山区","460108":"美兰区"},"460200":{"460202":"海棠区","460203":"吉阳区","460204":"天涯区","460205":"崖州区"},"460300":{"460321":"西沙群岛","460322":"南沙群岛","460323":"中沙群岛的岛礁及其海域"},"460400":{"4604001":"那大镇","4604004":"国营西培农场","4604005":"华南热作学院","46040011":"三都镇","460400101":"和庆镇","460400102":"南丰镇","460400103":"大成镇","460400104":"雅星镇","460400105":"兰洋镇","460400106":"光村镇","460400107":"木棠镇","460400108":"海头镇","460400109":"峨蔓镇","460400111":"王五镇","460400112":"白马井镇","460400113":"中和镇","460400114":"排浦镇","460400115":"东成镇","460400116":"新州镇","460400404":"国营西联农场","460400405":"国营蓝洋农场","460400407":"国营八一农场","460400499":"洋浦经济开发区"},"469001":{"4690011":"通什镇","4690012":"畅好乡","4690014":"畅好农场","469001101":"南圣镇","469001102":"毛阳镇","469001103":"番阳镇","469001201":"毛道乡","469001202":"水满乡"},"469002":{"4690021":"嘉积镇","4690024":"国营东太农场","4690025":"彬村山华侨农场","46900211":"大路镇","469002101":"万泉镇","469002102":"石壁镇","469002103":"中原镇","469002104":"博鳌镇","469002105":"阳江镇","469002106":"龙江镇","469002107":"潭门镇","469002108":"塔洋镇","469002109":"长坡镇","469002111":"会山镇","469002402":"国营东红农场","469002403":"国营东升农场"},"469005":{"4690051":"文城镇","4690054":"国营东路农场","46900511":"昌洒镇","469005101":"重兴镇","469005102":"蓬莱镇","469005103":"会文镇","469005104":"东路镇","469005105":"潭牛镇","469005106":"东阁镇","469005107":"文教镇","469005108":"东郊镇","469005109":"龙楼镇","469005111":"翁田镇","469005112":"抱罗镇","469005113":"冯坡镇","469005114":"锦山镇","469005115":"铺前镇","469005116":"公坡镇","469005401":"国营南阳农场","469005402":"国营罗豆农场"},"469006":{"4690061":"万城镇","4690064":"国营东兴农场","4690065":"兴隆华侨农场","46900611":"南桥镇","469006101":"龙滚镇","469006102":"和乐镇","469006103":"后安镇","469006104":"大茂镇","469006105":"东澳镇","469006106":"礼纪镇","469006107":"长丰镇","469006108":"山根镇","469006109":"北大镇","469006111":"三更罗镇","469006401":"国营东和农场","469006404":"国营新中农场","469006501":"地方国营六连林场"},"469007":{"4690071":"八所镇","4690072":"天安乡","4690074":"国营广坝农场","4690075":"东方华侨农场","469007101":"东河镇","469007102":"大田镇","469007103":"感城镇","469007104":"板桥镇","469007105":"三家镇","469007106":"四更镇","469007107":"新龙镇","469007201":"江边乡"},"469021":{"4690211":"定城镇","4690214":"国营中瑞农场","469021101":"新竹镇","469021102":"龙湖镇","469021103":"黄竹镇","469021104":"雷鸣镇","469021105":"龙门镇","469021106":"龙河镇","469021107":"岭口镇","469021108":"翰林镇","469021109":"富文镇","469021401":"国营南海农场","469021402":"国营金鸡岭农场"},"469022":{"4690221":"屯城镇","4690224":"国营中建农场","469022101":"新兴镇","469022102":"枫木镇","469022103":"乌坡镇","469022104":"南吕镇","469022105":"南坤镇","469022106":"坡心镇","469022107":"西昌镇","469022401":"国营中坤农场"},"469023":{"4690231":"金江镇","4690234":"国营红光农场","46902311":"大丰镇","469023101":"老城镇","469023102":"瑞溪镇","469023103":"永发镇","469023104":"加乐镇","469023105":"文儒镇","469023106":"中兴镇","469023107":"仁兴镇","469023108":"福山镇","469023109":"桥头镇","469023402":"国营西达农场","469023405":"国营金安农场"},"469024":{"4690241":"临城镇","4690244":"国营红华农场","469024101":"波莲镇","469024102":"东英镇","469024103":"博厚镇","469024104":"皇桐镇","469024105":"多文镇","469024106":"和舍镇","469024107":"南宝镇","469024108":"新盈镇","469024109":"调楼镇","469024401":"国营加来农场"},"469025":{"4690251":"牙叉镇","4690252":"细水乡","469025101":"七坊镇","469025102":"邦溪镇","469025103":"打安镇","469025201":"元门乡","469025202":"南开乡","469025203":"阜龙乡","469025204":"青松乡","469025205":"金波乡","469025206":"荣邦乡","469025401":"国营白沙农场","469025404":"国营龙江农场","469025408":"国营邦溪农场"},"469026":{"4690261":"石碌镇","4690262":"王下乡","4690265":"国营霸王岭林场","469026101":"叉河镇","469026102":"十月田镇","469026103":"乌烈镇","469026104":"昌化镇","469026105":"海尾镇","469026106":"七叉镇","469026401":"国营红林农场","469026501":"海南矿业联合有限公司"},"469027":{"4690271":"抱由镇","4690275":"国营尖峰岭林业公司","46902711":"莺歌海镇","469027101":"万冲镇","469027102":"大安镇","469027103":"志仲镇","469027104":"千家镇","469027105":"九所镇","469027106":"利国镇","469027107":"黄流镇","469027108":"佛罗镇","469027109":"尖峰镇","469027401":"国营山荣农场","469027402":"国营乐光农场","469027405":"国营保国农场","469027501":"国营莺歌海盐场"},"469028":{"4690281":"椰林镇","4690282":"提蒙乡","4690284":"国营岭门农场","4690285":"国营吊罗山林业公司","469028101":"光坡镇","469028102":"三才镇","469028103":"英州镇","469028104":"隆广镇","469028105":"文罗镇","469028106":"本号镇","469028107":"新村镇","469028108":"黎安镇","469028201":"群英乡","469028401":"国营南平农场"},"469029":{"4690291":"保城镇","4690292":"六弓乡","469029101":"什玲镇","469029102":"加茂镇","469029103":"响水镇","469029104":"新政镇","469029105":"三道镇","469029201":"南林乡","469029202":"毛感乡","469029401":"国营新星农场","469029402":"海南保亭热带作物研究所","469029403":"国营金江农场","469029405":"国营三道农场"},"469030":{"4690301":"营根镇","4690302":"吊罗山乡","4690305":"海南黎母山省级自然保护区管理站","469030101":"湾岭镇","469030102":"黎母山镇","469030103":"和平镇","469030104":"长征镇","469030105":"红毛镇","469030106":"中平镇","469030201":"上安乡","469030202":"什运乡","469030402":"国营阳江农场","469030403":"国营乌石农场","469030406":"国营加钗农场","469030407":"国营长征农场"},"500000":{"500100":"市辖区","500228":"梁平县","500229":"城口县","500230":"丰都县","500231":"垫江县","500232":"武隆县","500233":"忠县","500235":"云阳县","500236":"奉节县","500237":"巫山县","500238":"巫溪县","500240":"石柱土家族自治县","500241":"秀山土家族苗族自治县","500242":"酉阳土家族苗族自治县","500243":"彭水苗族土家族自治县"},"500100":{"500101":"万州区","500102":"涪陵区","500103":"渝中区","500104":"大渡口区","500105":"江北区","500106":"沙坪坝区","500107":"九龙坡区","500108":"南岸区","500109":"北碚区","500110":"綦江区","500111":"大足区","500112":"渝北区","500113":"巴南区","500114":"黔江区","500115":"长寿区","500116":"江津区","500117":"合川区","500118":"永川区","500119":"南川区","500120":"璧山区","500151":"铜梁区","500152":"潼南区","500153":"荣昌区","500154":"开州区"},"500228":{"5002282":"安胜乡","5002284":"梁平县农场","50022811":"聚奎镇","50022812":"合兴镇","500228001":"梁平县梁山街道","500228002":"梁平县双桂街道","500228101":"仁贤镇","500228102":"礼让镇","500228103":"云龙镇","500228104":"屏锦镇","500228106":"袁驿镇","500228107":"新盛镇","500228108":"福禄镇","500228109":"金带镇","500228111":"明达镇","500228112":"荫平镇","500228113":"和林镇","500228114":"回龙镇","500228115":"碧山镇","500228116":"虎城镇","500228117":"七星镇","500228118":"龙门镇","500228119":"文化镇","500228121":"石安镇","500228122":"柏家镇","500228123":"大观镇","500228124":"竹山镇","500228125":"蟠龙镇","500228126":"星桥镇","500228127":"曲水镇","500228201":"铁门乡","500228202":"龙胜乡","500228203":"复平乡","500228205":"紫照乡","500228401":"梁平县双桂工业园区"},"500229":{"50022911":"咸宜镇","50022921":"双河乡","50022922":"厚坪乡","500229001":"葛城街道","500229002":"复兴街道","500229102":"巴山镇","500229103":"坪坝镇","500229104":"庙坝镇","500229105":"明通镇","500229106":"修齐镇","500229107":"高观镇","500229108":"高燕镇","500229109":"东安镇","500229111":"高楠镇","500229201":"龙田乡","500229202":"北屏乡","500229205":"左岚乡","500229208":"沿河乡","500229211":"蓼子乡","500229212":"鸡鸣乡","500229214":"周溪乡","500229216":"明中乡","500229217":"治平乡","500229219":"岚天乡","500229221":"河鱼乡"},"500230":{"500230":"名山街道","50023011":"兴义镇","50023012":"兴龙镇","50023021":"三建乡","500230101":"虎威镇","500230102":"社坛镇","500230103":"三元镇","500230104":"许明寺镇","500230105":"董家镇","500230106":"树人镇","500230107":"十直镇","500230109":"高家镇","500230111":"双路镇","500230112":"江池镇","500230113":"龙河镇","500230114":"武平镇","500230115":"包鸾镇","500230116":"湛普镇","500230118":"南天湖镇","500230119":"保合镇","500230121":"仁沙镇","500230122":"龙孔镇","500230123":"暨龙镇","500230124":"双龙镇","500230125":"仙女湖镇","500230202":"青龙乡","500230206":"太平坝乡","500230207":"都督乡","500230209":"栗子乡"},"500231":{"50023111":"太平镇","50023112":"裴兴镇","500231001":"桂溪街道","500231002":"桂阳街道","500231101":"新民镇","500231102":"沙坪镇","500231103":"周嘉镇","500231104":"普顺镇","500231105":"永安镇","500231106":"高安镇","500231107":"高峰镇","500231108":"五洞镇","500231109":"澄溪镇","500231111":"鹤游镇","500231112":"坪山镇","500231113":"砚台镇","500231114":"曹回镇","500231115":"杠家镇","500231116":"包家镇","500231117":"白家镇","500231118":"永平镇","500231119":"三溪镇","500231121":"黄沙镇","500231122":"长龙镇","500231202":"沙河乡","500231204":"大石乡"},"500232":{"5002321":"巷口镇","5002322":"凤来乡","50023211":"土坎镇","50023221":"后坪苗族土家族乡","500232101":"火炉镇","500232102":"白马镇","500232103":"鸭江镇","500232104":"长坝镇","500232105":"江口镇","500232106":"平桥镇","500232107":"羊角镇","500232108":"仙女山镇","500232109":"桐梓镇","500232111":"和顺镇","500232112":"双河镇","500232202":"庙垭乡","500232203":"石桥苗族土家族乡","500232205":"黄莺乡","500232206":"沧沟乡","500232207":"文复苗族土家族乡","500232208":"土地乡","500232209":"白云乡","500232211":"浩口苗族仡佬族乡","500232212":"接龙乡","500232213":"赵家乡","500232214":"大洞河乡"},"500233":{"50023311":"官坝镇","50023312":"白石镇","50023321":"兴峰乡","500233001":"忠州街道","500233002":"白公街道","500233101":"新生镇","500233102":"任家镇","500233103":"乌杨镇","500233104":"洋渡镇","500233105":"东溪镇","500233106":"复兴镇","500233107":"石宝镇","500233108":"汝溪镇","500233109":"野鹤镇","500233111":"石黄镇","500233112":"马灌镇","500233113":"金鸡镇","500233114":"新立镇","500233115":"双桂镇","500233116":"拔山镇","500233117":"花桥镇","500233118":"永丰镇","500233119":"三汇镇","500233122":"黄金镇","500233201":"善广乡","500233203":"石子乡","500233204":"磨子土家族乡","500233206":"涂井乡","500233208":"金声乡"},"500235":{"50023513":"桑坪镇","50023514":"蔈草镇","500235001":"双江街道","500235002":"青龙街道","500235003":"人和街道","500235004":"盘龙街道","500235105":"龙角镇","500235107":"故陵镇","500235108":"红狮镇","500235115":"路阳镇","500235116":"农坝镇","500235118":"渠马镇","500235121":"黄石镇","500235122":"巴阳镇","500235123":"沙市镇","500235124":"鱼泉镇","500235125":"凤鸣镇","500235127":"宝坪镇","500235128":"南溪镇","500235129":"双土镇","500235131":"江口镇","500235132":"高阳镇","500235133":"平安镇","500235135":"云阳镇","500235136":"云安镇","500235137":"栖霞镇","500235138":"双龙镇","500235139":"泥溪镇","500235141":"养鹿镇","500235142":"水口镇","500235143":"堰坪镇","500235144":"龙洞镇","500235145":"后叶镇","500235146":"耀灵镇","500235147":"大阳镇","500235208":"外郎乡","500235215":"新津乡","500235216":"普安乡","500235218":"洞鹿乡","500235219":"石门乡","500235239":"上坝乡","500235242":"清水土家族自治乡"},"500236":{"50023612":"康乐镇","50023613":"新民镇","50023627":"康坪乡","500236001":"永安街道","500236002":"鱼复街道","500236003":"夔门街道","500236117":"白帝镇","500236118":"草堂镇","500236119":"汾河镇","500236121":"大树镇","500236122":"竹园镇","500236123":"公平镇","500236124":"朱衣镇","500236125":"甲高镇","500236126":"羊市镇","500236127":"吐祥镇","500236128":"兴隆镇","500236129":"青龙镇","500236131":"永乐镇","500236132":"安坪镇","500236133":"五马镇","500236134":"青莲镇","500236265":"岩湾乡","500236266":"平安乡","500236267":"红土乡","500236269":"石岗乡","500236272":"太和土家族乡","500236274":"鹤峰乡","500236275":"冯坪乡","500236276":"长安土家族乡","500236277":"龙桥土家族乡","500236278":"云雾土家族乡"},"500237":{"5002372":"红椿乡","50023711":"铜鼓镇","50023721":"建坪乡","500237001":"高唐街道","500237002":"龙门街道","500237101":"庙宇镇","500237102":"大昌镇","500237103":"福田镇","500237104":"龙溪镇","500237105":"双龙镇","500237106":"官阳镇","500237107":"骡坪镇","500237108":"抱龙镇","500237109":"官渡镇","500237111":"巫峡镇","500237207":"两坪乡","500237208":"曲尺乡","500237211":"大溪乡","500237214":"金坪乡","500237216":"平河乡","500237219":"当阳乡","500237222":"竹贤乡","500237225":"三溪乡","500237227":"培石乡","500237229":"笃坪乡","500237231":"邓家乡"},"500238":{"5002381":"城厢镇","5002384":"红池坝经济开发区","50023811":"峰灵镇","50023821":"长桂乡","50023824":"双阳乡","500238001":"宁河街道","500238002":"柏杨街道","500238101":"凤凰镇","500238102":"宁厂镇","500238103":"上磺镇","500238104":"古路镇","500238105":"文峰镇","500238106":"徐家镇","500238107":"白鹿镇","500238108":"尖山镇","500238109":"下堡镇","500238111":"塘坊镇","500238112":"朝阳镇","500238113":"田坝镇","500238114":"通城镇","500238115":"菱角镇","500238116":"蒲莲镇","500238117":"土城镇","500238204":"胜利乡","500238207":"大河乡","500238208":"天星乡","500238226":"鱼鳞乡","500238227":"乌龙乡","500238234":"中岗乡","500238237":"花台乡","500238239":"兰英乡","500238242":"中梁乡","500238243":"天元乡"},"500240":{"500240":"下路街道","50024011":"龙沙镇","50024021":"石家乡","500240101":"西沱镇","500240103":"悦崃镇","500240104":"临溪镇","500240105":"黄水镇","500240106":"马武镇","500240107":"沙子镇","500240108":"王场镇","500240109":"沿溪镇","500240111":"鱼池镇","500240112":"三河镇","500240113":"大歇镇","500240114":"桥头镇","500240115":"万朝镇","500240116":"冷水镇","500240117":"黄鹤镇","500240203":"黎场乡","500240204":"三星乡","500240205":"六塘乡","500240207":"三益乡","500240208":"王家乡","500240209":"河嘴乡","500240212":"枫木乡","500240213":"中益乡","500240214":"洗新乡","500240216":"龙潭乡","500240217":"新乐乡","500240218":"金铃乡","500240219":"金竹乡"},"500241":{"50024111":"雅江镇","500241001":"中和街道","500241002":"乌杨街道","500241003":"平凯街道","500241102":"清溪场镇","500241103":"隘口镇","500241104":"溶溪镇","500241105":"官庄镇","500241106":"龙池镇","500241107":"石堤镇","500241108":"峨溶镇","500241109":"洪安镇","500241111":"石耶镇","500241112":"梅江镇","500241113":"兰桥镇","500241114":"膏田镇","500241115":"溪口镇","500241116":"妙泉镇","500241117":"宋农镇","500241118":"里仁镇","500241119":"钟灵镇","500241201":"孝溪乡","500241207":"海洋乡","500241208":"大溪乡","500241211":"涌洞乡","500241214":"中平乡","500241215":"岑溪乡"},"500242":{"5002422":"涂市乡","50024211":"泔溪镇","50024221":"后坪乡","50024222":"清泉乡","500242001":"桃花源街道","500242002":"钟多街道","500242101":"龙潭镇","500242102":"麻旺镇","500242103":"酉酬镇","500242104":"大溪镇","500242105":"兴隆镇","500242106":"黑水镇","500242107":"丁市镇","500242108":"龚滩镇","500242109":"李溪镇","500242111":"酉水河镇","500242112":"苍岭镇","500242113":"小河镇","500242114":"板溪镇","500242202":"铜鼓乡","500242204":"可大乡","500242205":"偏柏乡","500242206":"五福乡","500242207":"木叶乡","500242208":"毛坝乡","500242209":"花田乡","500242211":"天馆乡","500242212":"宜居乡","500242213":"万木乡","500242214":"两罾乡","500242215":"板桥乡","500242216":"官清乡","500242217":"南腰界乡","500242218":"车田乡","500242219":"腴地乡","500242221":"庙溪乡","500242222":"浪坪乡","500242223":"双泉乡","500242224":"楠木乡"},"500243":{"50024311":"万足镇","50024321":"走马乡","500243001":"汉葭街道","500243002":"绍庆街道","500243003":"靛水街道","500243101":"保家镇","500243102":"郁山镇","500243103":"高谷镇","500243104":"桑柘镇","500243105":"鹿角镇","500243106":"黄家镇","500243107":"普子镇","500243108":"龙射镇","500243109":"连湖镇","500243111":"平安镇","500243112":"长生镇","500243113":"新田镇","500243114":"鞍子镇","500243115":"太原镇","500243116":"龙溪镇","500243117":"梅子垭镇","500243118":"大同镇","500243201":"岩东乡","500243202":"鹿鸣乡","500243204":"棣棠乡","500243206":"三义乡","500243207":"联合乡","500243208":"石柳乡","500243211":"芦塘乡","500243213":"乔梓乡","500243217":"诸佛乡","500243219":"桐楼乡","500243222":"善感乡","500243223":"双龙乡","500243224":"石盘乡","500243225":"大垭乡","500243226":"润溪乡","500243227":"朗溪乡","500243228":"龙塘乡"},"510000":{"510100":"成都市","510300":"自贡市","510400":"攀枝花市","510500":"泸州市","510600":"德阳市","510700":"绵阳市","510800":"广元市","510900":"遂宁市","511000":"内江市","511100":"乐山市","511300":"南充市","511400":"眉山市","511500":"宜宾市","511600":"广安市","511700":"达州市","511800":"雅安市","511900":"巴中市","512000":"资阳市","513200":"阿坝藏族羌族自治州","513300":"甘孜藏族自治州","513400":"凉山彝族自治州"},"510100":{"510104":"锦江区","510105":"青羊区","510106":"金牛区","510107":"武侯区","510108":"成华区","510112":"龙泉驿区","510113":"青白江区","510114":"新都区","510115":"温江区","510116":"双流区","510121":"金堂县","510124":"郫县","510129":"大邑县","510131":"蒲江县","510132":"新津县","510181":"都江堰市","510182":"彭州市","510183":"邛崃市","510184":"崇州市","510185":"简阳市"},"510300":{"510302":"自流井区","510303":"贡井区","510304":"大安区","510311":"沿滩区","510321":"荣县","510322":"富顺县"},"510400":{"510402":"东区","510403":"西区","510411":"仁和区","510421":"米易县","510422":"盐边县"},"510500":{"510502":"江阳区","510503":"纳溪区","510504":"龙马潭区","510521":"泸县","510522":"合江县","510524":"叙永县","510525":"古蔺县"},"510600":{"510603":"旌阳区","510623":"中江县","510626":"罗江县","510681":"广汉市","510682":"什邡市","510683":"绵竹市"},"510700":{"510703":"涪城区","510704":"游仙区","510705":"安州区","510722":"三台县","510723":"盐亭县","510725":"梓潼县","510726":"北川羌族自治县","510727":"平武县","510781":"江油市"},"510800":{"510802":"利州区","510811":"昭化区","510812":"朝天区","510821":"旺苍县","510822":"青川县","510823":"剑阁县","510824":"苍溪县"},"510900":{"510903":"船山区","510904":"安居区","510921":"蓬溪县","510922":"射洪县","510923":"大英县"},"511000":{"511002":"市中区","511011":"东兴区","511024":"威远县","511025":"资中县","511028":"隆昌县"},"511100":{"511102":"市中区","511111":"沙湾区","511112":"五通桥区","511113":"金口河区","511123":"犍为县","511124":"井研县","511126":"夹江县","511129":"沐川县","511132":"峨边彝族自治县","511133":"马边彝族自治县","511181":"峨眉山市"},"511300":{"511302":"顺庆区","511303":"高坪区","511304":"嘉陵区","511321":"南部县","511322":"营山县","511323":"蓬安县","511324":"仪陇县","511325":"西充县","511381":"阆中市"},"511400":{"511402":"东坡区","511403":"彭山区","511421":"仁寿县","511423":"洪雅县","511424":"丹棱县","511425":"青神县"},"511500":{"511502":"翠屏区","511503":"南溪区","511521":"宜宾县","511523":"江安县","511524":"长宁县","511525":"高县","511526":"珙县","511527":"筠连县","511528":"兴文县","511529":"屏山县"},"511600":{"511602":"广安区","511603":"前锋区","511621":"岳池县","511622":"武胜县","511623":"邻水县","511681":"华蓥市"},"511700":{"511702":"通川区","511703":"达川区","511722":"宣汉县","511723":"开江县","511724":"大竹县","511725":"渠县","511781":"万源市"},"511800":{"511802":"雨城区","511803":"名山区","511822":"荥经县","511823":"汉源县","511824":"石棉县","511825":"天全县","511826":"芦山县","511827":"宝兴县"},"511900":{"511902":"巴州区","511903":"恩阳区","511921":"通江县","511922":"南江县","511923":"平昌县"},"512000":{"512002":"雁江区","512021":"安岳县","512022":"乐至县"},"513200":{"513201":"马尔康市","513221":"汶川县","513222":"理县","513223":"茂县","513224":"松潘县","513225":"九寨沟县","513226":"金川县","513227":"小金县","513228":"黑水县","513230":"壤塘县","513231":"阿坝县","513232":"若尔盖县","513233":"红原县"},"513300":{"513301":"康定市","513322":"泸定县","513323":"丹巴县","513324":"九龙县","513325":"雅江县","513326":"道孚县","513327":"炉霍县","513328":"甘孜县","513329":"新龙县","513330":"德格县","513331":"白玉县","513332":"石渠县","513333":"色达县","513334":"理塘县","513335":"巴塘县","513336":"乡城县","513337":"稻城县","513338":"得荣县"},"513400":{"513401":"西昌市","513422":"木里藏族自治县","513423":"盐源县","513424":"德昌县","513425":"会理县","513426":"会东县","513427":"宁南县","513428":"普格县","513429":"布拖县","513430":"金阳县","513431":"昭觉县","513432":"喜德县","513433":"冕宁县","513434":"越西县","513435":"甘洛县","513436":"美姑县","513437":"雷波县"},"520000":{"520100":"贵阳市","520200":"六盘水市","520300":"遵义市","520400":"安顺市","520500":"毕节市","520600":"铜仁市","522300":"黔西南布依族苗族自治州","522600":"黔东南苗族侗族自治州","522700":"黔南布依族苗族自治州"},"520100":{"520102":"南明区","520103":"云岩区","520111":"花溪区","520112":"乌当区","520113":"白云区","520115":"观山湖区","520121":"开阳县","520122":"息烽县","520123":"修文县","520181":"清镇市"},"520200":{"520201":"钟山区","520203":"六枝特区","520221":"水城县","520222":"盘县"},"520300":{"520302":"红花岗区","520303":"汇川区","520304":"播州区","520322":"桐梓县","520323":"绥阳县","520324":"正安县","520325":"道真仡佬族苗族自治县","520326":"务川仡佬族苗族自治县","520327":"凤冈县","520328":"湄潭县","520329":"余庆县","520330":"习水县","520381":"赤水市","520382":"仁怀市"},"520400":{"520402":"西秀区","520403":"平坝区","520422":"普定县","520423":"镇宁布依族苗族自治县","520424":"关岭布依族苗族自治县","520425":"紫云苗族布依族自治县"},"520500":{"520502":"七星关区","520521":"大方县","520522":"黔西县","520523":"金沙县","520524":"织金县","520525":"纳雍县","520526":"威宁彝族回族苗族自治县","520527":"赫章县"},"520600":{"520602":"碧江区","520603":"万山区","520621":"江口县","520622":"玉屏侗族自治县","520623":"石阡县","520624":"思南县","520625":"印江土家族苗族自治县","520626":"德江县","520627":"沿河土家族自治县","520628":"松桃苗族自治县"},"522300":{"522301":"兴义市","522322":"兴仁县","522323":"普安县","522324":"晴隆县","522325":"贞丰县","522326":"望谟县","522327":"册亨县","522328":"安龙县"},"522600":{"522601":"凯里市","522622":"黄平县","522623":"施秉县","522624":"三穗县","522625":"镇远县","522626":"岑巩县","522627":"天柱县","522628":"锦屏县","522629":"剑河县","522630":"台江县","522631":"黎平县","522632":"榕江县","522633":"从江县","522634":"雷山县","522635":"麻江县","522636":"丹寨县"},"522700":{"522701":"都匀市","522702":"福泉市","522722":"荔波县","522723":"贵定县","522725":"瓮安县","522726":"独山县","522727":"平塘县","522728":"罗甸县","522729":"长顺县","522730":"龙里县","522731":"惠水县","522732":"三都水族自治县"},"530000":{"530100":"昆明市","530300":"曲靖市","530400":"玉溪市","530500":"保山市","530600":"昭通市","530700":"丽江市","530800":"普洱市","530900":"临沧市","532300":"楚雄彝族自治州","532500":"红河哈尼族彝族自治州","532600":"文山壮族苗族自治州","532800":"西双版纳傣族自治州","532900":"大理白族自治州","533100":"德宏傣族景颇族自治州","533300":"怒江傈僳族自治州","533400":"迪庆藏族自治州"},"530100":{"530102":"五华区","530103":"盘龙区","530111":"官渡区","530112":"西山区","530113":"东川区","530114":"呈贡区","530122":"晋宁县","530124":"富民县","530125":"宜良县","530126":"石林彝族自治县","530127":"嵩明县","530128":"禄劝彝族苗族自治县","530129":"寻甸回族彝族自治县","530181":"安宁市"},"530300":{"530302":"麒麟区","530303":"沾益区","530321":"马龙县","530322":"陆良县","530323":"师宗县","530324":"罗平县","530325":"富源县","530326":"会泽县","530381":"宣威市"},"530400":{"530402":"红塔区","530403":"江川区","530422":"澄江县","530423":"通海县","530424":"华宁县","530425":"易门县","530426":"峨山彝族自治县","530427":"新平彝族傣族自治县","530428":"元江哈尼族彝族傣族自治县"},"530500":{"530502":"隆阳区","530521":"施甸县","530523":"龙陵县","530524":"昌宁县","530581":"腾冲市"},"530600":{"530602":"昭阳区","530621":"鲁甸县","530622":"巧家县","530623":"盐津县","530624":"大关县","530625":"永善县","530626":"绥江县","530627":"镇雄县","530628":"彝良县","530629":"威信县","530630":"水富县"},"530700":{"530702":"古城区","530721":"玉龙纳西族自治县","530722":"永胜县","530723":"华坪县","530724":"宁蒗彝族自治县"},"530800":{"530802":"思茅区","530821":"宁洱哈尼族彝族自治县","530822":"墨江哈尼族自治县","530823":"景东彝族自治县","530824":"景谷傣族彝族自治县","530825":"镇沅彝族哈尼族拉祜族自治县","530826":"江城哈尼族彝族自治县","530827":"孟连傣族拉祜族佤族自治县","530828":"澜沧拉祜族自治县","530829":"西盟佤族自治县"},"530900":{"530902":"临翔区","530921":"凤庆县","530922":"云县","530923":"永德县","530924":"镇康县","530925":"双江拉祜族佤族布朗族傣族自治县","530926":"耿马傣族佤族自治县","530927":"沧源佤族自治县"},"532300":{"532301":"楚雄市","532322":"双柏县","532323":"牟定县","532324":"南华县","532325":"姚安县","532326":"大姚县","532327":"永仁县","532328":"元谋县","532329":"武定县","532331":"禄丰县"},"532500":{"532501":"个旧市","532502":"开远市","532503":"蒙自市","532504":"弥勒市","532523":"屏边苗族自治县","532524":"建水县","532525":"石屏县","532527":"泸西县","532528":"元阳县","532529":"红河县","532530":"金平苗族瑶族傣族自治县","532531":"绿春县","532532":"河口瑶族自治县"},"532600":{"532601":"文山市","532622":"砚山县","532623":"西畴县","532624":"麻栗坡县","532625":"马关县","532626":"丘北县","532627":"广南县","532628":"富宁县"},"532800":{"532801":"景洪市","532822":"勐海县","532823":"勐腊县"},"532900":{"532901":"大理市","532922":"漾濞彝族自治县","532923":"祥云县","532924":"宾川县","532925":"弥渡县","532926":"南涧彝族自治县","532927":"巍山彝族回族自治县","532928":"永平县","532929":"云龙县","532930":"洱源县","532931":"剑川县","532932":"鹤庆县"},"533100":{"533102":"瑞丽市","533103":"芒市","533122":"梁河县","533123":"盈江县","533124":"陇川县"},"533300":{"533301":"泸水市","533323":"福贡县","533324":"贡山独龙族怒族自治县","533325":"兰坪白族普米族自治县"},"533400":{"533401":"香格里拉市","533422":"德钦县","533423":"维西傈僳族自治县"},"540000":{"540100":"拉萨市","540200":"日喀则市","540300":"昌都市","540400":"林芝市","540500":"山南市","542400":"那曲地区","542500":"阿里地区"},"540100":{"540102":"城关区","540103":"堆龙德庆区","540121":"林周县","540122":"当雄县","540123":"尼木县","540124":"曲水县","540126":"达孜县","540127":"墨竹工卡县"},"540200":{"540202":"桑珠孜区","540221":"南木林县","540222":"江孜县","540223":"定日县","540224":"萨迦县","540225":"拉孜县","540226":"昂仁县","540227":"谢通门县","540228":"白朗县","540229":"仁布县","540230":"康马县","540231":"定结县","540232":"仲巴县","540233":"亚东县","540234":"吉隆县","540235":"聂拉木县","540236":"萨嘎县","540237":"岗巴县"},"540300":{"540302":"卡若区","540321":"江达县","540322":"贡觉县","540323":"类乌齐县","540324":"丁青县","540325":"察雅县","540326":"八宿县","540327":"左贡县","540328":"芒康县","540329":"洛隆县","540330":"边坝县"},"540400":{"540402":"巴宜区","540421":"工布江达县","540422":"米林县","540423":"墨脱县","540424":"波密县","540425":"察隅县","540426":"朗县"},"540500":{"540502":"乃东区","540521":"扎囊县","540522":"贡嘎县","540523":"桑日县","540524":"琼结县","540525":"曲松县","540526":"措美县","540527":"洛扎县","540528":"加查县","540529":"隆子县","540530":"错那县","540531":"浪卡子县"},"542400":{"542421":"那曲县","542422":"嘉黎县","542423":"比如县","542424":"聂荣县","542425":"安多县","542426":"申扎县","542427":"索县","542428":"班戈县","542429":"巴青县","542430":"尼玛县","542431":"双湖县"},"542500":{"542521":"普兰县","542522":"札达县","542523":"噶尔县","542524":"日土县","542525":"革吉县","542526":"改则县","542527":"措勤县"},"610000":{"610100":"西安市","610200":"铜川市","610300":"宝鸡市","610400":"咸阳市","610500":"渭南市","610600":"延安市","610700":"汉中市","610800":"榆林市","610900":"安康市","611000":"商洛市"},"610100":{"610102":"新城区","610103":"碑林区","610104":"莲湖区","610111":"灞桥区","610112":"未央区","610113":"雁塔区","610114":"阎良区","610115":"临潼区","610116":"长安区","610117":"高陵区","610122":"蓝田县","610124":"周至县","610125":"户县"},"610200":{"610202":"王益区","610203":"印台区","610204":"耀州区","610222":"宜君县"},"610300":{"610302":"渭滨区","610303":"金台区","610304":"陈仓区","610322":"凤翔县","610323":"岐山县","610324":"扶风县","610326":"眉县","610327":"陇县","610328":"千阳县","610329":"麟游县","610330":"凤县","610331":"太白县"},"610400":{"610402":"秦都区","610403":"杨陵区","610404":"渭城区","610422":"三原县","610423":"泾阳县","610424":"乾县","610425":"礼泉县","610426":"永寿县","610427":"彬县","610428":"长武县","610429":"旬邑县","610430":"淳化县","610431":"武功县","610481":"兴平市"},"610500":{"610502":"临渭区","610503":"华州区","610522":"潼关县","610523":"大荔县","610524":"合阳县","610525":"澄城县","610526":"蒲城县","610527":"白水县","610528":"富平县","610581":"韩城市","610582":"华阴市"},"610600":{"610602":"宝塔区","610603":"安塞区","610621":"延长县","610622":"延川县","610623":"子长县","610625":"志丹县","610626":"吴起县","610627":"甘泉县","610628":"富县","610629":"洛川县","610630":"宜川县","610631":"黄龙县","610632":"黄陵县"},"610700":{"610702":"汉台区","610721":"南郑县","610722":"城固县","610723":"洋县","610724":"西乡县","610725":"勉县","610726":"宁强县","610727":"略阳县","610728":"镇巴县","610729":"留坝县","610730":"佛坪县"},"610800":{"610802":"榆阳区","610803":"横山区","610821":"神木县","610822":"府谷县","610824":"靖边县","610825":"定边县","610826":"绥德县","610827":"米脂县","610828":"佳县","610829":"吴堡县","610830":"清涧县","610831":"子洲县"},"610900":{"610902":"汉滨区","610921":"汉阴县","610922":"石泉县","610923":"宁陕县","610924":"紫阳县","610925":"岚皋县","610926":"平利县","610927":"镇坪县","610928":"旬阳县","610929":"白河县"},"611000":{"611002":"商州区","611021":"洛南县","611022":"丹凤县","611023":"商南县","611024":"山阳县","611025":"镇安县","611026":"柞水县"},"620000":{"620100":"兰州市","620200":"嘉峪关市","620300":"金昌市","620400":"白银市","620500":"天水市","620600":"武威市","620700":"张掖市","620800":"平凉市","620900":"酒泉市","621000":"庆阳市","621100":"定西市","621200":"陇南市","622900":"临夏回族自治州","623000":"甘南藏族自治州"},"620100":{"620102":"城关区","620103":"七里河区","620104":"西固区","620105":"安宁区","620111":"红古区","620121":"永登县","620122":"皋兰县","620123":"榆中县"},"620200":{},"620300":{"620302":"金川区","620321":"永昌县"},"620400":{"620402":"白银区","620403":"平川区","620421":"靖远县","620422":"会宁县","620423":"景泰县"},"620500":{"620502":"秦州区","620503":"麦积区","620521":"清水县","620522":"秦安县","620523":"甘谷县","620524":"武山县","620525":"张家川回族自治县"},"620600":{"620602":"凉州区","620621":"民勤县","620622":"古浪县","620623":"天祝藏族自治县"},"620700":{"620702":"甘州区","620721":"肃南裕固族自治县","620722":"民乐县","620723":"临泽县","620724":"高台县","620725":"山丹县"},"620800":{"620802":"崆峒区","620821":"泾川县","620822":"灵台县","620823":"崇信县","620824":"华亭县","620825":"庄浪县","620826":"静宁县"},"620900":{"620902":"肃州区","620921":"金塔县","620922":"瓜州县","620923":"肃北蒙古族自治县","620924":"阿克塞哈萨克族自治县","620981":"玉门市","620982":"敦煌市"},"621000":{"621002":"西峰区","621021":"庆城县","621022":"环县","621023":"华池县","621024":"合水县","621025":"正宁县","621026":"宁县","621027":"镇原县"},"621100":{"621102":"安定区","621121":"通渭县","621122":"陇西县","621123":"渭源县","621124":"临洮县","621125":"漳县","621126":"岷县"},"621200":{"621202":"武都区","621221":"成县","621222":"文县","621223":"宕昌县","621224":"康县","621225":"西和县","621226":"礼县","621227":"徽县","621228":"两当县"},"622900":{"622901":"临夏市","622921":"临夏县","622922":"康乐县","622923":"永靖县","622924":"广河县","622925":"和政县","622926":"东乡族自治县","622927":"积石山保安族东乡族撒拉族自治县"},"623000":{"623001":"合作市","623021":"临潭县","623022":"卓尼县","623023":"舟曲县","623024":"迭部县","623025":"玛曲县","623026":"碌曲县","623027":"夏河县"},"630000":{"630100":"西宁市","630200":"海东市","632200":"海北藏族自治州","632300":"黄南藏族自治州","632500":"海南藏族自治州","632600":"果洛藏族自治州","632700":"玉树藏族自治州","632800":"海西蒙古族藏族自治州"},"630100":{"630102":"城东区","630103":"城中区","630104":"城西区","630105":"城北区","630121":"大通回族土族自治县","630122":"湟中县","630123":"湟源县"},"630200":{"630202":"乐都区","630203":"平安区","630222":"民和回族土族自治县","630223":"互助土族自治县","630224":"化隆回族自治县","630225":"循化撒拉族自治县"},"632200":{"632221":"门源回族自治县","632222":"祁连县","632223":"海晏县","632224":"刚察县"},"632300":{"632321":"同仁县","632322":"尖扎县","632323":"泽库县","632324":"河南蒙古族自治县"},"632500":{"632521":"共和县","632522":"同德县","632523":"贵德县","632524":"兴海县","632525":"贵南县"},"632600":{"632621":"玛沁县","632622":"班玛县","632623":"甘德县","632624":"达日县","632625":"久治县","632626":"玛多县"},"632700":{"632701":"玉树市","632722":"杂多县","632723":"称多县","632724":"治多县","632725":"囊谦县","632726":"曲麻莱县"},"632800":{"632801":"格尔木市","632802":"德令哈市","632821":"乌兰县","632822":"都兰县","632823":"天峻县"},"640000":{"640100":"银川市","640200":"石嘴山市","640300":"吴忠市","640400":"固原市","640500":"中卫市"},"640100":{"640104":"兴庆区","640105":"西夏区","640106":"金凤区","640121":"永宁县","640122":"贺兰县","640181":"灵武市"},"640200":{"640202":"大武口区","640205":"惠农区","640221":"平罗县"},"640300":{"640302":"利通区","640303":"红寺堡区","640323":"盐池县","640324":"同心县","640381":"青铜峡市"},"640400":{"640402":"原州区","640422":"西吉县","640423":"隆德县","640424":"泾源县","640425":"彭阳县"},"640500":{"640502":"沙坡头区","640521":"中宁县","640522":"海原县"},"650000":{"650100":"乌鲁木齐市","650200":"克拉玛依市","650400":"吐鲁番市","650500":"哈密市","652300":"昌吉回族自治州","652700":"博尔塔拉蒙古自治州","652800":"巴音郭楞蒙古自治州","652900":"阿克苏地区","653000":"克孜勒苏柯尔克孜自治州","653100":"喀什地区","653200":"和田地区","654000":"伊犁哈萨克自治州","654200":"塔城地区","654300":"阿勒泰地区","659001":"石河子市","659002":"阿拉尔市","659003":"图木舒克市","659004":"五家渠市","659006":"铁门关市"},"650100":{"650102":"天山区","650103":"沙依巴克区","650104":"新市区","650105":"水磨沟区","650106":"头屯河区","650107":"达坂城区","650109":"米东区","650121":"乌鲁木齐县"},"650200":{"650202":"独山子区","650203":"克拉玛依区","650204":"白碱滩区","650205":"乌尔禾区"},"650400":{"650402":"高昌区","650421":"鄯善县","650422":"托克逊县"},"650500":{"650502":"伊州区","650521":"巴里坤哈萨克自治县","650522":"伊吾县"},"652300":{"652301":"昌吉市","652302":"阜康市","652323":"呼图壁县","652324":"玛纳斯县","652325":"奇台县","652327":"吉木萨尔县","652328":"木垒哈萨克自治县"},"652700":{"652701":"博乐市","652702":"阿拉山口市","652722":"精河县","652723":"温泉县"},"652800":{"652801":"库尔勒市","652822":"轮台县","652823":"尉犁县","652824":"若羌县","652825":"且末县","652826":"焉耆回族自治县","652827":"和静县","652828":"和硕县","652829":"博湖县"},"652900":{"652901":"阿克苏市","652922":"温宿县","652923":"库车县","652924":"沙雅县","652925":"新和县","652926":"拜城县","652927":"乌什县","652928":"阿瓦提县","652929":"柯坪县"},"653000":{"653001":"阿图什市","653022":"阿克陶县","653023":"阿合奇县","653024":"乌恰县"},"653100":{"653101":"喀什市","653121":"疏附县","653122":"疏勒县","653123":"英吉沙县","653124":"泽普县","653125":"莎车县","653126":"叶城县","653127":"麦盖提县","653128":"岳普湖县","653129":"伽师县","653130":"巴楚县","653131":"塔什库尔干塔吉克自治县"},"653200":{"653201":"和田市","653221":"和田县","653222":"墨玉县","653223":"皮山县","653224":"洛浦县","653225":"策勒县","653226":"于田县","653227":"民丰县"},"654000":{"654002":"伊宁市","654003":"奎屯市","654004":"霍尔果斯市","654021":"伊宁县","654022":"察布查尔锡伯自治县","654023":"霍城县","654024":"巩留县","654025":"新源县","654026":"昭苏县","654027":"特克斯县","654028":"尼勒克县"},"654200":{"654201":"塔城市","654202":"乌苏市","654221":"额敏县","654223":"沙湾县","654224":"托里县","654225":"裕民县","654226":"和布克赛尔蒙古自治县"},"654300":{"654301":"阿勒泰市","654321":"布尔津县","654322":"富蕴县","654323":"福海县","654324":"哈巴河县","654325":"青河县","654326":"吉木乃县"},"659001":{"6590011":"北泉镇","6590015":"兵团一五二团","659001001":"新城街道","659001002":"向阳街道","659001003":"红山街道","659001004":"老街街道","659001005":"东城街道","659001101":"石河子镇"},"659002":{"6590022":"托喀依乡","6590025":"兵团七团","65900252":"兵团三团","659002001":"金银川路街道","659002002":"幸福路街道","659002003":"青松路街道","659002004":"南口街道","659002402":"工业园区","659002501":"兵团八团","659002503":"兵团十团","659002504":"兵团十一团","659002505":"兵团十二团","659002506":"兵团十三团","659002507":"兵团十四团","659002509":"兵团十六团","659002511":"兵团第一师水利水电工程处","659002512":"兵团第一师塔里木灌区水利管理处","659002513":"阿拉尔农场","659002514":"兵团第一师幸福农场","659002515":"中心监狱","659002516":"兵团一团","659002517":"兵团农一师沙井子水利管理处","659002518":"西工业园区管理委员会","659002519":"兵团二团"},"659003":{"65900351":"兵团五十团","659003001":"齐干却勒街道","659003002":"前海街道","659003003":"永安坝街道","659003504":"兵团四十四团","659003509":"兵团四十九团","659003511":"兵团五十一团","659003513":"兵团五十三团","659003514":"兵团图木舒克市喀拉拜勒镇"},"659004":{"6590045":"兵团一零一团","659004001":"军垦路街道","659004002":"青湖路街道","659004003":"人民路街道","659004501":"兵团一零二团","659004502":"兵团一零三团"}, + "659006":{"6590061":"博古其镇","659006101":"双丰镇"}, + "710000":{"710100":"台湾省"}, + "710100":{"710101":"金门","710102":"连江","710103":"苗栗","710104":"南投","710105":"澎湖","710106":"屏东","710107":"台东","710108":"台中","710109":"台南","710110":"台北","710111":"桃园","710112":"云林","710113":"新北","710114":"彰化","710115":"嘉义","710116":"新竹","710117":"花莲","710118":"宜兰","710119":"高雄","710120":"基隆"}, + "910000":{"810000":"香港特别行政区","820000":"澳门特别行政区"}, + "810000":{"810101":"中西区","810102":"东区","810103":"九龙城区","810104":"观塘区","810105":"深水埗区","810106":"湾仔区","810107":"黄大仙区","810108":"油尖旺区","810109":"离岛区","810110":"葵青区","810111":"北区","810112":"西贡区","810113":"沙田区","810114":"屯门区","810115":"大埔区","810116":"荃湾区","810117":"元朗区","810118":"香港","810119":"九龙","810120":"新界"}, + "820000":{"820101":"离岛","820102":"澳门半岛","820103":"凼仔","820104":"路凼城","820105":"路环"} +} \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-tools/pom.xml b/jero-boot-base/jero-boot-base-tools/pom.xml new file mode 100644 index 00000000..961d9291 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/pom.xml @@ -0,0 +1,37 @@ + + + com.jero.boot + jero-boot-base + 2.4.2 + + 4.0.0 + 公共模块 + jero-boot-base-tools + + + + + org.springframework.boot + spring-boot-starter-web + true + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + cn.hutool + hutool-all + + + + commons-beanutils + commons-beanutils + + + + \ No newline at end of file diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/annotation/RabbitComponent.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/annotation/RabbitComponent.java new file mode 100644 index 00000000..3f548065 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/annotation/RabbitComponent.java @@ -0,0 +1,23 @@ +package com.jero.common.annotation; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Component; + +import java.lang.annotation.*; + +/** + * @Author:zyf + * @Date:2019-07-31 10:43 + * @Description: 消息队列初始化注解 + **/ +@Documented +@Inherited +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Component +public @interface RabbitComponent { + @AliasFor( + annotation = Component.class + ) + String value(); +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/base/BaseMap.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/base/BaseMap.java new file mode 100644 index 00000000..c26e5484 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/base/BaseMap.java @@ -0,0 +1,141 @@ +package com.jero.common.base; + + +import cn.hutool.core.util.ObjectUtil; + +import org.apache.commons.beanutils.ConvertUtils; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 自定义Map + */ +public class BaseMap extends HashMap { + + private static final long serialVersionUID = 1L; + + + public BaseMap() { + + } + + public BaseMap(Map map) { + this.putAll(map); + } + + + @Override + public BaseMap put(String key, Object value) { + super.put(key, Optional.ofNullable(value).orElse("")); + return this; + } + + public BaseMap add(String key, Object value) { + super.put(key, Optional.ofNullable(value).orElse("")); + return this; + } + + @SuppressWarnings("unchecked") + public T get(String key) { + Object obj = super.get(key); + if (ObjectUtil.isNotEmpty(obj)) { + return (T) obj; + } else { + return null; + } + } + + @SuppressWarnings("unchecked") + public Boolean getBoolean(String key) { + Object obj = super.get(key); + if (ObjectUtil.isNotEmpty(obj)) { + return Boolean.valueOf(obj.toString()); + } else { + return false; + } + } + + public Long getLong(String key) { + Object v = get(key); + if (ObjectUtil.isNotEmpty(v)) { + return new Long(v.toString()); + } + return null; + } + + public Long[] getLongs(String key) { + Object v = get(key); + if (ObjectUtil.isNotEmpty(v)) { + return (Long[]) v; + } + return null; + } + + public List getListLong(String key) { + List list = get(key); + if (ObjectUtil.isNotEmpty(list)) { + return list.stream().map(e -> new Long(e)).collect(Collectors.toList()); + } else { + return null; + } + } + + public Long[] getLongIds(String key) { + Object ids = get(key); + if (ObjectUtil.isNotEmpty(ids)) { + return (Long[]) ConvertUtils.convert(ids.toString().split(","), Long.class); + } else { + return null; + } + } + + + public Integer getInt(String key, Integer def) { + Object v = get(key); + if (ObjectUtil.isNotEmpty(v)) { + return Integer.parseInt(v.toString()); + } else { + return def; + } + } + + public Integer getInt(String key) { + Object v = get(key); + if (ObjectUtil.isNotEmpty(v)) { + return Integer.parseInt(v.toString()); + } else { + return 0; + } + } + + public BigDecimal getBigDecimal(String key) { + Object v = get(key); + if (ObjectUtil.isNotEmpty(v)) { + return new BigDecimal(v.toString()); + } + return new BigDecimal("0"); + } + + + @SuppressWarnings("unchecked") + public T get(String key, T def) { + Object obj = super.get(key); + if (ObjectUtil.isEmpty(obj)) { + return def; + } + return (T) obj; + } + + public static BaseMap toBaseMap(Map obj) { + BaseMap map = new BaseMap(); + map.putAll(obj); + return map; + } + + +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/config/CommonConfig.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/config/CommonConfig.java new file mode 100644 index 00000000..344cf6c6 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/config/CommonConfig.java @@ -0,0 +1,22 @@ +package com.jero.common.config; + +import com.jero.common.util.SpringContextHolder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CommonConfig { + + /** + * Spring上下文工具配置 + * + * @return + */ + @Bean + @ConditionalOnMissingBean(SpringContextHolder.class) + public SpringContextHolder springContextHolder() { + SpringContextHolder holder = new SpringContextHolder(); + return holder; + } +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/constant/GlobalConstants.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/constant/GlobalConstants.java new file mode 100644 index 00000000..b3a38066 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/constant/GlobalConstants.java @@ -0,0 +1,14 @@ +package com.jero.common.constant; + +public class GlobalConstants { + + /** + * 业务处理器beanName传递参数 + */ + public static final String HANDLER_NAME = "handlerName"; + + /** + * redis消息通道名称 + */ + public static final String REDIS_TOPIC_NAME="jero_redis_topic"; +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/clent/JeroRedisClient.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/clent/JeroRedisClient.java new file mode 100644 index 00000000..c88ab73c --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/clent/JeroRedisClient.java @@ -0,0 +1,43 @@ +package com.jero.common.modules.redis.clent; + +import com.jero.common.base.BaseMap; +import com.jero.common.constant.GlobalConstants; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.RedisTemplate; + +import javax.annotation.Resource; + +/** + * redis客户端 + */ +@Configuration +public class JeroRedisClient { + + @Resource(name = "starterRedisTemplate") + private RedisTemplate redisTemplate; + + + /** + * 发送消息 + * + * @param handlerName + * @param params + */ + public void sendMessage(String handlerName, BaseMap params) { + params.put(GlobalConstants.HANDLER_NAME, handlerName); + redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params); + } + + + /** + * 根据key查询缓存 + * + * @param key 键 + * @return 值 + */ + public T get(String key) { + return key == null ? null : (T) redisTemplate.opsForValue().get(key); + } + + +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/config/RedisConfiguration.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/config/RedisConfiguration.java new file mode 100644 index 00000000..9972c92c --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/config/RedisConfiguration.java @@ -0,0 +1,93 @@ +package com.jero.common.modules.redis.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jero.common.modules.redis.prop.JeroRedisProperties; +import com.jero.common.modules.redis.service.RedisReceiver; +import com.jero.common.constant.GlobalConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis配置 + * + */ +@Slf4j +@Configuration +@EnableConfigurationProperties(JeroRedisProperties.class) +@ConditionalOnProperty(value = "spring.redis.enabled", havingValue = "true", matchIfMissing = true) +public class RedisConfiguration { + + + /** + * RedisTemplate配置 + * + * @param lettuceConnectionFactory + * @return + */ + @Bean("starterRedisTemplate") + public RedisTemplate starterRedisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { + log.info(" --- redis config init --- "); + // 设置序列化 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + // 配置redisTemplate + RedisTemplate redisTemplate = new RedisTemplate(); + redisTemplate.setConnectionFactory(lettuceConnectionFactory); + RedisSerializer stringSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringSerializer);// key序列化 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化 + redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化 + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化 + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + /** + * redis 监听配置 + * + * @param redisConnectionFactory redis 配置 + * @return + */ + @Bean + public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory, RedisReceiver redisReceiver, MessageListenerAdapter commonListenerAdapter) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(redisConnectionFactory); + container.addMessageListener(commonListenerAdapter, new ChannelTopic(GlobalConstants.REDIS_TOPIC_NAME)); + return container; + } + + @Bean + MessageListenerAdapter commonListenerAdapter(RedisReceiver redisReceiver) { + MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(redisReceiver, "onMessage"); + messageListenerAdapter.setSerializer(jacksonSerializer()); + return messageListenerAdapter; + } + + private Jackson2JsonRedisSerializer jacksonSerializer() { + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + return jackson2JsonRedisSerializer; + } + + +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/listener/JeroRedisListerer.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/listener/JeroRedisListerer.java new file mode 100644 index 00000000..7146f70c --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/listener/JeroRedisListerer.java @@ -0,0 +1,12 @@ +package com.jero.common.modules.redis.listener; + +import com.jero.common.base.BaseMap; + +/** + * 自定义消息监听 + */ +public interface JeroRedisListerer { + + void onMessage(BaseMap message); + +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/prop/JeroRedisProperties.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/prop/JeroRedisProperties.java new file mode 100644 index 00000000..896c7648 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/prop/JeroRedisProperties.java @@ -0,0 +1,24 @@ +package com.jero.common.modules.redis.prop; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * redis配置 + * + * @author pangu + */ +@Getter +@Setter +@ConfigurationProperties(JeroRedisProperties.PREFIX) +public class JeroRedisProperties { + /** + * 前缀 + */ + public static final String PREFIX = "spring.redis"; + /** + * 是否开启Lettuce + */ + private Boolean enable = true; +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/service/RedisReceiver.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/service/RedisReceiver.java new file mode 100644 index 00000000..9ddb04f6 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/modules/redis/service/RedisReceiver.java @@ -0,0 +1,30 @@ +package com.jero.common.modules.redis.service; + + +import cn.hutool.core.util.ObjectUtil; +import com.jero.common.base.BaseMap; +import com.jero.common.constant.GlobalConstants; +import com.jero.common.modules.redis.listener.JeroRedisListerer; +import com.jero.common.util.SpringContextHolder; +import lombok.Data; +import org.springframework.stereotype.Component; + +@Component +@Data +public class RedisReceiver { + + + /** + * 接受消息并调用业务逻辑处理器 + * + * @param params + */ + public void onMessage(BaseMap params) { + Object handlerName = params.get(GlobalConstants.HANDLER_NAME); + JeroRedisListerer messageListener = SpringContextHolder.getHandler(handlerName.toString(), JeroRedisListerer.class); + if (ObjectUtil.isNotEmpty(messageListener)) { + messageListener.onMessage(params); + } + } + +} diff --git a/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/util/SpringContextHolder.java b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/util/SpringContextHolder.java new file mode 100644 index 00000000..2b5e7637 --- /dev/null +++ b/jero-boot-base/jero-boot-base-tools/src/main/java/com/jero/common/util/SpringContextHolder.java @@ -0,0 +1,81 @@ + +package com.jero.common.util; + +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +/** + * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. + * + * @author zyf + */ +@Slf4j +public class SpringContextHolder implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + /** + * 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + // NOSONAR + SpringContextHolder.applicationContext = applicationContext; + } + + /** + * 取得存储在静态变量中的ApplicationContext. + */ + public static ApplicationContext getApplicationContext() { + checkApplicationContext(); + return applicationContext; + } + + /** + * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(String name) { + checkApplicationContext(); + return (T) applicationContext.getBean(name); + } + + /** + * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getHandler(String name, Class cls) { + T t = null; + if (ObjectUtil.isNotEmpty(name)) { + checkApplicationContext(); + try { + t = applicationContext.getBean(name, cls); + } catch (Exception e) { + log.error("####################" + name + "未定义"); + } + } + return t; + } + + + /** + * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class clazz) { + checkApplicationContext(); + return applicationContext.getBean(clazz); + } + + /** + * 清除applicationContext静态变量. + */ + public static void cleanApplicationContext() { + applicationContext = null; + } + + private static void checkApplicationContext() { + if (applicationContext == null) { + throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder"); + } + } + +} \ No newline at end of file diff --git a/jero-boot-base/pom.xml b/jero-boot-base/pom.xml new file mode 100644 index 00000000..05e93b07 --- /dev/null +++ b/jero-boot-base/pom.xml @@ -0,0 +1,21 @@ + + + + com.jero.boot + jero-boot + 2.4.2 + + 4.0.0 + + jero-boot-base + pom + + + jero-boot-base-api + jero-boot-base-core + jero-boot-base-tools + + + \ No newline at end of file diff --git a/jero-boot-module-demo/pom.xml b/jero-boot-module-demo/pom.xml new file mode 100644 index 00000000..935a02e8 --- /dev/null +++ b/jero-boot-module-demo/pom.xml @@ -0,0 +1,32 @@ + + + + com.jero.boot + jero-boot + 2.4.2 + + 4.0.0 + + jero-boot-module-demo + + + + com.jero.boot + jero-boot-base-api + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/.gitattributes b/jero-boot-module-system/.gitattributes new file mode 100644 index 00000000..d479839e --- /dev/null +++ b/jero-boot-module-system/.gitattributes @@ -0,0 +1,4 @@ +*.js linguist-language=Java +*.css linguist-language=Java +*.html linguist-language=Java +*.vue linguist-language=Java diff --git a/jero-boot-module-system/Dockerfile b/jero-boot-module-system/Dockerfile new file mode 100644 index 00000000..28087e93 --- /dev/null +++ b/jero-boot-module-system/Dockerfile @@ -0,0 +1,15 @@ +FROM anapsix/alpine-java:8_server-jre_unlimited + +MAINTAINER test@163.com + +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + +RUN mkdir -p /jero-boot + +WORKDIR /jero-boot + +EXPOSE 8080 + +ADD ./target/jero-boot-module-system-2.4.2.jar ./ + +CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -jar jero-boot-module-system-2.4.2.jar \ No newline at end of file diff --git a/jero-boot-module-system/pom.xml b/jero-boot-module-system/pom.xml new file mode 100644 index 00000000..71c24b6a --- /dev/null +++ b/jero-boot-module-system/pom.xml @@ -0,0 +1,56 @@ + + + com.jero.boot + jero-boot + 2.4.2 + + 4.0.0 + + jero-boot-module-system + + + + aliyun + aliyun Repository + http://maven.aliyun.com/nexus/content/groups/public + + false + + + + jeecg + jeecg Repository + http://maven.jeecg.org/nexus/content/repositories/jeecg + + false + + + + + + + com.jero.boot + jero-boot-base-api + + + + + com.jimureport + spring-boot-starter-jimureport + 1.2.0 + + + autopoi-web + org.jeecgframework + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/config/init/SystemInitListener.java b/jero-boot-module-system/src/main/java/com/jero/config/init/SystemInitListener.java new file mode 100644 index 00000000..1eef933a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/config/init/SystemInitListener.java @@ -0,0 +1,41 @@ +package com.jero.config.init; + +import lombok.extern.slf4j.Slf4j; +import com.jero.common.constant.CacheConstant; +import com.jero.config.JeroCloudCondition; +import com.jero.modules.system.service.ISysGatewayRouteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Conditional; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; + +/** + * @desc: 启动程序,初始化路由配置 + * @author: flyme + */ +@Slf4j +@Component +@Conditional(JeroCloudCondition.class) +public class SystemInitListener implements ApplicationListener, Ordered { + + + @Autowired + private ISysGatewayRouteService sysGatewayRouteService; + + @Override + public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { + + log.info(" 服务已启动,初始化路由配置 ###################"); + if (applicationReadyEvent.getApplicationContext().getDisplayName().indexOf("AnnotationConfigServletWebServerApplicationContext") > -1) { + sysGatewayRouteService.addRoute2Redis(CacheConstant.GATEWAY_ROUTES); + } + + } + + @Override + public int getOrder() { + return 1; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/config/init/TomcatFactoryConfig.java b/jero-boot-module-system/src/main/java/com/jero/config/init/TomcatFactoryConfig.java new file mode 100644 index 00000000..8ca4f663 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/config/init/TomcatFactoryConfig.java @@ -0,0 +1,33 @@ +package com.jero.config.init; + +import org.apache.catalina.Context; +import org.apache.tomcat.util.scan.StandardJarScanner; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Description: TomcatFactoryConfig + * @author: scott + * @date: 2021年01月25日 11:40 + */ +@Configuration +public class TomcatFactoryConfig { + /** + * tomcat-embed-jasper引用后提示jar找不到的问题 + */ + @Bean + public TomcatServletWebServerFactory tomcatFactory() { + TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() { + @Override + protected void postProcessContext(Context context) { + ((StandardJarScanner) context.getJarScanner()).setScanManifest(false); + } + }; + factory.addConnectorCustomizers(connector -> { + connector.setProperty("relaxedPathChars", "[]{}"); + connector.setProperty("relaxedQueryChars", "[]{}"); + }); + return factory; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/config/jimureport/JimuReportTokenService.java b/jero-boot-module-system/src/main/java/com/jero/config/jimureport/JimuReportTokenService.java new file mode 100644 index 00000000..b483d386 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/config/jimureport/JimuReportTokenService.java @@ -0,0 +1,41 @@ +package com.jero.config.jimureport; + +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.util.RedisUtil; +import com.jero.common.util.TokenUtils; +import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +/** +* 自定义积木报表鉴权实现类(如果不进行自定义,则所有请求不做权限控制) + * 1.自定义获取登录token + * 2.自定义获取登录用户 +*/ +@Component +class JimuReportTokenService implements JmReportTokenServiceI { + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + @Lazy + private RedisUtil redisUtil; + + @Override + public String getToken(HttpServletRequest request) { + return TokenUtils.getTokenByRequest(request); + } + + @Override + public String getUsername(String token) { + return JwtUtil.getUsername(token); + } + + @Override + public Boolean verifyToken(String token) { + return TokenUtils.verifyToken(token, sysBaseAPI, redisUtil); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/api/controller/SystemAPIController.java b/jero-boot-module-system/src/main/java/com/jero/modules/api/controller/SystemAPIController.java new file mode 100644 index 00000000..0a69d5fd --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/api/controller/SystemAPIController.java @@ -0,0 +1,553 @@ +package com.jero.modules.api.controller; + +import cn.hutool.db.Page; +import com.alibaba.fastjson.JSONObject; +import com.jero.common.api.dto.OnlineAuthDTO; +import com.jero.common.api.dto.message.*; +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.common.system.vo.*; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + + +/** + * 服务化 system模块 对外接口请求类 + */ +@RestController +@RequestMapping("/sys/api") +public class SystemAPIController { + + @Autowired + private ISysBaseAPI sysBaseAPI; + + @Autowired + private ISysUserService sysUserService; + + @Autowired + private ISysDepartService sysDepartService; + /** + * 发送系统消息 + * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息 + */ + @PostMapping("/sendSysAnnouncement") + public void sendSysAnnouncement(@RequestBody MessageDTO message){ + sysBaseAPI.sendSysAnnouncement(message); + } + + /** + * 发送消息 附带业务参数 + * @param message 使用构造器赋值参数 + */ + @PostMapping("/sendBusAnnouncement") + public void sendBusAnnouncement(@RequestBody BusMessageDTO message){ + sysBaseAPI.sendBusAnnouncement(message); + } + + /** + * 通过模板发送消息 + * @param message 使用构造器赋值参数 + */ + @PostMapping("/sendTemplateAnnouncement") + public void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message){ + sysBaseAPI.sendTemplateAnnouncement(message); + } + + /** + * 通过模板发送消息 附带业务参数 + * @param message 使用构造器赋值参数 + */ + @PostMapping("/sendBusTemplateAnnouncement") + public void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message){ + sysBaseAPI.sendBusTemplateAnnouncement(message); + } + + /** + * 通过消息中心模板,生成推送内容 + * @param templateDTO 使用构造器赋值参数 + * @return + */ + @PostMapping("/parseTemplateByCode") + public String parseTemplateByCode(@RequestBody TemplateDTO templateDTO){ + return sysBaseAPI.parseTemplateByCode(templateDTO); + } + + /** + * 根据业务类型busType及业务busId修改消息已读 + */ + @GetMapping("/updateSysAnnounReadFlag") + public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId")String busId){ + sysBaseAPI.updateSysAnnounReadFlag(busType, busId); + } + + /** + * 根据用户账号查询用户信息 + * @param username + * @return + */ + @GetMapping("/getUserByName") + public LoginUser getUserByName(@RequestParam("username") String username){ + return sysBaseAPI.getUserByName(username); + } + + /** + * 根据用户id查询用户信息 + * @param id + * @return + */ + @GetMapping("/getUserById") + LoginUser getUserById(@RequestParam("id") String id){ + return sysBaseAPI.getUserById(id); + } + + /** + * 通过用户账号查询角色集合 + * @param username + * @return + */ + @GetMapping("/getRolesByUsername") + List getRolesByUsername(@RequestParam("username") String username){ + return sysBaseAPI.getRolesByUsername(username); + } + + /** + * 通过用户账号查询部门集合 + * @param username + * @return 部门 id + */ + @GetMapping("/getDepartIdsByUsername") + List getDepartIdsByUsername(@RequestParam("username") String username){ + return sysBaseAPI.getDepartIdsByUsername(username); + } + + /** + * 通过用户账号查询部门 name + * @param username + * @return 部门 name + */ + @GetMapping("/getDepartNamesByUsername") + List getDepartNamesByUsername(@RequestParam("username") String username){ + return sysBaseAPI.getDepartNamesByUsername(username); + } + + + /** + * 获取数据字典 + * @param code + * @return + */ + @GetMapping("/queryDictItemsByCode") + List queryDictItemsByCode(@RequestParam("code") String code){ + return sysBaseAPI.queryDictItemsByCode(code); + } + + /** 查询所有的父级字典,按照create_time排序 */ + @GetMapping("/queryAllDict") + List queryAllDict(){ + return sysBaseAPI.queryAllDict(); + } + + /** + * 查询所有分类字典 + * @return + */ + @GetMapping("/queryAllDSysCategory") + List queryAllDSysCategory(){ + return sysBaseAPI.queryAllDSysCategory(); + } + + /** + * 获取表数据字典 + * @param table + * @param text + * @param code + * @return + */ + @GetMapping("/queryTableDictItemsByCode") + List queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code){ + return sysBaseAPI.queryTableDictItemsByCode(table, text, code); + } + + /** + * 查询所有部门 作为字典信息 id -->value,departName -->text + * @return + */ + @GetMapping("/queryAllDepartBackDictModel") + List queryAllDepartBackDictModel(){ + return sysBaseAPI.queryAllDepartBackDictModel(); + } + + + /** + * 查询表字典 支持过滤数据 + * @param table + * @param text + * @param code + * @param filterSql + * @return + */ + @GetMapping("/queryFilterTableDictInfo") + List queryFilterTableDictInfo(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("filterSql") String filterSql){ + return sysBaseAPI.queryFilterTableDictInfo(table, text, code, filterSql); + } + + /** + * 查询指定table的 text code 获取字典,包含text和value + * @param table + * @param text + * @param code + * @param keyArray + * @return + */ + @Deprecated + @GetMapping("/queryTableDictByKeys") + public List queryTableDictByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keyArray") String[] keyArray){ + return sysBaseAPI.queryTableDictByKeys(table, text, code, keyArray); + } + + /** + * 获取所有角色 带参 + * roleIds 默认选中角色 + * @return + */ + @GetMapping("/queryAllRole") + public List queryAllRole(@RequestParam(name = "roleIds",required = false)String[] roleIds){ + if(roleIds==null || roleIds.length==0){ + return sysBaseAPI.queryAllRole(); + }else{ + return sysBaseAPI.queryAllRole(roleIds); + } + } + + /** + * 通过用户账号查询角色Id集合 + * @param username + * @return + */ + @GetMapping("/getRoleIdsByUsername") + public List getRoleIdsByUsername(@RequestParam("username")String username){ + return sysBaseAPI.getRoleIdsByUsername(username); + } + + /** + * 通过部门编号查询部门id + * @param orgCode + * @return + */ + @GetMapping("/getDepartIdsByOrgCode") + public String getDepartIdsByOrgCode(@RequestParam("orgCode")String orgCode){ + return sysBaseAPI.getDepartIdsByOrgCode(orgCode); + } + + /** + * 查询所有部门 + * @return + */ + @GetMapping("/getAllSysDepart") + public List getAllSysDepart(){ + return sysBaseAPI.getAllSysDepart(); + } + + /** + * 根据 id 查询数据库中存储的 DynamicDataSourceModel + * + * @param dbSourceId + * @return + */ + @GetMapping("/getDynamicDbSourceById") + DynamicDataSourceModel getDynamicDbSourceById(@RequestParam("dbSourceId")String dbSourceId){ + return sysBaseAPI.getDynamicDbSourceById(dbSourceId); + } + + + + /** + * 根据部门Id获取部门负责人 + * @param deptId + * @return + */ + @GetMapping("/getDeptHeadByDepId") + public List getDeptHeadByDepId(@RequestParam("deptId") String deptId){ + return sysBaseAPI.getDeptHeadByDepId(deptId); + } + + /** + * 查找父级部门 + * @param departId + * @return + */ + @GetMapping("/getParentDepartId") + public DictModel getParentDepartId(@RequestParam("departId")String departId){ + return sysBaseAPI.getParentDepartId(departId); + } + + /** + * 根据 code 查询数据库中存储的 DynamicDataSourceModel + * + * @param dbSourceCode + * @return + */ + @GetMapping("/getDynamicDbSourceByCode") + public DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode){ + return sysBaseAPI.getDynamicDbSourceByCode(dbSourceCode); + } + + /** + * 给指定用户发消息 + * @param userIds + * @param cmd + */ + @GetMapping("/sendWebSocketMsg") + public void sendWebSocketMsg(String[] userIds, String cmd){ + sysBaseAPI.sendWebSocketMsg(userIds, cmd); + } + + + /** + * 根据id获取所有参与用户 + * userIds + * @return + */ + @GetMapping("/queryAllUserByIds") + public List queryAllUserByIds(@RequestParam("userIds") String[] userIds){ + return sysBaseAPI.queryAllUserByIds(userIds); + } + + /** + * 查询所有用户 返回ComboModel + * @return + */ + @GetMapping("/queryAllUserBackCombo") + public List queryAllUserBackCombo(){ + return sysBaseAPI.queryAllUserBackCombo(); + } + + /** + * 分页查询用户 返回JSONObject + * @return + */ + @GetMapping("/queryAllUser") + public JSONObject queryAllUser(@RequestParam(name="userIds",required=false)String userIds, @RequestParam(name="pageNo",required=false) Integer pageNo,@RequestParam(name="pageSize",required=false) int pageSize){ + return sysBaseAPI.queryAllUser(userIds, pageNo, pageSize); + } + + + + /** + * 将会议签到信息推动到预览 + * userIds + * @return + * @param userId + */ + @GetMapping("/meetingSignWebsocket") + public void meetingSignWebsocket(@RequestParam("userId")String userId){ + sysBaseAPI.meetingSignWebsocket(userId); + } + + /** + * 根据name获取所有参与用户 + * userNames + * @return + */ + @GetMapping("/queryUserByNames") + public List queryUserByNames(@RequestParam("userNames")String[] userNames){ + return sysBaseAPI.queryUserByNames(userNames); + } + + /** + * 获取用户的角色集合 + * @param username + * @return + */ + @GetMapping("/getUserRoleSet") + public Set getUserRoleSet(@RequestParam("username")String username){ + return sysBaseAPI.getUserRoleSet(username); + } + + /** + * 获取用户的权限集合 + * @param username + * @return + */ + @GetMapping("/getUserPermissionSet") + public Set getUserPermissionSet(@RequestParam("username") String username){ + return sysBaseAPI.getUserPermissionSet(username); + } + + //----- + + /** + * 判断是否有online访问的权限 + * @param onlineAuthDTO + * @return + */ + @PostMapping("/hasOnlineAuth") + public boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO){ + return sysBaseAPI.hasOnlineAuth(onlineAuthDTO); + } + + /** + * 查询用户角色信息 + * @param username + * @return + */ + @GetMapping("/queryUserRoles") + public Set queryUserRoles(@RequestParam("username") String username){ + return sysUserService.getUserRolesSet(username); + } + + + /** + * 查询用户权限信息 + * @param username + * @return + */ + @GetMapping("/queryUserAuths") + public Set queryUserAuths(@RequestParam("username") String username){ + return sysUserService.getUserPermissionsSet(username); + } + + /** + * 通过部门id获取部门全部信息 + */ + @GetMapping("/selectAllById") + public SysDepartModel selectAllById(@RequestParam("id") String id){ + return sysBaseAPI.selectAllById(id); + } + + /** + * 根据用户id查询用户所属公司下所有用户ids + * @param userId + * @return + */ + @GetMapping("/queryDeptUsersByUserId") + public List queryDeptUsersByUserId(@RequestParam("userId") String userId){ + return sysBaseAPI.queryDeptUsersByUserId(userId); + } + + + /** + * 查询数据权限 + * @return + */ + @GetMapping("/queryPermissionDataRule") + public List queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath")String requestPath, @RequestParam("username") String username){ + return sysBaseAPI.queryPermissionDataRule(component, requestPath, username); + } + + /** + * 查询用户信息 + * @param username + * @return + */ + @GetMapping("/getCacheUser") + public SysUserCacheInfo getCacheUser(@RequestParam("username") String username){ + return sysBaseAPI.getCacheUser(username); + } + + /** + * 字典表的 翻译 + * @param table + * @param text + * @param code + * @param key + * @return + */ + @GetMapping("/translateDictFromTable") + public String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key){ + return sysBaseAPI.translateDictFromTable(table, text, code, key); + } + + /** + * 普通字典的翻译 + * @param code + * @param key + * @return + */ + @GetMapping("/translateDict") + public String translateDict(@RequestParam("code") String code, @RequestParam("key") String key){ + return sysBaseAPI.translateDict(code, key); + } + + + /** + * 36根据多个用户账号(逗号分隔),查询返回多个用户信息 + * @param usernames + * @return + */ + @GetMapping("/queryUsersByUsernames") + List queryUsersByUsernames(String usernames){ + return this.sysBaseAPI.queryUsersByUsernames(usernames); + } + + /** + * 37根据多个用户id(逗号分隔),查询返回多个用户信息 + * @param usernames + * @return + */ + @GetMapping("/queryUsersByIds") + List queryUsersByIds(String ids){ + return this.sysBaseAPI.queryUsersByIds(ids); + } + + /** + * 38根据多个部门编码(逗号分隔),查询返回多个部门信息 + * @param orgCodes + * @return + */ + @GetMapping("/queryDepartsByOrgcodes") + List queryDepartsByOrgcodes(String orgCodes){ + return this.sysBaseAPI.queryDepartsByOrgcodes(orgCodes); + } + + /** + * 39根据多个部门ID(逗号分隔),查询返回多个部门信息 + * @param orgCodes + * @return + */ + @GetMapping("/queryDepartsByIds") + List queryDepartsByIds(String orgCodes){ + return this.sysBaseAPI.queryDepartsByIds(orgCodes); + } + + /** + * 40发送邮件消息 + * @param email + * @param title + * @param content + */ + @GetMapping("/sendEmailMsg") + public void sendEmailMsg(@RequestParam("email")String email,@RequestParam("title")String title,@RequestParam("content")String content){ + this.sysBaseAPI.sendEmailMsg(email,title,content); + }; + /** + * 根据部门id查询部门所有的父级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:50 + * @param departId 部门id + */ + @GetMapping("/listParentDepartsByDepId") + List listParentDepartsByDepId(@RequestParam("departId") String departId){ + return sysDepartService.listParentDepartsByDepId(departId); + } + + @GetMapping("/listSonDepartsByDepId") + /** + * 根据部门id查询部门所有的子级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:54 + * @param departId 部门id + */ + List listSonDepartsByDepId(@RequestParam("departId") String departId){ + return sysDepartService.listSonDepartsByDepId(departId); + } + + + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/cas/controller/CasClientController.java b/jero-boot-module-system/src/main/java/com/jero/modules/cas/controller/CasClientController.java new file mode 100644 index 00000000..04109888 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/cas/controller/CasClientController.java @@ -0,0 +1,115 @@ +package com.jero.modules.cas.controller; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.crypto.SecureUtil; +import org.apache.commons.lang.StringUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.RedisUtil; +import com.jero.modules.cas.util.CASServiceUtil; +import com.jero.modules.cas.util.XmlUtils; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.service.ISysUserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +/** + *

+ * CAS单点登录客户端登录认证 + *

+ * + * @Author zhoujf + * @since 2018-12-20 + */ +@Slf4j +@RestController +@RequestMapping("/sys/cas/client") +public class CasClientController { + + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysDepartService sysDepartService; + @Autowired + private RedisUtil redisUtil; + + @Value("${cas.prefixUrl}") + private String prefixUrl; + + + @GetMapping("/validateLogin") + public Object validateLogin(@RequestParam(name="ticket") String ticket, + @RequestParam(name="service") String service, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + Result result = new Result(); + log.info("Rest api login."); + try { + String validateUrl = prefixUrl+"/p3/serviceValidate"; + String res = CASServiceUtil.getSTValidate(validateUrl, ticket, service); + log.info("res."+res); + final String error = XmlUtils.getTextForElement(res, "authenticationFailure"); + if(StringUtils.isNotEmpty(error)) { + throw new Exception(error); + } + final String principal = XmlUtils.getTextForElement(res, "user"); + if (StringUtils.isEmpty(principal)) { + throw new Exception("No principal was found in the response from the CAS server."); + } + log.info("-------token----username---"+principal); + //1. 校验用户是否有效 + SysUser sysUser = sysUserService.getUserByName(principal); + result = sysUserService.checkUserIsEffective(sysUser); + if(!result.isSuccess()) { + return result; + } + String token = JwtUtil.sign(sysUser.getUsername(), sysUser.getPassword()); + // 设置超时时间 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000); + + //获取用户部门信息 + JSONObject obj = new JSONObject(); + List departs = sysDepartService.queryUserDeparts(sysUser.getId()); + obj.put("departs", departs); + if (departs == null || departs.size() == 0) { + obj.put("multi_depart", 0); + } else if (departs.size() == 1) { + sysUserService.updateUserDepart(principal, departs.get(0).getOrgCode()); + obj.put("multi_depart", 1); + } else { + obj.put("multi_depart", 2); + } + obj.put("token", token); + obj.put("userInfo", sysUser); + result.setResult(obj); + result.success("登录成功"); + + } catch (Exception e) { + //e.printStackTrace(); + result.error500(e.getMessage()); + } + return new HttpEntity<>(result); + } + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/cas/util/CASServiceUtil.java b/jero-boot-module-system/src/main/java/com/jero/modules/cas/util/CASServiceUtil.java new file mode 100644 index 00000000..54922900 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/cas/util/CASServiceUtil.java @@ -0,0 +1,103 @@ +package com.jero.modules.cas.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.security.cert.X509Certificate; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.socket.LayeredConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +public class CASServiceUtil { + + public static void main(String[] args) { + String serviceUrl = "https://cas.8f8.com.cn:8443/cas/p3/serviceValidate"; + String service = "http://localhost:3003/user/login"; + String ticket = "ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3"; + String res = getSTValidate(serviceUrl,ticket, service); + + System.out.println("---------res-----"+res); + } + + + /** + * 验证ST + */ + public static String getSTValidate(String url,String st, String service){ + try { + url = url+"?service="+service+"&ticket="+st; + CloseableHttpClient httpclient = createHttpClientWithNoSsl(); + HttpGet httpget = new HttpGet(url); + HttpResponse response = httpclient.execute(httpget); + String res = readResponse(response); + return res == null ? null : (res == "" ? null : res); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + + /** + * 读取 response body 内容为字符串 + * + * @param response + * @return + * @throws IOException + */ + private static String readResponse(HttpResponse response) throws IOException { + BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); + String result = new String(); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + return result; + } + + + /** + * 创建模拟客户端(针对 https 客户端禁用 SSL 验证) + * + * @param cookieStore 缓存的 Cookies 信息 + * @return + * @throws Exception + */ + private static CloseableHttpClient createHttpClientWithNoSsl() throws Exception { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) { + // don't check + } + + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) { + // don't check + } + } + }; + + SSLContext ctx = SSLContext.getInstance("TLS"); + ctx.init(null, trustAllCerts, null); + LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx); + return HttpClients.custom() + .setSSLSocketFactory(sslSocketFactory) + .build(); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/cas/util/XmlUtils.java b/jero-boot-module-system/src/main/java/com/jero/modules/cas/util/XmlUtils.java new file mode 100644 index 00000000..f9e60b8f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/cas/util/XmlUtils.java @@ -0,0 +1,292 @@ +package com.jero.modules.cas.util; + + +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.w3c.dom.Document; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +import lombok.extern.slf4j.Slf4j; + +/** + * 解析cas,ST验证后的xml + * + */ +@Slf4j +public final class XmlUtils { + + /** + * Creates a new namespace-aware DOM document object by parsing the given XML. + * + * @param xml XML content. + * + * @return DOM document. + */ + public static Document newDocument(final String xml) { + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + final Map features = new HashMap(); + features.put(XMLConstants.FEATURE_SECURE_PROCESSING, true); + features.put("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + for (final Map.Entry entry : features.entrySet()) { + try { + factory.setFeature(entry.getKey(), entry.getValue()); + } catch (ParserConfigurationException e) { + log.warn("Failed setting XML feature {}: {}", entry.getKey(), e); + } + } + factory.setNamespaceAware(true); + try { + return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); + } catch (Exception e) { + throw new RuntimeException("XML parsing error: " + e); + } + } + + /** + * Get an instance of an XML reader from the XMLReaderFactory. + * + * @return the XMLReader. + */ + public static XMLReader getXmlReader() { + try { + final XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); + reader.setFeature("http://xml.org/sax/features/namespaces", true); + reader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); + reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + return reader; + } catch (final Exception e) { + throw new RuntimeException("Unable to create XMLReader", e); + } + } + + + /** + * Retrieve the text for a group of elements. Each text element is an entry + * in a list. + *

This method is currently optimized for the use case of two elements in a list. + * + * @param xmlAsString the xml response + * @param element the element to look for + * @return the list of text from the elements. + */ + public static List getTextForElements(final String xmlAsString, final String element) { + final List elements = new ArrayList(2); + final XMLReader reader = getXmlReader(); + + final DefaultHandler handler = new DefaultHandler() { + + private boolean foundElement = false; + + private StringBuilder buffer = new StringBuilder(); + + public void startElement(final String uri, final String localName, final String qName, + final Attributes attributes) throws SAXException { + if (localName.equals(element)) { + this.foundElement = true; + } + } + + public void endElement(final String uri, final String localName, final String qName) throws SAXException { + if (localName.equals(element)) { + this.foundElement = false; + elements.add(this.buffer.toString()); + this.buffer = new StringBuilder(); + } + } + + public void characters(char[] ch, int start, int length) throws SAXException { + if (this.foundElement) { + this.buffer.append(ch, start, length); + } + } + }; + + reader.setContentHandler(handler); + reader.setErrorHandler(handler); + + try { + reader.parse(new InputSource(new StringReader(xmlAsString))); + } catch (final Exception e) { + log.error(e.getMessage(), e); + return null; + } + + return elements; + } + + /** + * Retrieve the text for a specific element (when we know there is only + * one). + * + * @param xmlAsString the xml response + * @param element the element to look for + * @return the text value of the element. + */ + public static String getTextForElement(final String xmlAsString, final String element) { + final XMLReader reader = getXmlReader(); + final StringBuilder builder = new StringBuilder(); + + final DefaultHandler handler = new DefaultHandler() { + + private boolean foundElement = false; + + public void startElement(final String uri, final String localName, final String qName, + final Attributes attributes) throws SAXException { + if (localName.equals(element)) { + this.foundElement = true; + } + } + + public void endElement(final String uri, final String localName, final String qName) throws SAXException { + if (localName.equals(element)) { + this.foundElement = false; + } + } + + public void characters(char[] ch, int start, int length) throws SAXException { + if (this.foundElement) { + builder.append(ch, start, length); + } + } + }; + + reader.setContentHandler(handler); + reader.setErrorHandler(handler); + + try { + reader.parse(new InputSource(new StringReader(xmlAsString))); + } catch (final Exception e) { + log.error(e.getMessage(), e); + return null; + } + + return builder.toString(); + } + + + public static Map extractCustomAttributes(final String xml) { + final SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + spf.setValidating(false); + try { + final SAXParser saxParser = spf.newSAXParser(); + final XMLReader xmlReader = saxParser.getXMLReader(); + final CustomAttributeHandler handler = new CustomAttributeHandler(); + xmlReader.setContentHandler(handler); + xmlReader.parse(new InputSource(new StringReader(xml))); + return handler.getAttributes(); + } catch (final Exception e) { + log.error(e.getMessage(), e); + return Collections.emptyMap(); + } + } + + private static class CustomAttributeHandler extends DefaultHandler { + + private Map attributes; + + private boolean foundAttributes; + + private String currentAttribute; + + private StringBuilder value; + + @Override + public void startDocument() throws SAXException { + this.attributes = new HashMap(); + } + + @Override + public void startElement(final String namespaceURI, final String localName, final String qName, + final Attributes attributes) throws SAXException { + if ("attributes".equals(localName)) { + this.foundAttributes = true; + } else if (this.foundAttributes) { + this.value = new StringBuilder(); + this.currentAttribute = localName; + } + } + + @Override + public void characters(final char[] chars, final int start, final int length) throws SAXException { + if (this.currentAttribute != null) { + value.append(chars, start, length); + } + } + + @Override + public void endElement(final String namespaceURI, final String localName, final String qName) + throws SAXException { + if ("attributes".equals(localName)) { + this.foundAttributes = false; + this.currentAttribute = null; + } else if (this.foundAttributes) { + final Object o = this.attributes.get(this.currentAttribute); + + if (o == null) { + this.attributes.put(this.currentAttribute, this.value.toString()); + } else { + final List items; + if (o instanceof List) { + items = (List) o; + } else { + items = new LinkedList(); + items.add(o); + this.attributes.put(this.currentAttribute, items); + } + items.add(this.value.toString()); + } + } + } + + public Map getAttributes() { + return this.attributes; + } + } + + + public static void main(String[] args) { + String result = "\r\n" + + " \r\n" + + " admin\r\n" + + " \r\n" + + " UsernamePasswordCredential\r\n" + + " true\r\n" + + " 2019-08-01T19:33:21.527+08:00[Asia/Shanghai]\r\n" + + " RestAuthenticationHandler\r\n" + + " RestAuthenticationHandler\r\n" + + " false\r\n" + + " \r\n" + + " \r\n" + + ""; + + String errorRes = "\r\n" + + " 未能够识别出目标 'ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3'票根\r\n" + + ""; + + String error = XmlUtils.getTextForElement(errorRes, "authenticationFailure"); + System.out.println("------"+error); + + String error2 = XmlUtils.getTextForElement(result, "authenticationFailure"); + System.out.println("------"+error2); + String principal = XmlUtils.getTextForElement(result, "user"); + System.out.println("---principal---"+principal); + Map attributes = XmlUtils.extractCustomAttributes(result); + System.out.println("---attributes---"+attributes); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageController.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageController.java new file mode 100644 index 00000000..8f8474ef --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageController.java @@ -0,0 +1,145 @@ +package com.jero.modules.message.controller; + +import java.util.Arrays; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jero.common.api.vo.Result; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.modules.message.entity.SysMessage; +import com.jero.modules.message.service.ISysMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: 消息 + * @author: jero-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@Slf4j +@RestController +@RequestMapping("/sys/message/sysMessage") +public class SysMessageController extends JeroController { + @Autowired + private ISysMessageService sysMessageService; + + /** + * 分页列表查询 + * + * @param sysMessage + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/page") + public Result queryPageList(SysMessage sysMessage, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysMessage, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysMessageService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param sysMessage + * @return + */ + @PostMapping(value = "/add") + public Result add(@RequestBody SysMessage sysMessage) { + sysMessageService.save(sysMessage); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysMessage + * @return + */ + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysMessage sysMessage) { + sysMessageService.updateById(sysMessage); + return Result.OK("修改成功!"); + + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysMessageService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + + this.sysMessageService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + SysMessage sysMessage = sysMessageService.getById(id); + return Result.OK(sysMessage); + } + + /** + * 导出excel + * + * @param request + */ + @GetMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysMessage sysMessage) { + return super.exportXls(request,sysMessage,SysMessage.class, "推送消息模板"); + } + + /** + * excel导入 + * + * @param request + * @param response + * @return + */ + @PostMapping(value = "/importExcel") + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysMessage.class); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageTemplateController.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageTemplateController.java new file mode 100644 index 00000000..b884c959 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/controller/SysMessageTemplateController.java @@ -0,0 +1,170 @@ +package com.jero.modules.message.controller; + +import java.util.Arrays; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jero.common.api.vo.Result; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.modules.message.entity.MsgParams; +import com.jero.modules.message.entity.SysMessageTemplate; +import com.jero.modules.message.service.ISysMessageTemplateService; +import com.jero.modules.message.util.PushMsgUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: 消息模板 + * @Author: jero-boot + * @Sate: 2019-04-09 + * @Version: V1.0 + */ +@Slf4j +@RestController +@RequestMapping("/sys/message/sysMessageTemplate") +public class SysMessageTemplateController extends JeroController { + @Autowired + private ISysMessageTemplateService sysMessageTemplateService; + @Autowired + private PushMsgUtil pushMsgUtil; + + /** + * 分页列表查询 + * + * @param sysMessageTemplate + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/page") + public Result queryPageList(SysMessageTemplate sysMessageTemplate, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysMessageTemplate, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysMessageTemplateService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param sysMessageTemplate + * @return + */ + @PostMapping(value = "/add") + public Result add(@RequestBody SysMessageTemplate sysMessageTemplate) { + sysMessageTemplateService.save(sysMessageTemplate); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysMessageTemplate + * @return + */ + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysMessageTemplate sysMessageTemplate) { + sysMessageTemplateService.updateById(sysMessageTemplate); + return Result.OK("更新成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysMessageTemplateService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.sysMessageTemplateService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + SysMessageTemplate sysMessageTemplate = sysMessageTemplateService.getById(id); + return Result.OK(sysMessageTemplate); + } + + /** + * 导出excel + * + * @param request + */ + @GetMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request,SysMessageTemplate sysMessageTemplate) { + return super.exportXls(request, sysMessageTemplate, SysMessageTemplate.class,"推送消息模板"); + } + + /** + * excel导入 + * + * @param request + * @param response + * @return + */ + @PostMapping(value = "/importExcel") + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysMessageTemplate.class); + } + + /** + * 发送消息 + */ + @PostMapping(value = "/sendMsg") + public Result sendMessage(@RequestBody MsgParams msgParams) { + Result result = new Result(); + Map map = null; + try { + map = (Map) JSON.parse(msgParams.getTestData()); + } catch (Exception e) { + result.error500("解析Json出错!"); + return result; + } + boolean is_sendSuccess = pushMsgUtil.sendMessage(msgParams.getMsgType(), msgParams.getTemplateCode(), map, msgParams.getReceiver()); + if (is_sendSuccess) { + result.success("发送消息任务添加成功!"); + } else { + result.error500("发送消息任务添加失败!"); + } + return result; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/MsgParams.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/MsgParams.java new file mode 100644 index 00000000..b6b090c1 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/MsgParams.java @@ -0,0 +1,23 @@ +package com.jero.modules.message.entity; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 发送消息实体 + */ +@Data +public class MsgParams implements Serializable { + + private static final long serialVersionUID = 1L; + /*消息类型*/ + private String msgType; + /*消息接收方*/ + private String receiver; + /*消息模板码*/ + private String templateCode; + /*测试数据*/ + private String testData; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessage.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessage.java new file mode 100644 index 00000000..5f19e77c --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessage.java @@ -0,0 +1,60 @@ +package com.jero.modules.message.entity; + +import com.jero.common.aspect.annotation.Dict; +import com.jero.common.system.base.entity.JeroEntity; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 消息 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_sms") +public class SysMessage extends JeroEntity { + /**推送内容*/ + @Excel(name = "推送内容", width = 15) + private java.lang.String esContent; + /**推送所需参数Json格式*/ + @Excel(name = "推送所需参数Json格式", width = 15) + private java.lang.String esParam; + /**接收人*/ + @Excel(name = "接收人", width = 15) + private java.lang.String esReceiver; + /**推送失败原因*/ + @Excel(name = "推送失败原因", width = 15) + private java.lang.String esResult; + /**发送次数*/ + @Excel(name = "发送次数", width = 15) + private java.lang.Integer esSendNum; + /**推送状态 0未推送 1推送成功 2推送失败*/ + @Excel(name = "推送状态 0未推送 1推送成功 2推送失败", width = 15) + @Dict(dicCode = "msgSendStatus") + private java.lang.String esSendStatus; + /**推送时间*/ + @Excel(name = "推送时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date esSendTime; + /**消息标题*/ + @Excel(name = "消息标题", width = 15) + private java.lang.String esTitle; + /**推送方式:1短信 2邮件 3微信*/ + @Excel(name = "推送方式:1短信 2邮件 3微信", width = 15) + @Dict(dicCode = "msgType") + private java.lang.String esType; + /**备注*/ + @Excel(name = "备注", width = 15) + private java.lang.String remark; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java new file mode 100644 index 00000000..9e531b7f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java @@ -0,0 +1,38 @@ +package com.jero.modules.message.entity; + +import com.jero.common.system.base.entity.JeroEntity; +import org.jeecgframework.poi.excel.annotation.Excel; + +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 消息模板 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_sms_template") +public class SysMessageTemplate extends JeroEntity { + /**模板CODE*/ + @Excel(name = "模板CODE", width = 15) + private java.lang.String templateCode; + /**模板标题*/ + @Excel(name = "模板标题", width = 30) + private java.lang.String templateName; + /**模板内容*/ + @Excel(name = "模板内容", width = 50) + private java.lang.String templateContent; + /**模板测试json*/ + @Excel(name = "模板测试json", width = 15) + private java.lang.String templateTestJson; + /**模板类型*/ + @Excel(name = "模板类型", width = 15) + private java.lang.String templateType; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/ISendMsgHandle.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/ISendMsgHandle.java new file mode 100644 index 00000000..c8a48c94 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/ISendMsgHandle.java @@ -0,0 +1,6 @@ +package com.jero.modules.message.handle; + +public interface ISendMsgHandle { + + void SendMsg(String es_receiver, String es_title, String es_content); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgStatusEnum.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgStatusEnum.java new file mode 100644 index 00000000..d24252c6 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgStatusEnum.java @@ -0,0 +1,25 @@ +package com.jero.modules.message.handle.enums; + +/** + * 推送状态枚举 + */ +public enum SendMsgStatusEnum { + +//推送状态 0未推送 1推送成功 2推送失败 + WAIT("0"), SUCCESS("1"), FAIL("2"); + + private String code; + + private SendMsgStatusEnum(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public void setStatusCode(String code) { + this.code = code; + } + +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgTypeEnum.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgTypeEnum.java new file mode 100644 index 00000000..2ef4d437 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/enums/SendMsgTypeEnum.java @@ -0,0 +1,51 @@ +package com.jero.modules.message.handle.enums; + +import com.jero.common.util.oConvertUtils; + +/** + * 发送消息类型枚举 + */ +public enum SendMsgTypeEnum { + +//推送方式:1短信 2邮件 3微信 + SMS("1", "com.jero.modules.message.handle.impl.SmsSendMsgHandle"), + EMAIL("2", "com.jero.modules.message.handle.impl.EmailSendMsgHandle"), + WX("3","com.jero.modules.message.handle.impl.WxSendMsgHandle"); + + private String type; + + private String implClass; + + private SendMsgTypeEnum(String type, String implClass) { + this.type = type; + this.implClass = implClass; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getImplClass() { + return implClass; + } + + public void setImplClass(String implClass) { + this.implClass = implClass; + } + + public static SendMsgTypeEnum getByType(String type) { + if (oConvertUtils.isEmpty(type)) { + return null; + } + for (SendMsgTypeEnum val : values()) { + if (val.getType().equals(type)) { + return val; + } + } + return null; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/EmailSendMsgHandle.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/EmailSendMsgHandle.java new file mode 100644 index 00000000..776c760c --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/EmailSendMsgHandle.java @@ -0,0 +1,45 @@ +package com.jero.modules.message.handle.impl; + +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; +import com.jero.config.StaticConfig; +import com.jero.modules.message.handle.ISendMsgHandle; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; + +public class EmailSendMsgHandle implements ISendMsgHandle { + static String emailFrom; + + public static void setEmailFrom(String emailFrom) { + EmailSendMsgHandle.emailFrom = emailFrom; + } + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper helper = null; + //update-begin-author:taoyan date:20200811 for:配置类数据获取 + if(oConvertUtils.isEmpty(emailFrom)){ + StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); + setEmailFrom(staticConfig.getEmailFrom()); + } + //update-end-author:taoyan date:20200811 for:配置类数据获取 + try { + helper = new MimeMessageHelper(message, true); + // 设置发送方邮箱地址 + helper.setFrom(emailFrom); + helper.setTo(es_receiver); + helper.setSubject(es_title); + helper.setText(es_content, true); + mailSender.send(message); + } catch (MessagingException e) { + e.printStackTrace(); + } + + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/SmsSendMsgHandle.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/SmsSendMsgHandle.java new file mode 100644 index 00000000..113874ef --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/SmsSendMsgHandle.java @@ -0,0 +1,15 @@ +package com.jero.modules.message.handle.impl; + +import lombok.extern.slf4j.Slf4j; +import com.jero.modules.message.handle.ISendMsgHandle; + +@Slf4j +public class SmsSendMsgHandle implements ISendMsgHandle { + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + // TODO Auto-generated method stub + log.info("发短信"); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/WxSendMsgHandle.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/WxSendMsgHandle.java new file mode 100644 index 00000000..33f76aa3 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/handle/impl/WxSendMsgHandle.java @@ -0,0 +1,14 @@ +package com.jero.modules.message.handle.impl; + +import lombok.extern.slf4j.Slf4j; +import com.jero.modules.message.handle.ISendMsgHandle; +@Slf4j +public class WxSendMsgHandle implements ISendMsgHandle { + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + // TODO Auto-generated method stub + log.info("发微信消息模板"); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/job/SendMsgJob.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/job/SendMsgJob.java new file mode 100644 index 00000000..3bd006f4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/job/SendMsgJob.java @@ -0,0 +1,72 @@ +package com.jero.modules.message.job; + +import java.util.List; + +import com.jero.common.util.DateUtils; +import com.jero.modules.message.entity.SysMessage; +import com.jero.modules.message.handle.ISendMsgHandle; +import com.jero.modules.message.handle.enums.SendMsgStatusEnum; +import com.jero.modules.message.handle.enums.SendMsgTypeEnum; +import com.jero.modules.message.service.ISysMessageService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * 发送消息任务 + */ + +@Slf4j +public class SendMsgJob implements Job { + + @Autowired + private ISysMessageService sysMessageService; + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + log.info(String.format(" jero-boot 发送消息任务 SendMsgJob ! 时间:" + DateUtils.getTimestamp())); + + // 1.读取消息中心数据,只查询未发送的和发送失败不超过次数的 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("es_send_status", SendMsgStatusEnum.WAIT.getCode()) + .or(i -> i.eq("es_send_status", SendMsgStatusEnum.FAIL.getCode()).lt("es_send_num", 6)); + List sysMessages = sysMessageService.list(queryWrapper); + System.out.println(sysMessages); + // 2.根据不同的类型走不通的发送实现类 + for (SysMessage sysMessage : sysMessages) { + ISendMsgHandle sendMsgHandle = null; + try { + if (sysMessage.getEsType().equals(SendMsgTypeEnum.EMAIL.getType())) { + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.EMAIL.getImplClass()).newInstance(); + } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.SMS.getType())) { + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.SMS.getImplClass()).newInstance(); + } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.WX.getType())) { + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.WX.getImplClass()).newInstance(); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + } + Integer sendNum = sysMessage.getEsSendNum(); + try { + sendMsgHandle.SendMsg(sysMessage.getEsReceiver(), sysMessage.getEsTitle(), + sysMessage.getEsContent().toString()); + // 发送消息成功 + sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode()); + } catch (Exception e) { + // 发送消息出现异常 + sysMessage.setEsSendStatus(SendMsgStatusEnum.FAIL.getCode()); + } + sysMessage.setEsSendNum(++sendNum); + // 发送结果回写到数据库 + sysMessageService.updateById(sysMessage); + } + + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageMapper.java new file mode 100644 index 00000000..c8591222 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.message.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.message.entity.SysMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 消息 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +public interface SysMessageMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageTemplateMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageTemplateMapper.java new file mode 100644 index 00000000..2d1851eb --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/SysMessageTemplateMapper.java @@ -0,0 +1,18 @@ +package com.jero.modules.message.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; +import com.jero.modules.message.entity.SysMessageTemplate; + +import java.util.List; + +/** + * @Description: 消息模板 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +public interface SysMessageTemplateMapper extends BaseMapper { + @Select("SELECT * FROM SYS_SMS_TEMPLATE WHERE TEMPLATE_CODE = #{code}") + List selectByCode(String code); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageMapper.xml new file mode 100644 index 00000000..910a18cd --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageTemplateMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageTemplateMapper.xml new file mode 100644 index 00000000..aac7097a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/mapper/xml/SysMessageTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageService.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageService.java new file mode 100644 index 00000000..e056bb70 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageService.java @@ -0,0 +1,14 @@ +package com.jero.modules.message.service; + +import com.jero.common.system.base.service.JeroService; +import com.jero.modules.message.entity.SysMessage; + +/** + * @Description: 消息 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +public interface ISysMessageService extends JeroService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageTemplateService.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageTemplateService.java new file mode 100644 index 00000000..900aaa11 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/ISysMessageTemplateService.java @@ -0,0 +1,16 @@ +package com.jero.modules.message.service; + +import java.util.List; + +import com.jero.common.system.base.service.JeroService; +import com.jero.modules.message.entity.SysMessageTemplate; + +/** + * @Description: 消息模板 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +public interface ISysMessageTemplateService extends JeroService { + List selectByCode(String code); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageServiceImpl.java new file mode 100644 index 00000000..59d020a8 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageServiceImpl.java @@ -0,0 +1,18 @@ +package com.jero.modules.message.service.impl; + +import com.jero.common.system.base.service.impl.JeroServiceImpl; +import com.jero.modules.message.entity.SysMessage; +import com.jero.modules.message.mapper.SysMessageMapper; +import com.jero.modules.message.service.ISysMessageService; +import org.springframework.stereotype.Service; + +/** + * @Description: 消息 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +@Service +public class SysMessageServiceImpl extends JeroServiceImpl implements ISysMessageService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageTemplateServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageTemplateServiceImpl.java new file mode 100644 index 00000000..f0943e6b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/service/impl/SysMessageTemplateServiceImpl.java @@ -0,0 +1,28 @@ +package com.jero.modules.message.service.impl; + +import com.jero.common.system.base.service.impl.JeroServiceImpl; +import com.jero.modules.message.entity.SysMessageTemplate; +import com.jero.modules.message.mapper.SysMessageTemplateMapper; +import com.jero.modules.message.service.ISysMessageTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +/** + * @Description: 消息模板 + * @Author: jero-boot + * @Date: 2019-04-09 + * @Version: V1.0 + */ +@Service +public class SysMessageTemplateServiceImpl extends JeroServiceImpl implements ISysMessageTemplateService { + + @Autowired + private SysMessageTemplateMapper sysMessageTemplateMapper; + + + @Override + public List selectByCode(String code) { + return sysMessageTemplateMapper.selectByCode(code); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/util/PushMsgUtil.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/util/PushMsgUtil.java new file mode 100644 index 00000000..fb5e83b2 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/util/PushMsgUtil.java @@ -0,0 +1,80 @@ +package com.jero.modules.message.util; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import com.jero.modules.message.entity.SysMessage; +import com.jero.modules.message.entity.SysMessageTemplate; +import com.jero.modules.message.handle.enums.SendMsgStatusEnum; +import com.jero.modules.message.service.ISysMessageService; +import com.jero.modules.message.service.ISysMessageTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSONObject; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 消息生成工具 + */ + +@Component +public class PushMsgUtil { + + @Autowired + private ISysMessageService sysMessageService; + + @Autowired + private ISysMessageTemplateService sysMessageTemplateService; + + @Autowired + private Configuration freemarkerConfig; + /** + * @param msgType 消息类型 1短信 2邮件 3微信 + * @param templateCode 消息模板码 + * @param map 消息参数 + * @param sentTo 接收消息方 + */ + public boolean sendMessage(String msgType, String templateCode, Map map, String sentTo) { + List sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode); + SysMessage sysMessage = new SysMessage(); + if (sysSmsTemplates.size() > 0) { + SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0); + sysMessage.setEsType(msgType); + sysMessage.setEsReceiver(sentTo); + //模板标题 + String title = sysSmsTemplate.getTemplateName(); + //模板内容 + String content = sysSmsTemplate.getTemplateContent(); + StringWriter stringWriter = new StringWriter(); + Template template = null; + try { + template = new Template("SysMessageTemplate", content, freemarkerConfig); + template.process(map, stringWriter); + } catch (IOException e) { + e.printStackTrace(); + return false; + } catch (TemplateException e) { + e.printStackTrace(); + return false; + } + content = stringWriter.toString(); + sysMessage.setEsTitle(title); + sysMessage.setEsContent(content); + sysMessage.setEsParam(JSONObject.toJSONString(map)); + sysMessage.setEsSendTime(new Date()); + sysMessage.setEsSendStatus(SendMsgStatusEnum.WAIT.getCode()); + sysMessage.setEsSendNum(0); + if(sysMessageService.save(sysMessage)) { + return true; + } + } + return false; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/SocketHandler.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/SocketHandler.java new file mode 100644 index 00000000..0357b632 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/SocketHandler.java @@ -0,0 +1,29 @@ +package com.jero.modules.message.websocket; + +import cn.hutool.core.util.ObjectUtil; +import com.jero.common.modules.redis.listener.JeroRedisListerer; +import com.jero.common.base.BaseMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 监听消息(采用redis发布订阅方式发送消息) + */ +@Component +public class SocketHandler implements JeroRedisListerer { + + @Autowired + private WebSocket webSocket; + + @Override + public void onMessage(BaseMap map) { + String userId = map.get("userId"); + String message = map.get("message"); + if (ObjectUtil.isNotEmpty(userId)) { + webSocket.pushMessage(userId, message); + } else { + webSocket.pushMessage(message); + } + + } +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/TestSocketController.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/TestSocketController.java new file mode 100644 index 00000000..1a0bb8ca --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/TestSocketController.java @@ -0,0 +1,48 @@ +package com.jero.modules.message.websocket; + +import com.jero.common.api.vo.Result; +import com.jero.common.constant.WebsocketConst; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; + +@RestController +@RequestMapping("/sys/socketTest") +public class TestSocketController { + + @Autowired + private WebSocket webSocket; + + @PostMapping("/sendAll") + public Result sendAll(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String message = jsonObject.getString("message"); + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC); + obj.put(WebsocketConst.MSG_ID, "M0001"); + obj.put(WebsocketConst.MSG_TXT, message); + webSocket.sendMessage(obj.toJSONString()); + result.setResult("群发!"); + return result; + } + + @PostMapping("/sendUser") + public Result sendUser(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String userId = jsonObject.getString("userId"); + String message = jsonObject.getString("message"); + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER); + obj.put(WebsocketConst.MSG_USER_ID, userId); + obj.put(WebsocketConst.MSG_ID, "M0001"); + obj.put(WebsocketConst.MSG_TXT, message); + webSocket.sendMessage(userId, obj.toJSONString()); + result.setResult("单发"); + return result; + } + +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/WebSocket.java b/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/WebSocket.java new file mode 100644 index 00000000..55b01827 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/message/websocket/WebSocket.java @@ -0,0 +1,150 @@ +package com.jero.modules.message.websocket; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +import javax.annotation.Resource; +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; + +import com.jero.common.base.BaseMap; +import com.jero.common.constant.WebsocketConst; +import com.jero.common.modules.redis.clent.JeroRedisClient; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Author scott + * @Date 2019/11/29 9:41 + * @Description: 此注解相当于设置访问URL + */ +@Component +@Slf4j +@ServerEndpoint("/websocket/{userId}") //此注解相当于设置访问URL +public class WebSocket { + + private Session session; + + private String userId; + + private static final String REDIS_TOPIC_NAME = "socketHandler"; + + @Resource + private JeroRedisClient jeroRedisClient; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + try { + this.session = session; + this.userId = userId; + webSockets.add(this); + sessionPool.put(userId, session); + log.info("【websocket消息】有新的连接,总数为:" + webSockets.size()); + } catch (Exception e) { + } + } + + @OnClose + public void onClose() { + try { + webSockets.remove(this); + sessionPool.remove(this.userId); + log.info("【websocket消息】连接断开,总数为:" + webSockets.size()); + } catch (Exception e) { + } + } + + + /** + * 服务端推送消息 + * + * @param userId + * @param message + */ + public void pushMessage(String userId, String message) { + Session session = sessionPool.get(userId); + if (session != null && session.isOpen()) { + try { + log.info("【websocket消息】 单点消息:" + message); + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 服务器端推送消息 + */ + public void pushMessage(String message) { + try { + webSockets.forEach(ws -> ws.session.getAsyncRemote().sendText(message)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + @OnMessage + public void onMessage(String message) { + //todo 现在有个定时任务刷,应该去掉 + log.debug("【websocket消息】收到客户端消息:" + message); + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);//业务类型 + obj.put(WebsocketConst.MSG_TXT, "心跳响应");//消息内容 + for (WebSocket webSocket : webSockets) { + webSocket.pushMessage(message); + } + } + + /** + * 后台发送消息到redis + * + * @param message + */ + public void sendMessage(String message) { + log.info("【websocket消息】广播消息:" + message); + BaseMap baseMap = new BaseMap(); + baseMap.put("userId", ""); + baseMap.put("message", message); + jeroRedisClient.sendMessage(REDIS_TOPIC_NAME, baseMap); + } + + /** + * 此为单点消息 + * + * @param userId + * @param message + */ + public void sendMessage(String userId, String message) { + BaseMap baseMap = new BaseMap(); + baseMap.put("userId", userId); + baseMap.put("message", message); + jeroRedisClient.sendMessage(REDIS_TOPIC_NAME, baseMap); + } + + /** + * 此为单点消息(多人) + * + * @param userIds + * @param message + */ + public void sendMessage(String[] userIds, String message) { + for (String userId : userIds) { + sendMessage(userId, message); + } + } + +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/monitor/controller/ActuatorRedisController.java b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/controller/ActuatorRedisController.java new file mode 100644 index 00000000..10e79edd --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/controller/ActuatorRedisController.java @@ -0,0 +1,119 @@ +package com.jero.modules.monitor.controller; + +import com.alibaba.fastjson.JSONArray; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.modules.monitor.domain.RedisInfo; +import com.jero.modules.monitor.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.swing.filechooser.FileSystemView; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/sys/actuator/redis") +public class ActuatorRedisController { + + @Autowired + private RedisService redisService; + + /** + * Redis详细信息 + * @return + * @throws Exception + */ + @GetMapping("/info") + public Result getRedisInfo() throws Exception { + List infoList = this.redisService.getRedisInfo(); + log.info(infoList.toString()); + return Result.OK(infoList); + } + + @GetMapping("/keysSize") + public Map getKeysSize() throws Exception { + return redisService.getKeysSize(); + } + + /** + * 获取redis key数量 for 报表 + * @return + * @throws Exception + */ + @GetMapping("/keysSizeForReport") + public Map getKeysSizeReport() throws Exception { + return redisService.getMapForReport("1"); + } + /** + * 获取redis 内存 for 报表 + * + * @return + * @throws Exception + */ + @GetMapping("/memoryForReport") + public Map memoryForReport() throws Exception { + return redisService.getMapForReport("2"); + } + /** + * 获取redis 全部信息 for 报表 + * @return + * @throws Exception + */ + @GetMapping("/infoForReport") + public Map infoForReport() throws Exception { + return redisService.getMapForReport("3"); + } + + @GetMapping("/memoryInfo") + public Map getMemoryInfo() throws Exception { + return redisService.getMemoryInfo(); + } + + //update-begin--Author:zhangweijian Date:20190425 for:获取磁盘信息 + /** + * @功能:获取磁盘信息 + * @param request + * @param response + * @return + */ + @GetMapping("/queryDiskInfo") + public Result>> queryDiskInfo(HttpServletRequest request, HttpServletResponse response){ + Result>> res = new Result<>(); + try { + // 当前文件系统类 + FileSystemView fsv = FileSystemView.getFileSystemView(); + // 列出所有windows 磁盘 + File[] fs = File.listRoots(); + log.info("查询磁盘信息:"+fs.length+"个"); + List> list = new ArrayList<>(); + + for (int i = 0; i < fs.length; i++) { + if(fs[i].getTotalSpace()==0) { + continue; + } + Map map = new HashMap<>(); + map.put("name", fsv.getSystemDisplayName(fs[i])); + map.put("max", fs[i].getTotalSpace()); + map.put("rest", fs[i].getFreeSpace()); + map.put("restPPT", (fs[i].getTotalSpace()-fs[i].getFreeSpace())*100/fs[i].getTotalSpace()); + list.add(map); + log.info(map.toString()); + } + res.setResult(list); + res.success("查询成功"); + } catch (Exception e) { + res.error500("查询失败"+e.getMessage()); + } + return res; + } + //update-end--Author:zhangweijian Date:20190425 for:获取磁盘信息 +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/monitor/domain/RedisInfo.java b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/domain/RedisInfo.java new file mode 100644 index 00000000..590cd79b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/domain/RedisInfo.java @@ -0,0 +1,137 @@ +package com.jero.modules.monitor.domain; + +import java.util.HashMap; +import java.util.Map; + +public class RedisInfo { + + private static Map map = new HashMap<>(); + + static { + map.put("redis_version", "Redis 服务器版本"); + map.put("redis_git_sha1", "Git SHA1"); + map.put("redis_git_dirty", "Git dirty flag"); + map.put("os", "Redis 服务器的宿主操作系统"); + map.put("arch_bits", " 架构(32 或 64 位)"); + map.put("multiplexing_api", "Redis 所使用的事件处理机制"); + map.put("gcc_version", "编译 Redis 时所使用的 GCC 版本"); + map.put("process_id", "服务器进程的 PID"); + map.put("run_id", "Redis 服务器的随机标识符(用于 Sentinel 和集群)"); + map.put("tcp_port", "TCP/IP 监听端口"); + map.put("uptime_in_seconds", "自 Redis 服务器启动以来,经过的秒数"); + map.put("uptime_in_days", "自 Redis 服务器启动以来,经过的天数"); + map.put("lru_clock", " 以分钟为单位进行自增的时钟,用于 LRU 管理"); + map.put("connected_clients", "已连接客户端的数量(不包括通过从属服务器连接的客户端)"); + map.put("client_longest_output_list", "当前连接的客户端当中,最长的输出列表"); + map.put("client_longest_input_buf", "当前连接的客户端当中,最大输入缓存"); + map.put("blocked_clients", "正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量"); + map.put("used_memory", "由 Redis 分配器分配的内存总量,以字节(byte)为单位"); + map.put("used_memory_human", "以人类可读的格式返回 Redis 分配的内存总量"); + map.put("used_memory_rss", "从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致"); + map.put("used_memory_peak", " Redis 的内存消耗峰值(以字节为单位)"); + map.put("used_memory_peak_human", "以人类可读的格式返回 Redis 的内存消耗峰值"); + map.put("used_memory_lua", "Lua 引擎所使用的内存大小(以字节为单位)"); + map.put("mem_fragmentation_ratio", "sed_memory_rss 和 used_memory 之间的比率"); + map.put("mem_allocator", "在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc"); + + map.put("redis_build_id", "redis_build_id"); + map.put("redis_mode", "运行模式,单机(standalone)或者集群(cluster)"); + map.put("atomicvar_api", "atomicvar_api"); + map.put("hz", "redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次。"); + map.put("executable", "server脚本目录"); + map.put("config_file", "配置文件目录"); + map.put("client_biggest_input_buf", "当前连接的客户端当中,最大输入缓存,用client list命令观察qbuf和qbuf-free两个字段最大值"); + map.put("used_memory_rss_human", "以人类可读的方式返回 Redis 已分配的内存总量"); + map.put("used_memory_peak_perc", "内存使用率峰值"); + map.put("total_system_memory", "系统总内存"); + map.put("total_system_memory_human", "以人类可读的方式返回系统总内存"); + map.put("used_memory_lua_human", "以人类可读的方式返回Lua 引擎所使用的内存大小"); + map.put("maxmemory", "最大内存限制,0表示无限制"); + map.put("maxmemory_human", "以人类可读的方式返回最大限制内存"); + map.put("maxmemory_policy", "超过内存限制后的处理策略"); + map.put("loading", "服务器是否正在载入持久化文件"); + map.put("rdb_changes_since_last_save", "离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化"); + map.put("rdb_bgsave_in_progress", "服务器是否正在创建rdb文件"); + map.put("rdb_last_save_time", "离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件"); + map.put("rdb_last_bgsave_status", "最近一次rdb持久化是否成功"); + map.put("rdb_last_bgsave_time_sec", "最近一次成功生成rdb文件耗时秒数"); + map.put("rdb_current_bgsave_time_sec", "如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数"); + map.put("aof_enabled", "是否开启了aof"); + map.put("aof_rewrite_in_progress", "标识aof的rewrite操作是否在进行中"); + map.put("aof_rewrite_scheduled", "rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite "); + + map.put("aof_last_rewrite_time_sec", "最近一次aof rewrite耗费的时长"); + map.put("aof_current_rewrite_time_sec", "如果rewrite操作正在进行,则记录所使用的时间,单位秒"); + map.put("aof_last_bgrewrite_status", "上次bgrewrite aof操作的状态"); + map.put("aof_last_write_status", "上次aof写入状态"); + + map.put("total_commands_processed", "redis处理的命令数"); + map.put("total_connections_received", "新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置"); + map.put("instantaneous_ops_per_sec", "redis当前的qps,redis内部较实时的每秒执行的命令数"); + map.put("total_net_input_bytes", "redis网络入口流量字节数"); + map.put("total_net_output_bytes", "redis网络出口流量字节数"); + + map.put("instantaneous_input_kbps", "redis网络入口kps"); + map.put("instantaneous_output_kbps", "redis网络出口kps"); + map.put("rejected_connections", "拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数"); + map.put("sync_full", "主从完全同步成功次数"); + + map.put("sync_partial_ok", "主从部分同步成功次数"); + map.put("sync_partial_err", "主从部分同步失败次数"); + map.put("expired_keys", "运行以来过期的key的数量"); + map.put("evicted_keys", "运行以来剔除(超过了maxmemory后)的key的数量"); + map.put("keyspace_hits", "命中次数"); + map.put("keyspace_misses", "没命中次数"); + map.put("pubsub_channels", "当前使用中的频道数量"); + map.put("pubsub_patterns", "当前使用的模式的数量"); + map.put("latest_fork_usec", "最近一次fork操作阻塞redis进程的耗时数,单位微秒"); + map.put("role", "实例的角色,是master or slave"); + map.put("connected_slaves", "连接的slave实例个数"); + map.put("master_repl_offset", "主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟"); + map.put("repl_backlog_active", "复制积压缓冲区是否开启"); + map.put("repl_backlog_size", "复制积压缓冲大小"); + map.put("repl_backlog_first_byte_offset", "复制缓冲区里偏移量的大小"); + map.put("repl_backlog_histlen", "此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小"); + map.put("used_cpu_sys", "将所有redis主进程在核心态所占用的CPU时求和累计起来"); + map.put("used_cpu_user", "将所有redis主进程在用户态所占用的CPU时求和累计起来"); + map.put("used_cpu_sys_children", "将后台进程在核心态所占用的CPU时求和累计起来"); + map.put("used_cpu_user_children", "将后台进程在用户态所占用的CPU时求和累计起来"); + map.put("cluster_enabled", "实例是否启用集群模式"); + map.put("db0", "db0的key的数量,以及带有生存期的key的数,平均存活时间"); + + } + + private String key; + private String value; + private String description; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + this.description = map.get(this.key); + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + return "RedisInfo{" + "key='" + key + '\'' + ", value='" + value + '\'' + ", desctiption='" + description + '\'' + '}'; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/monitor/exception/RedisConnectException.java b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/exception/RedisConnectException.java new file mode 100644 index 00000000..dcd57062 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/exception/RedisConnectException.java @@ -0,0 +1,13 @@ +package com.jero.modules.monitor.exception; + +/** + * Redis 连接异常 + */ +public class RedisConnectException extends Exception { + + private static final long serialVersionUID = 1639374111871115063L; + + public RedisConnectException(String message) { + super(message); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/RedisService.java b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/RedisService.java new file mode 100644 index 00000000..f98f2dcc --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/RedisService.java @@ -0,0 +1,39 @@ +package com.jero.modules.monitor.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.jero.modules.monitor.domain.RedisInfo; +import com.jero.modules.monitor.exception.RedisConnectException; + +public interface RedisService { + + /** + * 获取 redis 的详细信息 + * + * @return List + */ + List getRedisInfo() throws RedisConnectException; + + /** + * 获取 redis key 数量 + * + * @return Map + */ + Map getKeysSize() throws RedisConnectException; + + /** + * 获取 redis 内存信息 + * + * @return Map + */ + Map getMemoryInfo() throws RedisConnectException; + /** + * 获取 报表需要个redis信息 + * + * @return Map + */ + Map getMapForReport(String type) throws RedisConnectException ; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/MailHealthIndicator.java b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/MailHealthIndicator.java new file mode 100644 index 00000000..4d6a90c4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/MailHealthIndicator.java @@ -0,0 +1,29 @@ +package com.jero.modules.monitor.service.impl; + +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.stereotype.Component; + +/** + * 功能说明:自定义邮件检测 + * + * @author: 李波 + * @email: 503378406@qq.com + * @date: 2019-06-29 + */ +@Component +public class MailHealthIndicator implements HealthIndicator { + + + @Override public Health health() { + int errorCode = check(); + if (errorCode != 0) { + return Health.down().withDetail("Error Code", errorCode) .build(); + } + return Health.up().build(); + } + int check(){ + //可以实现自定义的数据库检测逻辑 + return 0; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/RedisServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/RedisServiceImpl.java new file mode 100644 index 00000000..e5a439a6 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/monitor/service/impl/RedisServiceImpl.java @@ -0,0 +1,122 @@ +package com.jero.modules.monitor.service.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.annotation.Resource; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Maps; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.monitor.domain.RedisInfo; +import com.jero.modules.monitor.exception.RedisConnectException; +import com.jero.modules.monitor.service.RedisService; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.stereotype.Service; + +import lombok.extern.slf4j.Slf4j; + +/** + * Redis 监控信息获取 + * + * @Author MrBird + */ +@Service("redisService") +@Slf4j +public class RedisServiceImpl implements RedisService { + + @Resource + private RedisConnectionFactory redisConnectionFactory; + + /** + * Redis详细信息 + */ + @Override + public List getRedisInfo() throws RedisConnectException { + Properties info = redisConnectionFactory.getConnection().info(); + List infoList = new ArrayList<>(); + RedisInfo redisInfo = null; + for (Map.Entry entry : info.entrySet()) { + redisInfo = new RedisInfo(); + redisInfo.setKey(oConvertUtils.getString(entry.getKey())); + redisInfo.setValue(oConvertUtils.getString(entry.getValue())); + infoList.add(redisInfo); + } + return infoList; + } + + @Override + public Map getKeysSize() throws RedisConnectException { + Long dbSize = redisConnectionFactory.getConnection().dbSize(); + Map map = new HashMap<>(); + map.put("create_time", System.currentTimeMillis()); + map.put("dbSize", dbSize); + + log.info("--getKeysSize--: " + map.toString()); + return map; + } + + @Override + public Map getMemoryInfo() throws RedisConnectException { + Map map = null; + Properties info = redisConnectionFactory.getConnection().info(); + for (Map.Entry entry : info.entrySet()) { + String key = oConvertUtils.getString(entry.getKey()); + if ("used_memory".equals(key)) { + map = new HashMap<>(); + map.put("used_memory", entry.getValue()); + map.put("create_time", System.currentTimeMillis()); + } + } + log.info("--getMemoryInfo--: " + map.toString()); + return map; + } + + /** + * 查询redis信息for报表 + * @param type 1redis key数量 2 占用内存 3redis信息 + * @return + * @throws RedisConnectException + */ + @Override + public Map getMapForReport(String type) throws RedisConnectException { + Map mapJson=new HashMap (); + JSONArray json = new JSONArray(); + if("3".equals(type)){ + List redisInfo = getRedisInfo(); + for(RedisInfo info:redisInfo){ + Map map= Maps.newHashMap(); + BeanMap beanMap = BeanMap.create(info); + for (Object key : beanMap.keySet()) { + map.put(key+"", beanMap.get(key)); + } + json.add(map); + } + mapJson.put("data",json); + return mapJson; + } + for(int i = 0; i < 5; i++){ + JSONObject jo = new JSONObject(); + Map map; + if("1".equals(type)){ + map= getKeysSize(); + jo.put("value",map.get("dbSize")); + }else{ + map = getMemoryInfo(); + Integer used_memory = Integer.valueOf(map.get("used_memory").toString()); + jo.put("value",used_memory/1000); + } + String create_time = DateUtil.formatTime(DateUtil.date((Long) map.get("create_time")-(4-i)*1000)); + jo.put("name",create_time); + json.add(jo); + } + mapJson.put("data",json); + return mapJson; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/aop/LogRecordAspect.java b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/aop/LogRecordAspect.java new file mode 100644 index 00000000..dd128638 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/aop/LogRecordAspect.java @@ -0,0 +1,46 @@ +package com.jero.modules.ngalain.aop; + +import javax.servlet.http.HttpServletRequest; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory;; + + +// 暂时注释掉,提高系统性能 +//@Aspect //定义一个切面 +//@Configuration +public class LogRecordAspect { +private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class); + + // 定义切点Pointcut + @Pointcut("execution(public * com.jero.modules.*.*.*Controller.*(..))") + public void excudeService() { + } + + @Around("excudeService()") + public Object doAround(ProceedingJoinPoint pjp) throws Throwable { + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes) ra; + HttpServletRequest request = sra.getRequest(); + + String url = request.getRequestURL().toString(); + String method = request.getMethod(); + String uri = request.getRequestURI(); + String queryString = request.getQueryString(); + logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString); + + // result的值就是被拦截方法的返回值 + Object result = pjp.proceed(); + + logger.info("请求结束,controller的返回值是 " + result); + return result; + } +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/controller/NgAlainController.java b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/controller/NgAlainController.java new file mode 100644 index 00000000..69b77313 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/controller/NgAlainController.java @@ -0,0 +1,86 @@ +package com.jero.modules.ngalain.controller; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.LoginUser; +import com.jero.modules.ngalain.service.NgAlainService; +import com.jero.modules.system.service.ISysDictService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequestMapping("/sys/ng-alain") +public class NgAlainController { + @Autowired + private NgAlainService ngAlainService; + @Autowired + private ISysDictService sysDictService; + + @RequestMapping(value = "/getAppData") + @ResponseBody + public JSONObject getAppData(HttpServletRequest request) throws Exception { + String token=request.getHeader("X-Access-Token"); + JSONObject j = new JSONObject(); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + JSONObject userObjcet = new JSONObject(); + userObjcet.put("name", user.getUsername()); + userObjcet.put("avatar", user.getAvatar()); + userObjcet.put("email", user.getEmail()); + userObjcet.put("token", token); + j.put("user", userObjcet); + j.put("menu",ngAlainService.getMenu(user.getUsername())); + JSONObject app = new JSONObject(); + app.put("name", "jero-boot-angular"); + app.put("description", "jero+ng-alain整合版本"); + j.put("app", app); + return j; + } + + @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) + public Object getDictItems(@PathVariable String dictCode) { + log.info(" dictCode : "+ dictCode); + Result> result = new Result>(); + List ls = null; + try { + ls = sysDictService.queryDictItemsByCode(dictCode); + result.setSuccess(true); + result.setResult(ls); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + List dictlist=new ArrayList<>(); + for (DictModel l : ls) { + JSONObject dict=new JSONObject(); + try { + dict.put("value",Integer.parseInt(l.getValue())); + } catch (NumberFormatException e) { + dict.put("value",l.getValue()); + } + dict.put("label",l.getText()); + dictlist.add(dict); + } + return dictlist; + } + @RequestMapping(value = "/getDictItemsByTable/{table}/{key}/{value}", method = RequestMethod.GET) + public Object getDictItemsByTable(@PathVariable String table,@PathVariable String key,@PathVariable String value) { + return this.ngAlainService.getDictByTable(table,key,value); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/NgAlainService.java b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/NgAlainService.java new file mode 100644 index 00000000..e9d5dbc5 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/NgAlainService.java @@ -0,0 +1,12 @@ +package com.jero.modules.ngalain.service; + +import com.alibaba.fastjson.JSONArray; + +import java.util.List; +import java.util.Map; + +public interface NgAlainService { + public JSONArray getMenu(String id) throws Exception; + public JSONArray getJeroMenu(String id) throws Exception; + public List> getDictByTable(String table, String key, String value); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/impl/NgAlainServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/impl/NgAlainServiceImpl.java new file mode 100644 index 00000000..9999c614 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/ngalain/service/impl/NgAlainServiceImpl.java @@ -0,0 +1,180 @@ +package com.jero.modules.ngalain.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.ngalain.service.NgAlainService; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.mapper.SysDictMapper; +import com.jero.modules.system.service.ISysPermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Base64; +import java.util.List; +import java.util.Map; + +@Service("ngAlainService") +public class NgAlainServiceImpl implements NgAlainService { + @Autowired + private ISysPermissionService sysPermissionService; + @Autowired + private SysDictMapper mapper; + @Override + public JSONArray getMenu(String id) throws Exception { + return getJeroMenu(id); + } + @Override + public JSONArray getJeroMenu(String id) throws Exception { + List metaList = sysPermissionService.queryByUser(id); + JSONArray jsonArray = new JSONArray(); + getPermissionJsonArray(jsonArray, metaList, null); + JSONArray menulist= parseNgAlain(jsonArray); + JSONObject menu = new JSONObject(); + menu.put("text", "jero菜单"); + menu.put("group",true); + menu.put("children", menulist); + JSONArray jeroMenuList=new JSONArray(); + jeroMenuList.add(menu); + return jeroMenuList; + } + + @Override + public List> getDictByTable(String table, String key, String value) { + return this.mapper.getDictByTableNgAlain(table,key,value); + } + + private JSONArray parseNgAlain(JSONArray jsonArray) { + JSONArray menulist=new JSONArray(); + for (Object object : jsonArray) { + JSONObject jsonObject= (JSONObject) object; + String path= (String) jsonObject.get("path"); + JSONObject meta= (JSONObject) jsonObject.get("meta"); + JSONObject menu=new JSONObject(); + menu.put("text",meta.get("title")); + menu.put("reuse",true); + if (jsonObject.get("children")!=null){ + JSONArray child= parseNgAlain((JSONArray) jsonObject.get("children")); + menu.put("children",child); + JSONObject icon=new JSONObject(); + icon.put("type", "icon"); + icon.put("value", meta.get("icon")); + menu.put("icon",icon); + }else { + menu.put("link",path); + } + menulist.add(menu); + } + return menulist; + } + + /** + * 获取菜单JSON数组 + * @param jsonArray + * @param metaList + * @param parentJson + */ + private void getPermissionJsonArray(JSONArray jsonArray,List metaList,JSONObject parentJson) { + for (SysPermission permission : metaList) { + if(permission.getMenuType()==null) { + continue; + } + String tempPid = permission.getParentId(); + JSONObject json = getPermissionJsonObject(permission); + if(parentJson==null && oConvertUtils.isEmpty(tempPid)) { + jsonArray.add(json); + if(!permission.isLeaf()) { + getPermissionJsonArray(jsonArray, metaList, json); + } + }else if(parentJson!=null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString("id"))){ + if(permission.getMenuType()==0) { + JSONObject metaJson = parentJson.getJSONObject("meta"); + if(metaJson.containsKey("permissionList")) { + metaJson.getJSONArray("permissionList").add(json); + }else { + JSONArray permissionList = new JSONArray(); + permissionList.add(json); + metaJson.put("permissionList", permissionList); + } + + }else if(permission.getMenuType()==1) { + if(parentJson.containsKey("children")) { + parentJson.getJSONArray("children").add(json); + }else { + JSONArray children = new JSONArray(); + children.add(json); + parentJson.put("children", children); + } + + if(!permission.isLeaf()) { + getPermissionJsonArray(jsonArray, metaList, json); + } + } + } + + + } + } + private JSONObject getPermissionJsonObject(SysPermission permission) { + JSONObject json = new JSONObject(); + //类型(0:一级菜单 1:子菜单 2:按钮) + if(permission.getMenuType()==2) { + json.put("action", permission.getPerms()); + json.put("describe", permission.getName()); + }else if(permission.getMenuType()==0||permission.getMenuType()==1) { + json.put("id", permission.getId()); + if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { + String url= new String(Base64.getUrlEncoder().encode(permission.getUrl().getBytes())); + json.put("path", "/sys/link/" +url.replaceAll("=","")); + }else { + json.put("path", permission.getUrl()); + } + + //重要规则:路由name (通过URL生成路由name,路由name供前端开发,页面跳转使用) + json.put("name", urlToRouteName(permission.getUrl())); + + //是否隐藏路由,默认都是显示的 + if(permission.isHidden()) { + json.put("hidden",true); + } + //聚合路由 + if(permission.isAlwaysShow()) { + json.put("alwaysShow",true); + } + json.put("component", permission.getComponent()); + JSONObject meta = new JSONObject(); + meta.put("title", permission.getName()); + if(oConvertUtils.isEmpty(permission.getParentId())) { + //一级菜单跳转地址 + json.put("redirect",permission.getRedirect()); + meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); + }else { + meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); + } + if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { + meta.put("url", permission.getUrl()); + } + json.put("meta", meta); + } + + return json; + } + /** + * 通过URL生成路由name(去掉URL前缀斜杠,替换内容中的斜杠‘/’为-) + * 举例: URL = /isystem/role + * RouteName = isystem-role + * @return + */ + private String urlToRouteName(String url) { + if(oConvertUtils.isNotEmpty(url)) { + if(url.startsWith("/")) { + url = url.substring(1); + } + url = url.replace("/", "-"); + return url; + }else { + return null; + } + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/oss/controller/OSSFileController.java b/jero-boot-module-system/src/main/java/com/jero/modules/oss/controller/OSSFileController.java new file mode 100644 index 00000000..b9bf4a6e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/oss/controller/OSSFileController.java @@ -0,0 +1,97 @@ +package com.jero.modules.oss.controller; + +import javax.servlet.http.HttpServletRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +@Slf4j +@Controller +@RequestMapping("/sys/oss/file") +public class OSSFileController { + + @Autowired + private IOSSFileService ossFileService; + + @ResponseBody + @GetMapping("/page") + public Result> queryPageList(OSSFile file, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result<>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(file, req.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = ossFileService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + @ResponseBody + @PostMapping("/upload") + //@RequiresRoles("admin") + public Result upload(@RequestParam("file") MultipartFile multipartFile) { + Result result = new Result(); + try { + ossFileService.upload(multipartFile); + result.success("上传成功!"); + } + catch (Exception ex) { + log.info(ex.getMessage(), ex); + result.error500("上传失败"); + } + return result; + } + + @ResponseBody + @DeleteMapping("/delete") + public Result delete(@RequestParam(name = "id") String id) { + Result result = new Result(); + OSSFile file = ossFileService.getById(id); + if (file == null) { + result.error500("未找到对应实体"); + } + else { + boolean ok = ossFileService.delete(file); + if (ok) { + result.success("删除成功!"); + } + } + return result; + } + + /** + * 通过id查询. + */ + @ResponseBody + @GetMapping("/queryById") + public Result queryById(@RequestParam(name = "id") String id) { + Result result = new Result<>(); + OSSFile file = ossFileService.getById(id); + if (file == null) { + result.error500("未找到对应实体"); + } + else { + result.setResult(file); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/oss/entity/OSSFile.java b/jero-boot-module-system/src/main/java/com/jero/modules/oss/entity/OSSFile.java new file mode 100644 index 00000000..9c1d7383 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/oss/entity/OSSFile.java @@ -0,0 +1,24 @@ +package com.jero.modules.oss.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.jero.common.system.base.entity.JeroEntity; +import org.jeecgframework.poi.excel.annotation.Excel; + +@Data +@TableName("oss_file") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class OSSFile extends JeroEntity { + + private static final long serialVersionUID = 1L; + + @Excel(name = "文件名称") + private String fileName; + + @Excel(name = "文件地址") + private String url; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/oss/mapper/OSSFileMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/oss/mapper/OSSFileMapper.java new file mode 100644 index 00000000..688bd518 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/oss/mapper/OSSFileMapper.java @@ -0,0 +1,8 @@ +package com.jero.modules.oss.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.oss.entity.OSSFile; + +public interface OSSFileMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/oss/service/IOSSFileService.java b/jero-boot-module-system/src/main/java/com/jero/modules/oss/service/IOSSFileService.java new file mode 100644 index 00000000..ce609eec --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/oss/service/IOSSFileService.java @@ -0,0 +1,15 @@ +package com.jero.modules.oss.service; + +import java.io.IOException; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.oss.entity.OSSFile; +import org.springframework.web.multipart.MultipartFile; + +public interface IOSSFileService extends IService { + + void upload(MultipartFile multipartFile) throws IOException; + + boolean delete(OSSFile ossFile); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java new file mode 100644 index 00000000..8376de8a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java @@ -0,0 +1,43 @@ +package com.jero.modules.oss.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jero.common.util.CommonUtils; +import com.jero.common.util.oss.OssBootUtil; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.mapper.OSSFileMapper; +import com.jero.modules.oss.service.IOSSFileService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@Service("ossFileService") +public class OSSFileServiceImpl extends ServiceImpl implements IOSSFileService { + + @Override + public void upload(MultipartFile multipartFile) throws IOException { + String fileName = multipartFile.getOriginalFilename(); + fileName = CommonUtils.getFileName(fileName); + OSSFile ossFile = new OSSFile(); + ossFile.setFileName(fileName); + String url = OssBootUtil.upload(multipartFile,"upload/test"); + //update-begin--Author:scott Date:20201227 for:JT-361【文件预览】阿里云原生域名可以文件预览,自己映射域名kkfileview提示文件下载失败------------------- + // 返回阿里云原生域名前缀URL + ossFile.setUrl(OssBootUtil.getOriginalUrl(url)); + //update-end--Author:scott Date:20201227 for:JT-361【文件预览】阿里云原生域名可以文件预览,自己映射域名kkfileview提示文件下载失败------------------- + this.save(ossFile); + } + + @Override + public boolean delete(OSSFile ossFile) { + try { + this.removeById(ossFile.getId()); + OssBootUtil.deleteUrl(ossFile.getUrl()); + } + catch (Exception ex) { + return false; + } + return true; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/controller/QuartzJobController.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/controller/QuartzJobController.java new file mode 100644 index 00000000..03ea71ca --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/controller/QuartzJobController.java @@ -0,0 +1,286 @@ +package com.jero.modules.quartz.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.ImportExcelUtil; +import com.jero.modules.quartz.entity.QuartzJob; +import com.jero.modules.quartz.service.IQuartzJobService; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: 定时任务在线管理 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version:V1.0 + */ +@RestController +@RequestMapping("/sys/quartzJob") +@Slf4j +@Api(tags = "定时任务接口") +public class QuartzJobController { + @Autowired + private IQuartzJobService quartzJobService; + @Autowired + private Scheduler scheduler; + + /** + * 分页列表查询 + * + * @param quartzJob + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result queryPageList(QuartzJob quartzJob, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(quartzJob, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = quartzJobService.page(page, queryWrapper); + return Result.OK(pageList); + + } + + /** + * 添加定时任务 + * + * @param quartzJob + * @return + */ + //@RequiresRoles("admin") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result add(@RequestBody QuartzJob quartzJob) { + List list = quartzJobService.findByJobClassName(quartzJob.getJobClassName()); + if (list != null && list.size() > 0) { + return Result.error("该定时任务类名已存在"); + } + quartzJobService.saveAndScheduleJob(quartzJob); + return Result.OK("创建定时任务成功"); + } + + /** + * 更新定时任务 + * + * @param quartzJob + * @return + */ + //@RequiresRoles("admin") + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result eidt(@RequestBody QuartzJob quartzJob) { + try { + quartzJobService.editAndScheduleJob(quartzJob); + } catch (SchedulerException e) { + log.error(e.getMessage(),e); + return Result.error("更新定时任务失败!"); + } + return Result.OK("更新定时任务成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + //@RequiresRoles("admin") + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name = "id", required = true) String id) { + QuartzJob quartzJob = quartzJobService.getById(id); + if (quartzJob == null) { + return Result.error("未找到对应实体"); + } + quartzJobService.deleteAndStopJob(quartzJob); + return Result.OK("删除成功!"); + + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + //@RequiresRoles("admin") + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + if (ids == null || "".equals(ids.trim())) { + return Result.error("参数不识别!"); + } + for (String id : Arrays.asList(ids.split(","))) { + QuartzJob job = quartzJobService.getById(id); + quartzJobService.deleteAndStopJob(job); + } + return Result.OK("删除定时任务成功!"); + } + + /** + * 暂停定时任务 + * + * @param jobClassName + * @return + */ + //@RequiresRoles("admin") + @GetMapping(value = "/pause") + @ApiOperation(value = "暂停定时任务") + public Result pauseJob(@RequestParam(name = "jobClassName", required = true) String jobClassName) { + QuartzJob job = null; + job = quartzJobService.getOne(new LambdaQueryWrapper().eq(QuartzJob::getJobClassName, jobClassName)); + if (job == null) { + return Result.error("定时任务不存在!"); + } + quartzJobService.pause(job); + return Result.OK("暂停定时任务成功"); + } + + /** + * 启动定时任务 + * + * @param jobClassName + * @return + */ + //@RequiresRoles("admin") + @GetMapping(value = "/resume") + @ApiOperation(value = "恢复定时任务") + public Result resumeJob(@RequestParam(name = "jobClassName", required = true) String jobClassName) { + QuartzJob job = quartzJobService.getOne(new LambdaQueryWrapper().eq(QuartzJob::getJobClassName, jobClassName)); + if (job == null) { + return Result.error("定时任务不存在!"); + } + quartzJobService.resumeJob(job); + //scheduler.resumeJob(JobKey.jobKey(job.getJobClassName().trim())); + return Result.OK("恢复定时任务成功"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result queryById(@RequestParam(name = "id", required = true) String id) { + QuartzJob quartzJob = quartzJobService.getById(id); + return Result.OK(quartzJob); + } + + /** + * 导出excel + * + * @param request + * @param quartzJob + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, QuartzJob quartzJob) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(quartzJob, request.getParameterMap()); + // Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = quartzJobService.list(queryWrapper); + // 导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "定时任务列表"); + mv.addObject(NormalExcelConstants.CLASS, QuartzJob.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("定时任务列表数据", "导出人:Jero", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) throws IOException { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + // 错误信息 + List errorMessage = new ArrayList<>(); + int successLines = 0, errorLines = 0; + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List listQuartzJobs = ExcelImportUtil.importExcel(file.getInputStream(), QuartzJob.class, params); + List list = ImportExcelUtil.importDateSave(listQuartzJobs, IQuartzJobService.class, errorMessage,CommonConstant.SQL_INDEX_UNIQ_JOB_CLASS_NAME); + errorLines+=list.size(); + successLines+=(listQuartzJobs.size()-errorLines); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); + } + + /** + * 立即执行 + * @param id + * @return + */ + //@RequiresRoles("admin") + @GetMapping("/execute") + public Result execute(@RequestParam(name = "id", required = true) String id) { + QuartzJob quartzJob = quartzJobService.getById(id); + if (quartzJob == null) { + return Result.error("未找到对应实体"); + } + try { + quartzJobService.execute(quartzJob); + } catch (Exception e) { + //e.printStackTrace(); + log.info("定时任务 立即执行失败>>"+e.getMessage()); + return Result.error("执行失败!"); + } + return Result.OK("执行成功!"); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/entity/QuartzJob.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/entity/QuartzJob.java new file mode 100644 index 00000000..383b3d53 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/entity/QuartzJob.java @@ -0,0 +1,62 @@ +package com.jero.modules.quartz.entity; + +import java.io.Serializable; + +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +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 com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +/** + * @Description: 定时任务在线管理 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +@Data +@TableName("sys_quartz_job") +public class QuartzJob implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**删除状态*/ + private java.lang.Integer delFlag; + /**修改人*/ + private java.lang.String updateBy; + /**修改时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /**任务类名*/ + @Excel(name="任务类名",width=40) + private java.lang.String jobClassName; + /**cron表达式*/ + @Excel(name="cron表达式",width=30) + private java.lang.String cronExpression; + /**参数*/ + @Excel(name="参数",width=15) + private java.lang.String parameter; + /**描述*/ + @Excel(name="描述",width=40) + private java.lang.String description; + /**状态 0正常 -1停止*/ + @Excel(name="状态",width=15,dicCode="quartz_status") + @Dict(dicCode = "quartz_status") + private java.lang.Integer status; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/AsyncJob.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/AsyncJob.java new file mode 100644 index 00000000..844a0a3a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/AsyncJob.java @@ -0,0 +1,35 @@ +package com.jero.modules.quartz.job; + +import lombok.extern.slf4j.Slf4j; +import com.jero.common.util.DateUtils; +import org.quartz.*; + +/** + * @Description: 同步定时任务测试 + * + * 此处的同步是指 当定时任务的执行时间大于任务的时间间隔时 + * 会等待第一个任务执行完成才会走第二个任务 + * + * + * @author: taoyan + * @date: 2020年06月19日 + */ +@PersistJobDataAfterExecution +@DisallowConcurrentExecution +@Slf4j +public class AsyncJob implements Job { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + log.info(" --- 同步任务调度开始 --- "); + try { + //此处模拟任务执行时间 5秒 任务表达式配置为每秒执行一次:0/1 * * * * ? * + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + //测试发现 每5秒执行一次 + log.info(" --- 执行完毕,时间:"+DateUtils.now()+"---"); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleJob.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleJob.java new file mode 100644 index 00000000..a9eee88e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleJob.java @@ -0,0 +1,23 @@ +package com.jero.modules.quartz.job; + +import com.jero.common.util.DateUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import lombok.extern.slf4j.Slf4j; + +/** + * 示例不带参定时任务 + * + * @Author Scott + */ +@Slf4j +public class SampleJob implements Job { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + log.info(String.format(" jero-boot 普通定时任务 SampleJob ! 时间:" + DateUtils.getTimestamp())); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleParamJob.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleParamJob.java new file mode 100644 index 00000000..0d2b289d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/job/SampleParamJob.java @@ -0,0 +1,32 @@ +package com.jero.modules.quartz.job; + +import com.jero.common.util.DateUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import lombok.extern.slf4j.Slf4j; + +/** + * 示例带参定时任务 + * + * @Author Scott + */ +@Slf4j +public class SampleParamJob implements Job { + + /** + * 若参数变量名修改 QuartzJobController中也需对应修改 + */ + private String parameter; + + public void setParameter(String parameter) { + this.parameter = parameter; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + log.info(String.format("welcome %s! jero-boot 带参数定时任务 SampleParamJob ! 时间:" + DateUtils.now(), this.parameter)); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/QuartzJobMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/QuartzJobMapper.java new file mode 100644 index 00000000..377c8ccc --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/QuartzJobMapper.java @@ -0,0 +1,20 @@ +package com.jero.modules.quartz.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.quartz.entity.QuartzJob; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 定时任务在线管理 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +public interface QuartzJobMapper extends BaseMapper { + + public List findByJobClassName(@Param("jobClassName") String jobClassName); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/xml/QuartzJobMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/xml/QuartzJobMapper.xml new file mode 100644 index 00000000..2b7651e2 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/mapper/xml/QuartzJobMapper.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/IQuartzJobService.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/IQuartzJobService.java new file mode 100644 index 00000000..4fb5a187 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/IQuartzJobService.java @@ -0,0 +1,40 @@ +package com.jero.modules.quartz.service; + +import java.util.List; + +import com.jero.modules.quartz.entity.QuartzJob; +import org.quartz.SchedulerException; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 定时任务在线管理 + * @Author: jero-boot + * @Date: 2019-04-28 + * @Version: V1.1 + */ +public interface IQuartzJobService extends IService { + + List findByJobClassName(String jobClassName); + + boolean saveAndScheduleJob(QuartzJob quartzJob); + + boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException; + + boolean deleteAndStopJob(QuartzJob quartzJob); + + boolean resumeJob(QuartzJob quartzJob); + + /** + * 执行定时任务 + * @param quartzJob + */ + void execute(QuartzJob quartzJob) throws Exception; + + /** + * 暂停任务 + * @param quartzJob + * @throws SchedulerException + */ + void pause(QuartzJob quartzJob); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/impl/QuartzJobServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/impl/QuartzJobServiceImpl.java new file mode 100644 index 00000000..d039b6df --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/quartz/service/impl/QuartzJobServiceImpl.java @@ -0,0 +1,174 @@ +package com.jero.modules.quartz.service.impl; + +import java.util.Date; +import java.util.List; + +import com.jero.common.constant.CommonConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.DateUtils; +import com.jero.modules.quartz.entity.QuartzJob; +import com.jero.modules.quartz.mapper.QuartzJobMapper; +import com.jero.modules.quartz.service.IQuartzJobService; +import org.quartz.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: 定时任务在线管理 + * @Author: jero-boot + * @Date: 2019-04-28 + * @Version: V1.1 + */ +@Slf4j +@Service +public class QuartzJobServiceImpl extends ServiceImpl implements IQuartzJobService { + @Autowired + private QuartzJobMapper quartzJobMapper; + @Autowired + private Scheduler scheduler; + + /** + * 立即执行的任务分组 + */ + private static final String JOB_TEST_GROUP = "test_group"; + + @Override + public List findByJobClassName(String jobClassName) { + return quartzJobMapper.findByJobClassName(jobClassName); + } + + /** + * 保存&启动定时任务 + */ + @Override + public boolean saveAndScheduleJob(QuartzJob quartzJob) { + if (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) { + // 定时器添加 + this.schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter()); + } + // DB设置修改 + quartzJob.setDelFlag(CommonConstant.DEL_FLAG_0); + return this.save(quartzJob); + } + + /** + * 恢复定时任务 + */ + @Override + public boolean resumeJob(QuartzJob quartzJob) { + schedulerDelete(quartzJob.getJobClassName().trim()); + schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter()); + quartzJob.setStatus(CommonConstant.STATUS_NORMAL); + return this.updateById(quartzJob); + } + + /** + * 编辑&启停定时任务 + * @throws SchedulerException + */ + @Override + public boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException { + if (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) { + schedulerDelete(quartzJob.getJobClassName().trim()); + schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter()); + }else{ + scheduler.pauseJob(JobKey.jobKey(quartzJob.getJobClassName().trim())); + } + return this.updateById(quartzJob); + } + + /** + * 删除&停止删除定时任务 + */ + @Override + public boolean deleteAndStopJob(QuartzJob job) { + schedulerDelete(job.getJobClassName().trim()); + boolean ok = this.removeById(job.getId()); + return ok; + } + + @Override + public void execute(QuartzJob quartzJob) throws Exception { + String jobName = quartzJob.getJobClassName().trim(); + Date startDate = new Date(); + String ymd = DateUtils.date2Str(startDate,DateUtils.yyyymmddhhmmss.get()); + String identity = jobName + ymd; + //3秒后执行 只执行一次 + startDate.setTime(startDate.getTime()+3000L); + // 定义一个Trigger + SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger() + .withIdentity(identity, JOB_TEST_GROUP) + .startAt(startDate) + .build(); + // 构建job信息 + JobDetail jobDetail = JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(identity).usingJobData("parameter", quartzJob.getParameter()).build(); + // 将trigger和 jobDetail 加入这个调度 + scheduler.scheduleJob(jobDetail, trigger); + // 启动scheduler + scheduler.start(); + } + + @Override + public void pause(QuartzJob quartzJob){ + schedulerDelete(quartzJob.getJobClassName().trim()); + quartzJob.setStatus(CommonConstant.STATUS_DISABLE); + this.updateById(quartzJob); + } + + /** + * 添加定时任务 + * + * @param jobClassName + * @param cronExpression + * @param parameter + */ + private void schedulerAdd(String jobClassName, String cronExpression, String parameter) { + try { + // 启动调度器 + scheduler.start(); + + // 构建job信息 + JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobClassName).usingJobData("parameter", parameter).build(); + + // 表达式调度构建器(即任务执行的时间) + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName).withSchedule(scheduleBuilder).build(); + + scheduler.scheduleJob(jobDetail, trigger); + } catch (SchedulerException e) { + throw new JeroBootException("创建定时任务失败", e); + } catch (RuntimeException e) { + throw new JeroBootException(e.getMessage(), e); + }catch (Exception e) { + throw new JeroBootException("后台找不到该类名:" + jobClassName, e); + } + } + + /** + * 删除定时任务 + * + * @param jobClassName + */ + private void schedulerDelete(String jobClassName) { + try { + scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName)); + scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName)); + scheduler.deleteJob(JobKey.jobKey(jobClassName)); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new JeroBootException("删除定时任务失败"); + } + } + + private static Job getClass(String classname) throws Exception { + Class class1 = Class.forName(classname); + return (Job) class1.newInstance(); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java new file mode 100644 index 00000000..417ec415 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java @@ -0,0 +1,272 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.*; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.api.ISysBaseAPI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLDecoder; +/** + *

+ * 用户表 前端控制器 + *

+ * + * @Author scott + * @since 2018-12-20 + */ +@Slf4j +@RestController +@RequestMapping("/sys/common") +public class CommonController { + + @Autowired + private ISysBaseAPI sysBaseAPI; + + @Resource + private IOSSFileService ossFileService; + + @Value(value = "${jero.path.upload}") + private String uploadpath; + + /** + * 本地:local minio:minio 阿里:alioss + */ + @Value(value="${jero.uploadType}") + private String uploadType; + /** + * 文件后缀黑名单 + */ + @Value(value="${jero.fileSuffixLimits}") + private String[] fileSuffixLimits; + + /** + * @Author 政辉 + * @return + */ + @GetMapping("/403") + public Result noauth() { + return Result.error("没有权限,请联系管理员授权"); + } + + /** + * 文件上传统一方法 + * @param request + * @param response + * @return + */ + @PostMapping(value = "/upload") + public Result upload(HttpServletRequest request, HttpServletResponse response) { + Result result = new Result<>(); + String savePath = ""; + String bizPath = request.getParameter("biz"); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + // 获取上传文件对象 + MultipartFile file = multipartRequest.getFile("file"); + // 文件类型是否处于黑名单 + if(CommonUtils.limitFileSuffix(file.getOriginalFilename(),fileSuffixLimits)){ + result.setMessage("该文件类型不允许上传"); + result.setSuccess(false); + result.setCode(0); + return result; + } + if(oConvertUtils.isEmpty(bizPath)){ + bizPath = ""; + } + if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){ + // 本地上传 + savePath = CommonUtils.uploadLocal(file,bizPath,uploadpath); + }else{ + // minio上传 + savePath = CommonUtils.upload(file, bizPath, uploadType); + } + if(oConvertUtils.isNotEmpty(savePath)){ + //上传成功 进行数据库存储 + OSSFile ossFile = new OSSFile(); + // 文件名 + String fileName = file.getOriginalFilename(); + fileName = CommonUtils.getFileName(fileName); + ossFile.setFileName(fileName); + ossFile.setUrl(savePath); + ossFileService.save(ossFile); + result.setMessage(savePath); + result.setResult(ossFile); + result.setSuccess(true); + }else { + result.setMessage("上传失败!"); + result.setSuccess(false); + } + return result; + } + + /** + * 预览图片&下载文件 + * + * @param id 传入文件id + * @param request + * @param response + */ + @GetMapping(value = "/download/{id}") + public void view(@PathVariable String id,HttpServletRequest request, HttpServletResponse response) { + // 查询数据表数据是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(OSSFile::getId,id); + OSSFile ossFile = ossFileService.getOne(queryWrapper); + if( null == ossFile){ + throw new JeroBootException("文件不存在.."); + } + String fileUrl = ossFile.getUrl(); + InputStream inputStream = null; + OutputStream outputStream = null; + try { + String fileName = ""; + if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){ + //本地下载 + String filePath = uploadpath + File.separator + fileUrl; + File file = new File(filePath); + if(!file.exists()){ + response.setStatus(404); + throw new RuntimeException("文件不存在.."); + } + // 文件名称 + fileName = file.getName(); + inputStream = new BufferedInputStream(new FileInputStream(filePath)); + }else if(CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)){ + // minio 下载 + // 通过MinioUtil查询时 只需要桶后面的路径 + String minioUrl = MinioUtil.getMinioUrl(); + // Linux/unix 系统下文件路径分隔符为"/" 获取minio与存储桶的路径 + minioUrl = minioUrl + MinioUtil.getBucketName() + "/"; + String url = fileUrl.replace(minioUrl, ""); + // 文件名称 + fileName = ossFile.getFileName(); + inputStream = MinioUtil.getMinioFile(MinioUtil.getBucketName(), url); + } + response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("UTF-8"),"iso-8859-1")); + response.setContentType("application/force-download");// 设置强制下载不打开 + outputStream = response.getOutputStream(); + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + response.flushBuffer(); + } catch (IOException e) { + log.error("预览文件失败" + e.getMessage()); + response.setStatus(404); + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + + } + + /** + * @功能:pdf预览Iframe + * @param modelAndView + * @return + */ + @RequestMapping("/pdf/pdfPreviewIframe") + public ModelAndView pdfPreviewIframe(ModelAndView modelAndView) { + modelAndView.setViewName("pdfPreviewIframe"); + return modelAndView; + } + + /** + * 把指定URL后的字符串全部截断当成参数 + * 这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题 + * @param request + * @return + */ + private static String extractPathFromPattern(final HttpServletRequest request) { + String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); + return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path); + } + + /** + * 中转HTTP请求,解决跨域问题 + * + * @param url 必填:请求地址 + * @return + */ + @RequestMapping("/transitRESTful") + public Result transitRESTful(@RequestParam("url") String url, HttpServletRequest request) { + try { + ServletServerHttpRequest httpRequest = new ServletServerHttpRequest(request); + // 中转请求method、body + HttpMethod method = httpRequest.getMethod(); + JSONObject params; + try { + params = JSON.parseObject(JSON.toJSONString(httpRequest.getBody())); + } catch (Exception e) { + params = new JSONObject(); + } + // 中转请求问号参数 + JSONObject variables = JSON.parseObject(JSON.toJSONString(request.getParameterMap())); + variables.remove("url"); + // 在 headers 里传递Token + String token = TokenUtils.getTokenByRequest(request); + HttpHeaders headers = new HttpHeaders(); + headers.set("X-Access-Token", token); + // 发送请求 + String httpURL = URLDecoder.decode(url, "UTF-8"); + ResponseEntity response = RestUtil.request(httpURL, method, headers , variables, params, String.class); + // 封装返回结果 + Result result = new Result<>(); + int statusCode = response.getStatusCodeValue(); + result.setCode(statusCode); + result.setSuccess(statusCode == 200); + String responseBody = response.getBody(); + try { + // 尝试将返回结果转为JSON + Object json = JSON.parse(responseBody); + result.setResult(json); + } catch (Exception e) { + // 转成JSON失败,直接返回原始数据 + result.setResult(responseBody); + } + return result; + } catch (Exception e) { + log.debug("中转HTTP请求失败", e); + return Result.error(e.getMessage()); + } + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java new file mode 100644 index 00000000..d218bb5d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java @@ -0,0 +1,89 @@ +package com.jero.modules.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.jero.modules.system.entity.SysConfusion; +import com.jero.modules.system.entity.SysDepartRolePermission; +import com.jero.modules.system.mapper.SysConfusionMapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.util.SqlInjectionUtil; +import com.jero.modules.system.mapper.SysDictMapper; +import com.jero.modules.system.model.DuplicateCheckVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +/** + * @Title: DuplicateCheckAction + * @Description: 重复校验工具 + * @Author 张代浩 + * @Date 2019-03-25 + * @Version V1.0 + */ +@Slf4j +@RestController +@RequestMapping("/sys/duplicate") +@Api(tags = "重复校验") +public class DuplicateCheckController { + + @Resource + SysDictMapper sysDictMapper; + + @Resource + SysConfusionMapper sysConfusionMapper; + + /** + * 校验数据是否在系统中是否存在 + * + * @return + */ + @RequestMapping(value = "/check", method = RequestMethod.GET) + @ApiOperation("重复校验接口") + public Result doDuplicateCheck(@Validated DuplicateCheckVo duplicateCheckVo, HttpServletRequest request) { + Long num = null; + SysConfusion sysConfusion = changeRealName(duplicateCheckVo.getConfusionCode()); + + duplicateCheckVo.setTableName(sysConfusion.getTableName()); + duplicateCheckVo.setFieldName(sysConfusion.getFieldName()); + log.info("----duplicate check------:" + duplicateCheckVo.toString()); + //关联表字典(举例:sys_user,realname,id) + //SQL注入校验(只限制非法串改数据库) + final String[] sqlInjCheck = {duplicateCheckVo.getTableName(), duplicateCheckVo.getFieldName()}; + SqlInjectionUtil.filterContent(sqlInjCheck); + if (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) { + // [2].编辑页面校验 + num = sysDictMapper.duplicateCheckCountSql(duplicateCheckVo); + } else { + // [1].添加页面校验 + num = sysDictMapper.duplicateCheckCountSqlNoDataId(duplicateCheckVo); + } + + if (num == null || num == 0) { + // 该值可用 + return Result.OK("该值可用!"); + } else { + // 该值不可用 + log.info("该值不可用,系统中已存在!"); + return Result.error("该值不可用,系统中已存在!"); + } + } + + /** + * 根据混淆code转换为真实表名和字段名 + * + * @param confusionCode 混淆code + * @return 真实表名和字段名 + */ + private SysConfusion changeRealName(String confusionCode) { + + SysConfusion sysConfusion = sysConfusionMapper.selectOne(new QueryWrapper().lambda().eq(SysConfusion::getConfusionCode, confusionCode)); + return sysConfusion; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java new file mode 100644 index 00000000..85751c08 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java @@ -0,0 +1,574 @@ +package com.jero.modules.system.controller; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.asymmetric.RSA; +import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.exceptions.ClientException; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.*; +import com.jero.common.util.encryption.EncryptedString; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.model.SysLoginModel; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.service.ISysDictService; +import com.jero.modules.system.service.ISysLogService; +import com.jero.modules.system.service.ISysUserService; +import com.jero.modules.system.util.RandImageUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.security.KeyPair; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.*; + +/** + * @Author scott + * @since 2018-12-17 + */ +@RestController +@RequestMapping("/sys") +@Api(tags = "用户登录") +@Slf4j +public class LoginController { + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private ISysLogService logService; + @Autowired + private RedisUtil redisUtil; + @Autowired + private ISysDepartService sysDepartService; + @Autowired + private ISysDictService sysDictService; + @Resource + private BaseCommonService baseCommonService; + + private static final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890"; + /** + * 密码登录错误的次数前缀 + */ + public static final String RETRY_LOGIN_PREFIX = "login:retryLoginCount_"; + /** + * 密码登录错误的最大限制次数 + */ + public static final int RETRY_LOGIN_MAX_COUNT = 5; + + @ApiOperation("登录接口") + @RequestMapping(value = "/login", method = RequestMethod.POST) + public Result login(@RequestBody SysLoginModel sysLoginModel) { + Result result = new Result<>(); + String username = sysLoginModel.getUsername(); + String password = sysLoginModel.getPassword(); + String rsaPublicKey = sysLoginModel.getRsaPublicKey(); + String rsaPrivateKey = String.valueOf(redisUtil.get(rsaPublicKey)); + //update-begin--Author:scott Date:20190805 for:暂时注释掉密码加密逻辑,有点问题 + //前端密码加密,后端进行密码解密 + //password = AesEncryptUtil.desEncrypt(sysLoginModel.getPassword().replaceAll("%2B", "\\+")).trim();//密码解密 + //update-begin--Author:scott Date:20190805 for:暂时注释掉密码加密逻辑,有点问题 + //update-begin-author:taoyan date:20190828 for:校验验证码 + String captcha = sysLoginModel.getCaptcha(); + if (captcha == null) { + result.error500("验证码无效"); + return result; + } + String lowerCaseCaptcha = captcha.toLowerCase(); + String realKey = MD5Util.MD5Encode(lowerCaseCaptcha + sysLoginModel.getCheckKey(), "utf-8"); + Object checkCode = redisUtil.get(realKey); + //当进入登录页时,有一定几率出现验证码错误 #1714 + if (checkCode == null || !checkCode.toString().equals(lowerCaseCaptcha)) { + result.error500("验证码错误"); + return result; + } else { + redisUtil.del(realKey); + } + try { + //解密获取密码和用户名 + password = CommonUtils.decryptBtRsaPriKey(password, rsaPrivateKey); + username = CommonUtils.decryptBtRsaPriKey(username, rsaPrivateKey); + } catch (Exception e) { + e.printStackTrace(); + } + //1. 校验用户是否有效 + //update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUser::getUsername, username); + SysUser sysUser = sysUserService.getOne(queryWrapper); + //update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false + result = sysUserService.checkUserIsEffective(sysUser); + if (!result.isSuccess()) { + return result; + } + + // 若用户名有效,则查询该账号的登陆失败次数是否符合等保要求 + int retryCount = 0; + if (redisUtil.get(RETRY_LOGIN_PREFIX + username) != null) { + retryCount = (int) redisUtil.get(RETRY_LOGIN_PREFIX + username); + } + if (retryCount >= RETRY_LOGIN_MAX_COUNT) { + result.error500("密码错误次数过多,请稍后重试"); + return result; + } + //2. 校验用户名或密码是否正确 + String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); + String syspassword = sysUser.getPassword(); + if (!syspassword.equals(userpassword)) { + // 重试登录次数加一 + retryCount++; + if (retryCount == 1) { + redisUtil.set(RETRY_LOGIN_PREFIX + username, retryCount, 60 * 30); + } else { + redisUtil.set(RETRY_LOGIN_PREFIX + username, retryCount, redisUtil.getExpire(RETRY_LOGIN_PREFIX + username)); + } + String msg = retryCount == RETRY_LOGIN_MAX_COUNT ? "密码错误次数过多,请稍后重试" : "用户名或密码错误,剩余可登录次数:" + (RETRY_LOGIN_MAX_COUNT - retryCount); + result.error500(msg); + return result; + } + //登录成功,清除错误登录次数 + redisUtil.del(RETRY_LOGIN_PREFIX + username); + + //用户登录信息 + userInfo(sysUser, result); + //update-begin--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + LoginUser loginUser = new LoginUser(); + BeanUtils.copyProperties(sysUser, loginUser); + baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser); + //update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + return result; + } + + /** + * 退出登录 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/logout") + public Result logout(HttpServletRequest request, HttpServletResponse response) { + //用户退出逻辑 + String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); + if (oConvertUtils.isEmpty(token)) { + return Result.error("退出登录失败!"); + } + String username = JwtUtil.getUsername(token); + LoginUser sysUser = sysBaseAPI.getUserByName(username); + if (sysUser != null) { + //update-begin--Author:wangshuai Date:20200714 for:登出日志没有记录人员 + baseCommonService.addLog("用户名: " + sysUser.getRealname() + ",退出成功!", CommonConstant.LOG_TYPE_1, null, sysUser); + //update-end--Author:wangshuai Date:20200714 for:登出日志没有记录人员 + log.info(" 用户名: " + sysUser.getRealname() + ",退出成功! "); + //清空用户登录Token缓存 + redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token); + //清空用户登录Shiro权限缓存 + redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId()); + //清空用户的缓存信息(包括部门信息),例如sys:cache:user:: + redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername())); + //调用shiro的logout + SecurityUtils.getSubject().logout(); + return Result.OK("退出登录成功!"); + } else { + return Result.error("Token无效!"); + } + } + + /** + * 获取访问量 + * + * @return + */ + @GetMapping("loginfo") + public Result loginfo() { + Result result = new Result(); + JSONObject obj = new JSONObject(); + //update-begin--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + // 获取一天的开始和结束时间 + Calendar calendar = new GregorianCalendar(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date dayStart = calendar.getTime(); + calendar.add(Calendar.DATE, 1); + Date dayEnd = calendar.getTime(); + // 获取系统访问记录 + Long totalVisitCount = logService.findTotalVisitCount(); + obj.put("totalVisitCount", totalVisitCount); + Long todayVisitCount = logService.findTodayVisitCount(dayStart, dayEnd); + obj.put("todayVisitCount", todayVisitCount); + Long todayIp = logService.findTodayIp(dayStart, dayEnd); + //update-end--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + obj.put("todayIp", todayIp); + result.setResult(obj); + result.success("登录成功"); + return result; + } + + /** + * 获取访问量 + * + * @return + */ + @GetMapping("visitInfo") + public Result>> visitInfo() { + Result>> result = new Result>>(); + Calendar calendar = new GregorianCalendar(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + calendar.add(Calendar.DAY_OF_MONTH, 1); + Date dayEnd = calendar.getTime(); + calendar.add(Calendar.DAY_OF_MONTH, -7); + Date dayStart = calendar.getTime(); + List> list = logService.findVisitCount(dayStart, dayEnd); + result.setResult(oConvertUtils.toLowerCasePageList(list)); + return result; + } + + + /** + * 登陆成功选择用户当前部门 + * + * @param user + * @return + */ + @RequestMapping(value = "/selectDepart", method = RequestMethod.PUT) + public Result selectDepart(@RequestBody SysUser user) { + Result result = new Result(); + String username = user.getUsername(); + if (oConvertUtils.isEmpty(username)) { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + username = sysUser.getUsername(); + } + String orgCode = user.getOrgCode(); + this.sysUserService.updateUserDepart(username, orgCode); + SysUser sysUser = sysUserService.getUserByName(username); + JSONObject obj = new JSONObject(); + obj.put("userInfo", sysUser); + result.setResult(obj); + return result; + } + + /** + * 短信登录接口 + * + * @param jsonObject + * @return + */ + @PostMapping(value = "/sms") + public Result sms(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String mobile = jsonObject.get("mobile").toString(); + //手机号模式 登录模式: "2" 注册模式: "1" + String smsmode = jsonObject.get("smsmode").toString(); + log.info(mobile); + if (oConvertUtils.isEmpty(mobile)) { + result.setMessage("手机号不允许为空!"); + result.setSuccess(false); + return result; + } + Object object = redisUtil.get(mobile); + if (object != null) { + result.setMessage("验证码10分钟内,仍然有效!"); + result.setSuccess(false); + return result; + } + + //随机数 + String captcha = RandomUtil.randomNumbers(6); + JSONObject obj = new JSONObject(); + obj.put("code", captcha); + try { + boolean b = false; + //注册模板 + if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) { + SysUser sysUser = sysUserService.getUserByPhone(mobile); + if (sysUser != null) { + result.error500(" 手机号已经注册,请直接登录!"); + baseCommonService.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null); + return result; + } + b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE); + } else { + //登录模式,校验用户有效性 + SysUser sysUser = sysUserService.getUserByPhone(mobile); + result = sysUserService.checkUserIsEffective(sysUser); + if (!result.isSuccess()) { + String message = result.getMessage(); + if ("该用户不存在,请注册".equals(message)) { + result.error500("该用户不存在或未绑定手机号"); + } + return result; + } + + /** + * smsmode 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 + */ + if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) { + //登录模板 + b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); + } else if (CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) { + //忘记密码模板 + b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); + } + } + + if (b == false) { + result.setMessage("短信验证码发送失败,请稍后重试"); + result.setSuccess(false); + return result; + } + //验证码10分钟内有效 + redisUtil.set(mobile, captcha, 600); + //update-begin--Author:scott Date:20190812 for:issues#391 + //result.setResult(captcha); + //update-end--Author:scott Date:20190812 for:issues#391 + result.setSuccess(true); + + } catch (ClientException e) { + e.printStackTrace(); + result.error500(" 短信接口未配置,请联系管理员!"); + return result; + } + return result; + } + + + /** + * 手机号登录接口 + * + * @param jsonObject + * @return + */ + @ApiOperation("手机号登录接口") + @PostMapping("/phoneLogin") + public Result phoneLogin(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String phone = jsonObject.getString("mobile"); + + //校验用户有效性 + SysUser sysUser = sysUserService.getUserByPhone(phone); + result = sysUserService.checkUserIsEffective(sysUser); + if (!result.isSuccess()) { + return result; + } + + String smscode = jsonObject.getString("captcha"); + Object code = redisUtil.get(phone); + if (!smscode.equals(code)) { + result.setMessage("手机验证码错误"); + return result; + } + //用户信息 + userInfo(sysUser, result); + //添加日志 + baseCommonService.addLog("用户名: " + sysUser.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null); + + return result; + } + + + /** + * 用户信息 + * + * @param sysUser + * @param result + * @return + */ + private Result userInfo(SysUser sysUser, Result result) { + String syspassword = sysUser.getPassword(); + String username = sysUser.getUsername(); + // 生成token + String token = JwtUtil.sign(username, syspassword); + // 设置token缓存有效时间 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); + + // 获取用户部门信息 + JSONObject obj = new JSONObject(); + List departs = sysDepartService.queryUserDeparts(sysUser.getId()); + obj.put("departs", departs); + if (departs == null || departs.size() == 0) { + obj.put("multi_depart", 0); + } else if (departs.size() == 1) { + sysUserService.updateUserDepart(username, departs.get(0).getOrgCode()); + obj.put("multi_depart", 1); + } else { + //查询当前是否有登录部门 + // update-begin--Author:wangshuai Date:20200805 for:如果用戶为选择部门,数据库为存在上一次登录部门,则取一条存进去 + SysUser sysUserById = sysUserService.getById(sysUser.getId()); + if (oConvertUtils.isEmpty(sysUserById.getOrgCode())) { + sysUserService.updateUserDepart(username, departs.get(0).getOrgCode()); + } + // update-end--Author:wangshuai Date:20200805 for:如果用戶为选择部门,数据库为存在上一次登录部门,则取一条存进去 + obj.put("multi_depart", 2); + } + obj.put("token", token); + obj.put("userInfo", sysUser); + obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); + result.setResult(obj); + result.success("登录成功"); + return result; + } + + /** + * 获取加密字符串 + * + * @return + */ + @GetMapping(value = "/getEncryptedString") + public Result> getEncryptedString() { + Result> result = new Result>(); + Map map = new HashMap(); + map.put("key", EncryptedString.key); + map.put("iv", EncryptedString.iv); + result.setResult(map); + return result; + } + + /** + * 后台生成图形验证码 :有效 + * + * @param response + * @param key + */ + @ApiOperation("获取验证码") + @GetMapping(value = "/randomImage/{key}") + public Result randomImage(HttpServletResponse response, @PathVariable String key) { + Result res = new Result(); + try { + String code = RandomUtil.randomString(BASE_CHECK_CODES, 4); + String lowerCaseCode = code.toLowerCase(); + String realKey = MD5Util.MD5Encode(lowerCaseCode + key, "utf-8"); + redisUtil.set(realKey, lowerCaseCode, 60); + String base64 = RandImageUtil.generate(code); + res.setSuccess(true); + res.setResult(base64); + } catch (Exception e) { + res.error500("获取验证码出错" + e.getMessage()); + e.printStackTrace(); + } + return res; + } + + /** + * app登录 + * + * @param sysLoginModel + * @return + * @throws Exception + */ + @RequestMapping(value = "/mLogin", method = RequestMethod.POST) + public Result mLogin(@RequestBody SysLoginModel sysLoginModel) throws Exception { + Result result = new Result(); + String username = sysLoginModel.getUsername(); + String password = sysLoginModel.getPassword(); + + //1. 校验用户是否有效 + SysUser sysUser = sysUserService.getUserByName(username); + result = sysUserService.checkUserIsEffective(sysUser); + if (!result.isSuccess()) { + return result; + } + + //2. 校验用户名或密码是否正确 + String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); + String syspassword = sysUser.getPassword(); + if (!syspassword.equals(userpassword)) { + result.error500("用户名或密码错误"); + return result; + } + + String orgCode = sysUser.getOrgCode(); + if (oConvertUtils.isEmpty(orgCode)) { + //如果当前用户无选择部门 查看部门关联信息 + List departs = sysDepartService.queryUserDeparts(sysUser.getId()); + if (departs == null || departs.size() == 0) { + result.error500("用户暂未归属部门,不可登录!"); + return result; + } + orgCode = departs.get(0).getOrgCode(); + sysUser.setOrgCode(orgCode); + this.sysUserService.updateUserDepart(username, orgCode); + } + JSONObject obj = new JSONObject(); + //用户登录信息 + obj.put("userInfo", sysUser); + + // 生成token + String token = JwtUtil.sign(username, syspassword); + // 设置超时时间 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); + + //token 信息 + obj.put("token", token); + result.setResult(obj); + result.setSuccess(true); + result.setCode(200); + baseCommonService.addLog("用户名: " + username + ",登录成功[移动端]!", CommonConstant.LOG_TYPE_1, null); + return result; + } + + /** + * 图形验证码 + * + * @param sysLoginModel + * @return + */ + @RequestMapping(value = "/checkCaptcha", method = RequestMethod.POST) + public Result checkCaptcha(@RequestBody SysLoginModel sysLoginModel) { + String captcha = sysLoginModel.getCaptcha(); + String checkKey = sysLoginModel.getCheckKey(); + if (captcha == null) { + return Result.error("验证码无效"); + } + String lowerCaseCaptcha = captcha.toLowerCase(); + String realKey = MD5Util.MD5Encode(lowerCaseCaptcha + checkKey, "utf-8"); + Object checkCode = redisUtil.get(realKey); + if (checkCode == null || !checkCode.equals(lowerCaseCaptcha)) { + return Result.error("验证码错误"); + } + return Result.OK(); + } + + /** + * 返回一个RSA公钥 + * + * @param + * @return com.jero.common.api.vo.Result + * @author 马志朝 + * @date 2021/4/15 15:01 + */ + @ApiOperation("获取RSA公钥") + @GetMapping("/getRSAPublicKey") + public Result getRSAPublicKey() { + RSA rsa = new RSA(); + String privateKeyBase64 = rsa.getPrivateKeyBase64(); + String publicKeyBase64 = rsa.getPublicKeyBase64(); + //存到redis key为公钥 value为私钥 + redisUtil.set(publicKeyBase64, privateKeyBase64, 300L); + Result result = new Result<>(); + result.setResult(publicKeyBase64); + return result; + } +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java new file mode 100644 index 00000000..9796eebd --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java @@ -0,0 +1,426 @@ +package com.jero.modules.system.controller; + +import java.io.IOException; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.CommonSendStatus; +import com.jero.common.constant.WebsocketConst; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.message.websocket.WebSocket; +import com.jero.modules.system.entity.SysAnnouncement; +import com.jero.modules.system.entity.SysAnnouncementSend; +import com.jero.modules.system.service.ISysAnnouncementSendService; +import com.jero.modules.system.service.ISysAnnouncementService; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Title: Controller + * @Description: 系统通告表 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +@RestController +@RequestMapping("/sys/annountCement") +@Slf4j +public class SysAnnouncementController { + @Autowired + private ISysAnnouncementService sysAnnouncementService; + @Autowired + private ISysAnnouncementSendService sysAnnouncementSendService; + @Resource + private WebSocket webSocket; + + /** + * 分页列表查询 + * @param sysAnnouncement + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> queryPageList(SysAnnouncement sysAnnouncement, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + QueryWrapper queryWrapper = new QueryWrapper(sysAnnouncement); + Page page = new Page(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage pageList = sysAnnouncementService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param sysAnnouncement + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result add(@RequestBody SysAnnouncement sysAnnouncement) { + Result result = new Result(); + try { + sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + sysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0);//未发布 + sysAnnouncementService.saveAnnouncement(sysAnnouncement); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysAnnouncement + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result eidt(@RequestBody SysAnnouncement sysAnnouncement) { + Result result = new Result(); + SysAnnouncement sysAnnouncementEntity = sysAnnouncementService.getById(sysAnnouncement.getId()); + if(sysAnnouncementEntity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysAnnouncementService.upDateAnnouncement(sysAnnouncement); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_1.toString()); + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + String[] id = ids.split(","); + for(int i=0;i queryById(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysAnnouncement); + result.setSuccess(true); + } + return result; + } + + /** + * 更新发布操作 + * @param id + * @return + */ + @RequestMapping(value = "/doReleaseData", method = RequestMethod.GET) + public Result doReleaseData(@RequestParam(name="id",required=true) String id, HttpServletRequest request) { + Result result = new Result(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + sysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1);//发布中 + sysAnnouncement.setSendTime(new Date()); + String currentUserName = JwtUtil.getUserNameByToken(request); + sysAnnouncement.setSender(currentUserName); + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + if(ok) { + result.success("该系统通知发布成功"); + if(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) { + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC); + obj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId()); + obj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile()); + webSocket.sendMessage(obj.toJSONString()); + }else { + // 2.插入用户通告阅读标记表记录 + String userId = sysAnnouncement.getUserIds(); + String[] userIds = userId.substring(0, (userId.length()-1)).split(","); + String anntId = sysAnnouncement.getId(); + Date refDate = new Date(); + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER); + obj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId()); + obj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile()); + webSocket.sendMessage(userIds, obj.toJSONString()); + } + } + } + + return result; + } + + /** + * 更新撤销操作 + * @param id + * @return + */ + @RequestMapping(value = "/doReovkeData", method = RequestMethod.GET) + public Result doReovkeData(@RequestParam(name="id",required=true) String id, HttpServletRequest request) { + Result result = new Result(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + sysAnnouncement.setSendStatus(CommonSendStatus.REVOKE_STATUS_2);//撤销发布 + sysAnnouncement.setCancelTime(new Date()); + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + if(ok) { + result.success("该系统通知撤销成功"); + } + } + + return result; + } + + /** + * @功能:补充用户数据,并返回系统消息 + * @return + */ + @RequestMapping(value = "/listByUser", method = RequestMethod.GET) + public Result> listByUser() { + Result> result = new Result>(); + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + // 1.将系统消息补充到用户通告阅读标记表中 + LambdaQueryWrapper querySaWrapper = new LambdaQueryWrapper(); + querySaWrapper.eq(SysAnnouncement::getMsgType,CommonConstant.MSG_TYPE_ALL); // 全部人员 + querySaWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0.toString()); // 未删除 + querySaWrapper.eq(SysAnnouncement::getSendStatus, CommonConstant.HAS_SEND); //已发布 + querySaWrapper.ge(SysAnnouncement::getEndTime, sysUser.getCreateTime()); //新注册用户不看结束通知 + //update-begin--Author:liusq Date:20210108 for:[JT-424] 【开源issue】bug处理-------------------- + querySaWrapper.notInSql(SysAnnouncement::getId,"select annt_id from sys_announcement_send where user_id='"+userId+"'"); + //update-begin--Author:liusq Date:20210108 for: [JT-424] 【开源issue】bug处理-------------------- + List announcements = sysAnnouncementService.list(querySaWrapper); + if(announcements.size()>0) { + for(int i=0;i query = new LambdaQueryWrapper<>(); + query.eq(SysAnnouncementSend::getAnntId,announcements.get(i).getId()); + query.eq(SysAnnouncementSend::getUserId,userId); + SysAnnouncementSend one = sysAnnouncementSendService.getOne(query); + if(null==one){ + SysAnnouncementSend announcementSend = new SysAnnouncementSend(); + announcementSend.setAnntId(announcements.get(i).getId()); + announcementSend.setUserId(userId); + announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG); + sysAnnouncementSendService.save(announcementSend); + } + //update-end--Author:wangshuai Date:20200803 for: 通知公告消息重复LOWCOD-759------------ + } + } + // 2.查询用户未读的系统消息 + Page anntMsgList = new Page(0,5); + anntMsgList = sysAnnouncementService.querySysCementPageByUserId(anntMsgList,userId,"1");//通知公告消息 + Page sysMsgList = new Page(0,5); + sysMsgList = sysAnnouncementService.querySysCementPageByUserId(sysMsgList,userId,"2");//系统消息 + Map sysMsgMap = new HashMap(); + sysMsgMap.put("sysMsgList", sysMsgList.getRecords()); + sysMsgMap.put("sysMsgTotal", sysMsgList.getTotal()); + sysMsgMap.put("anntMsgList", anntMsgList.getRecords()); + sysMsgMap.put("anntMsgTotal", anntMsgList.getTotal()); + result.setSuccess(true); + result.setResult(sysMsgMap); + return result; + } + + + /** + * 导出excel + * + * @param request + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysAnnouncement sysAnnouncement,HttpServletRequest request) { + // Step.1 组装查询条件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(sysAnnouncement); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + queryWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0); + List pageList = sysAnnouncementService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "系统通告列表"); + mv.addObject(NormalExcelConstants.CLASS, SysAnnouncement.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("系统通告列表数据", "导出人:"+user.getRealname(), "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List listSysAnnouncements = ExcelImportUtil.importExcel(file.getInputStream(), SysAnnouncement.class, params); + for (SysAnnouncement sysAnnouncementExcel : listSysAnnouncements) { + if(sysAnnouncementExcel.getDelFlag()==null){ + sysAnnouncementExcel.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + } + sysAnnouncementService.save(sysAnnouncementExcel); + } + return Result.OK("文件导入成功!数据行数:" + listSysAnnouncements.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + /** + *同步消息 + * @param anntId + * @return + */ + @RequestMapping(value = "/syncNotic", method = RequestMethod.GET) + public Result syncNotic(@RequestParam(name="anntId",required=false) String anntId, HttpServletRequest request) { + Result result = new Result(); + JSONObject obj = new JSONObject(); + if(StringUtils.isNotBlank(anntId)){ + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(anntId); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + if(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) { + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC); + obj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId()); + obj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile()); + webSocket.sendMessage(obj.toJSONString()); + }else { + // 2.插入用户通告阅读标记表记录 + String userId = sysAnnouncement.getUserIds(); + if(oConvertUtils.isNotEmpty(userId)){ + String[] userIds = userId.substring(0, (userId.length()-1)).split(","); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER); + obj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId()); + obj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile()); + webSocket.sendMessage(userIds, obj.toJSONString()); + } + } + } + }else{ + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC); + obj.put(WebsocketConst.MSG_TXT, "批量设置已读"); + webSocket.sendMessage(obj.toJSONString()); + } + return result; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementSendController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementSendController.java new file mode 100644 index 00000000..fe8cc372 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementSendController.java @@ -0,0 +1,242 @@ +package com.jero.modules.system.controller; + +import java.util.Arrays; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysAnnouncementSend; +import com.jero.modules.system.model.AnnouncementSendModel; +import com.jero.modules.system.service.ISysAnnouncementSendService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: 用户通告阅读标记表 + * @Author: jero-boot + * @Date: 2019-02-21 + * @Version: V1.0 + */ +@RestController +@RequestMapping("/sys/sysAnnouncementSend") +@Slf4j +public class SysAnnouncementSendController { + @Autowired + private ISysAnnouncementSendService sysAnnouncementSendService; + + /** + * 分页列表查询 + * @param sysAnnouncementSend + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/page") + public Result> queryPageList(SysAnnouncementSend sysAnnouncementSend, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = new QueryWrapper(sysAnnouncementSend); + Page page = new Page(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage pageList = sysAnnouncementSendService.page(page, queryWrapper); + //log.info("查询当前页:"+pageList.getCurrent()); + //log.info("查询当前页数量:"+pageList.getSize()); + //log.info("查询结果数量:"+pageList.getRecords().size()); + //log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param sysAnnouncementSend + * @return + */ + @PostMapping(value = "/add") + public Result add(@RequestBody SysAnnouncementSend sysAnnouncementSend) { + Result result = new Result(); + try { + sysAnnouncementSendService.save(sysAnnouncementSend); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysAnnouncementSend + * @return + */ + @PutMapping(value = "/edit") + public Result eidt(@RequestBody SysAnnouncementSend sysAnnouncementSend) { + Result result = new Result(); + SysAnnouncementSend sysAnnouncementSendEntity = sysAnnouncementSendService.getById(sysAnnouncementSend.getId()); + if(sysAnnouncementSendEntity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysAnnouncementSendService.updateById(sysAnnouncementSend); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendService.getById(id); + if(sysAnnouncementSend==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysAnnouncementSendService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysAnnouncementSendService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendService.getById(id); + if(sysAnnouncementSend==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysAnnouncementSend); + result.setSuccess(true); + } + return result; + } + + /** + * @功能:更新用户系统消息阅读状态 + * @param json + * @return + */ + @PutMapping(value = "/editByAnntIdAndUserId") + public Result editById(@RequestBody JSONObject json) { + Result result = new Result(); + String anntId = json.getString("anntId"); + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda(); + updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG); + updateWrapper.set(SysAnnouncementSend::getReadTime, new Date()); + updateWrapper.last("where annt_id ='"+anntId+"' and user_id ='"+userId+"'"); + SysAnnouncementSend announcementSend = new SysAnnouncementSend(); + sysAnnouncementSendService.update(announcementSend, updateWrapper); + result.setSuccess(true); + return result; + } + + /** + * @功能:获取我的消息 + * @return + */ + @GetMapping(value = "/getMyAnnouncementSend") + public Result> getMyAnnouncementSend(AnnouncementSendModel announcementSendModel, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { + Result> result = new Result>(); + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + announcementSendModel.setUserId(userId); + announcementSendModel.setPageNo((pageNo-1)*pageSize); + announcementSendModel.setPageSize(pageSize); + Page pageList = new Page(pageNo,pageSize); + pageList = sysAnnouncementSendService.getMyAnnouncementSendPage(pageList, announcementSendModel); + result.setResult(pageList); + result.setSuccess(true); + return result; + } + + /** + * @功能:一键已读 + * @return + */ + @PutMapping(value = "/readAll") + public Result readAll() { + Result result = new Result(); + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda(); + updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG); + updateWrapper.set(SysAnnouncementSend::getReadTime, new Date()); + updateWrapper.last("where user_id ='"+userId+"'"); + SysAnnouncementSend announcementSend = new SysAnnouncementSend(); + sysAnnouncementSendService.update(announcementSend, updateWrapper); + result.setSuccess(true); + result.setMessage("全部已读"); + return result; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCategoryController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCategoryController.java new file mode 100644 index 00000000..3385a854 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCategoryController.java @@ -0,0 +1,503 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysCategory; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysCategoryService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + + /** + * @Description: 分类字典 + * @Author: jero-boot + * @Date: 2019-05-29 + * @Version: V1.0 + */ +@RestController +@RequestMapping("/sys/category") +@Slf4j +public class SysCategoryController { + @Autowired + private ISysCategoryService sysCategoryService; + + /** + * 分页列表查询 + * @param sysCategory + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequiresPermissions("sys:category:list") + @GetMapping(value = "/rootList") + public Result> queryPageList(SysCategory sysCategory, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + if(oConvertUtils.isEmpty(sysCategory.getPid())){ + sysCategory.setPid("0"); + } + Result> result = new Result>(); + + //--author:os_chengtgen---date:20190804 -----for: 分类字典页面显示错误,issues:377--------start + //QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap()); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("pid", sysCategory.getPid()); + //--author:os_chengtgen---date:20190804 -----for: 分类字典页面显示错误,issues:377--------end + + Page page = new Page(pageNo, pageSize); + IPage pageList = sysCategoryService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + @RequiresPermissions("sys:category:list") + @GetMapping(value = "/childList") + public Result> queryPageList(SysCategory sysCategory,HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap()); + List list = sysCategoryService.list(queryWrapper); + result.setSuccess(true); + result.setResult(list); + return result; + } + + + /** + * 添加 + * @param sysCategory + * @return + */ + @RequiresPermissions("sys:category:add") + @PostMapping(value = "/add") + public Result add(@RequestBody SysCategory sysCategory) { + Result result = new Result(); + try { + sysCategoryService.addSysCategory(sysCategory); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysCategory + * @return + */ + @RequiresPermissions("sys:category:edit") + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysCategory sysCategory) { + Result result = new Result(); + SysCategory sysCategoryEntity = sysCategoryService.getById(sysCategory.getId()); + if(sysCategoryEntity==null) { + result.error500("未找到对应实体"); + }else { + sysCategoryService.updateSysCategory(sysCategory); + result.success("修改成功!"); + } + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @RequiresPermissions("sys:category:list") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysCategory sysCategory = sysCategoryService.getById(id); + if(sysCategory==null) { + result.error500("未找到对应实体"); + }else { + this.sysCategoryService.deleteSysCategory(id); + result.success("删除成功!"); + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @RequiresPermissions("sys:category:del") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysCategoryService.deleteSysCategory(ids); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @RequiresPermissions("sys:category:list") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysCategory sysCategory = sysCategoryService.getById(id); + if(sysCategory==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysCategory); + result.setSuccess(true); + } + return result; + } + + /** + * 导出excel + * + * @param request + */ + @RequiresPermissions("sys:category:export") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysCategory sysCategory) { + // Step.1 组装查询条件查询数据 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, request.getParameterMap()); + List pageList = sysCategoryService.list(queryWrapper); + // Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + // 过滤选中数据 + String selections = request.getParameter("selections"); + if(oConvertUtils.isEmpty(selections)) { + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + }else { + List selectionList = Arrays.asList(selections.split(",")); + List exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList()); + mv.addObject(NormalExcelConstants.DATA_LIST, exportList); + } + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "分类字典列表"); + mv.addObject(NormalExcelConstants.CLASS, SysCategory.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("分类字典列表数据", "导出人:"+user.getRealname(), "导出信息")); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("sys:category:import") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List listSysCategorys = ExcelImportUtil.importExcel(file.getInputStream(), SysCategory.class, params); + //按照编码长度排序 + Collections.sort(listSysCategorys); + log.info("排序后的list====>",listSysCategorys); + for (SysCategory sysCategoryExcel : listSysCategorys) { + String code = sysCategoryExcel.getCode(); + if(code.length()>3){ + String pCode = sysCategoryExcel.getCode().substring(0,code.length()-3); + log.info("pCode====>",pCode); + String pId=sysCategoryService.queryIdByCode(pCode); + log.info("pId====>",pId); + if(StringUtils.isNotBlank(pId)){ + sysCategoryExcel.setPid(pId); + } + }else{ + sysCategoryExcel.setPid("0"); + } + sysCategoryService.save(sysCategoryExcel); + } + return Result.OK("文件导入成功!数据行数:" + listSysCategorys.size()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + + + + /** + * 加载单个数据 用于回显 + */ + @RequiresPermissions("sys:category:list") + @RequestMapping(value = "/loadOne", method = RequestMethod.GET) + public Result loadOne(@RequestParam(name="field") String field,@RequestParam(name="val") String val) { + Result result = new Result(); + try { + + QueryWrapper query = new QueryWrapper(); + query.eq(field, val); + List ls = this.sysCategoryService.list(query); + if(ls==null || ls.size()==0) { + result.setMessage("查询无果"); + result.setSuccess(false); + }else if(ls.size()>1) { + result.setMessage("查询数据异常,["+field+"]存在多个值:"+val); + result.setSuccess(false); + }else { + result.setSuccess(true); + result.setResult(ls.get(0)); + } + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 加载节点的子数据 + */ + @RequiresPermissions("sys:category:list") + @RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET) + public Result> loadTreeChildren(@RequestParam(name="pid") String pid) { + Result> result = new Result>(); + try { + List ls = this.sysCategoryService.queryListByPid(pid); + result.setResult(ls); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 加载一级节点/如果是同步 则所有数据 + */ + @RequiresPermissions("sys:category:list") + @RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET) + public Result> loadTreeRoot(@RequestParam(name="async") Boolean async,@RequestParam(name="pcode") String pcode) { + Result> result = new Result>(); + try { + List ls = this.sysCategoryService.queryListByCode(pcode); + if(!async) { + loadAllCategoryChildren(ls); + } + result.setResult(ls); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 递归求子节点 同步加载用到 + */ + @RequiresPermissions("sys:category:list") + private void loadAllCategoryChildren(List ls) { + for (TreeSelectModel tsm : ls) { + List temp = this.sysCategoryService.queryListByPid(tsm.getKey()); + if(temp!=null && temp.size()>0) { + tsm.setChildren(temp); + loadAllCategoryChildren(temp); + } + } + } + + /** + * 校验编码 + * @param pid + * @param code + * @return + */ + @RequiresPermissions("sys:category:list") + @GetMapping(value = "/checkCode") + public Result checkCode(@RequestParam(name="pid",required = false) String pid,@RequestParam(name="code",required = false) String code) { + if(oConvertUtils.isEmpty(code)){ + return Result.error("错误,类型编码为空!"); + } + if(oConvertUtils.isEmpty(pid)){ + return Result.OK(); + } + SysCategory parent = this.sysCategoryService.getById(pid); + if(code.startsWith(parent.getCode())){ + return Result.OK(); + }else{ + return Result.error("编码不符合规范,须以\""+parent.getCode()+"\"开头!"); + } + + } + + + /** + * 分类字典树控件 加载节点 + * @param pid + * @param pcode + * @param condition + * @return + */ + @RequiresPermissions("sys:category:list") + @RequestMapping(value = "/loadTreeData", method = RequestMethod.GET) + public Result> loadDict(@RequestParam(name="pid",required = false) String pid,@RequestParam(name="pcode",required = false) String pcode, @RequestParam(name="condition",required = false) String condition) { + Result> result = new Result>(); + //pid如果传值了 就忽略pcode的作用 + if(oConvertUtils.isEmpty(pid)){ + if(oConvertUtils.isEmpty(pcode)){ + result.setSuccess(false); + result.setMessage("加载分类字典树参数有误.[null]!"); + return result; + }else{ + if(ISysCategoryService.ROOT_PID_VALUE.equals(pcode)){ + pid = ISysCategoryService.ROOT_PID_VALUE; + }else{ + pid = this.sysCategoryService.queryIdByCode(pcode); + } + if(oConvertUtils.isEmpty(pid)){ + result.setSuccess(false); + result.setMessage("加载分类字典树参数有误.[code]!"); + return result; + } + } + } + Map query = null; + if(oConvertUtils.isNotEmpty(condition)) { + query = JSON.parseObject(condition, Map.class); + } + List ls = sysCategoryService.queryListByPid(pid,query); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * 分类字典控件数据回显[表单页面] + * + * @param ids + * @return + */ + @RequiresPermissions("sys:category:list") + @RequestMapping(value = "/loadDictItem", method = RequestMethod.GET) + public Result> loadDictItem(@RequestParam(name = "ids") String ids) { + Result> result = new Result<>(); + // 非空判断 + if (StringUtils.isBlank(ids)) { + result.setSuccess(false); + result.setMessage("ids 不能为空"); + return result; + } + String[] idArray = ids.split(","); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysCategory::getId, Arrays.asList(idArray)); + // 查询数据 + List list = this.sysCategoryService.list(query); + // 取出name并返回 + List textList = list.stream().map(SysCategory::getName).collect(Collectors.toList()); + result.setSuccess(true); + result.setResult(textList); + return result; + } + + /** + * [列表页面]加载分类字典数据 用于值的替换 + * @param code + * @return + */ + @RequiresPermissions("sys:category:list") + @RequestMapping(value = "/loadAllData", method = RequestMethod.GET) + public Result> loadAllData(@RequestParam(name="code",required = true) String code) { + Result> result = new Result>(); + LambdaQueryWrapper query = new LambdaQueryWrapper(); + if(oConvertUtils.isNotEmpty(code) && !"0".equals(code)){ + query.likeRight(SysCategory::getCode,code); + } + List list = this.sysCategoryService.list(query); + if(list==null || list.size()==0) { + result.setMessage("无数据,参数有误.[code]"); + result.setSuccess(false); + return result; + } + List rdList = new ArrayList(); + for (SysCategory c : list) { + rdList.add(new DictModel(c.getId(),c.getName())); + } + result.setSuccess(true); + result.setResult(rdList); + return result; + } + + /** + * 根据父级id批量查询子节点 + * @param parentIds + * @return + */ + @RequiresPermissions("sys:category:list") + @GetMapping("/getChildListBatch") + public Result getChildListBatch(@RequestParam("parentIds") String parentIds) { + try { + QueryWrapper queryWrapper = new QueryWrapper<>(); + List parentIdList = Arrays.asList(parentIds.split(",")); + queryWrapper.in("pid", parentIdList); + List list = sysCategoryService.list(queryWrapper); + IPage pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("批量查询子节点失败:" + e.getMessage()); + } + } + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCheckRuleController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCheckRuleController.java new file mode 100644 index 00000000..5466d242 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysCheckRuleController.java @@ -0,0 +1,186 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.AutoLog; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.modules.system.entity.SysCheckRule; +import com.jero.modules.system.service.ISysCheckRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.Arrays; + +/** + * @Description: 编码校验规则 + * @Author: jero-boot + * @Date: 2020-02-04 + * @Version: V1.0 + */ +@Slf4j +@Api(tags = "编码校验规则") +@RestController +@RequestMapping("/sys/checkRule") +public class SysCheckRuleController extends JeroController { + + @Autowired + private ISysCheckRuleService sysCheckRuleService; + + /** + * 分页列表查询 + * + * @param sysCheckRule + * @param pageNo + * @param pageSize + * @param request + * @return + */ + @AutoLog(value = "编码校验规则-分页列表查询") + @ApiOperation(value = "编码校验规则-分页列表查询", notes = "编码校验规则-分页列表查询") + @GetMapping(value = "/page") + public Result queryPageList( + SysCheckRule sysCheckRule, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest request + ) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysCheckRule, request.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = sysCheckRuleService.page(page, queryWrapper); + return Result.OK(pageList); + } + + + /** + * 通过id查询 + * + * @param ruleCode + * @return + */ + @AutoLog(value = "编码校验规则-通过Code校验传入的值") + @ApiOperation(value = "编码校验规则-通过Code校验传入的值", notes = "编码校验规则-通过Code校验传入的值") + @GetMapping(value = "/checkByCode") + public Result checkByCode( + @RequestParam(name = "ruleCode") String ruleCode, + @RequestParam(name = "value") String value + ) throws UnsupportedEncodingException { + SysCheckRule sysCheckRule = sysCheckRuleService.getByCode(ruleCode); + if (sysCheckRule == null) { + return Result.error("该编码不存在"); + } + JSONObject errorResult = sysCheckRuleService.checkValue(sysCheckRule, URLDecoder.decode(value, "UTF-8")); + if (errorResult == null) { + return Result.OK(); + } else { + Result r = Result.error(errorResult.getString("message")); + r.setResult(errorResult); + return r; + } + } + + /** + * 添加 + * + * @param sysCheckRule + * @return + */ + @AutoLog(value = "编码校验规则-添加") + @ApiOperation(value = "编码校验规则-添加", notes = "编码校验规则-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody SysCheckRule sysCheckRule) { + sysCheckRuleService.save(sysCheckRule); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysCheckRule + * @return + */ + @AutoLog(value = "编码校验规则-编辑") + @ApiOperation(value = "编码校验规则-编辑", notes = "编码校验规则-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysCheckRule sysCheckRule) { + sysCheckRuleService.updateById(sysCheckRule); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "编码校验规则-通过id删除") + @ApiOperation(value = "编码校验规则-通过id删除", notes = "编码校验规则-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysCheckRuleService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "编码校验规则-批量删除") + @ApiOperation(value = "编码校验规则-批量删除", notes = "编码校验规则-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.sysCheckRuleService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "编码校验规则-通过id查询") + @ApiOperation(value = "编码校验规则-通过id查询", notes = "编码校验规则-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + SysCheckRule sysCheckRule = sysCheckRuleService.getById(id); + return Result.OK(sysCheckRule); + } + + /** + * 导出excel + * + * @param request + * @param sysCheckRule + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysCheckRule sysCheckRule) { + return super.exportXls(request, sysCheckRule, SysCheckRule.class, "编码校验规则"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysCheckRule.class); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysConfusionController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysConfusionController.java new file mode 100644 index 00000000..6531a656 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysConfusionController.java @@ -0,0 +1,171 @@ +package com.jero.modules.system.controller; + +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.modules.system.entity.SysConfusion; +import com.jero.modules.system.service.ISysConfusionService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.system.base.controller.JeroController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.jero.common.aspect.annotation.AutoLog; + + +/** + * @Description: 混淆表 + * @Author: jero-boot + * @Date: 2021-08-05 + * @Version: V1.0 + */ +@Api(tags = "混淆表") +@RestController +@RequestMapping("/sys/confusion") +@Slf4j +public class SysConfusionController extends JeroController { + @Autowired + private ISysConfusionService sysConfusionService; + + /** + * 分页列表查询 + * + * @param sysConfusion + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "混淆表-分页列表查询") + @ApiOperation(value = "混淆表-分页列表查询", notes = "混淆表-分页列表查询") + @GetMapping(value = "/page") + public Result queryPageList(SysConfusion sysConfusion, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysConfusion, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysConfusionService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 列表查询 + * + * @return + */ + @AutoLog(value = "混淆表-列表查询") + @ApiOperation(value = "混淆表-列表查询", notes = "混淆表-列表查询") + @GetMapping(value = "/list") + public Result> queryList() { + List list = sysConfusionService.queryList(); + return Result.OK(list); + } + + /** + * 添加 + * + * @param sysConfusion + * @return + */ + @AutoLog(value = "混淆表-添加") + @ApiOperation(value = "混淆表-添加", notes = "混淆表-添加") + @PostMapping(value = "/add") + public Result add(@Validated @RequestBody SysConfusion sysConfusion) { + sysConfusionService.add(sysConfusion); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysConfusion + * @return + */ + @AutoLog(value = "混淆表-编辑") + @ApiOperation(value = "混淆表-编辑", notes = "混淆表-编辑") + @PutMapping(value = "/edit") + public Result edit(@Validated @RequestBody SysConfusion sysConfusion) { + sysConfusionService.editById(sysConfusion); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "混淆表-通过id删除") + @ApiOperation(value = "混淆表-通过id删除", notes = "混淆表-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysConfusionService.deleteById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "混淆表-批量删除") + @ApiOperation(value = "混淆表-批量删除", notes = "混淆表-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.sysConfusionService.deleteByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "混淆表-通过id查询") + @ApiOperation(value = "混淆表-通过id查询", notes = "混淆表-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + SysConfusion sysConfusion = sysConfusionService.queryById(id); + if (sysConfusion == null) { + return Result.error("未找到对应数据"); + } + return Result.OK(sysConfusion); + } + + /** + * 导出excel + * + * @param request + * @param sysConfusion + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysConfusion sysConfusion) { + return super.exportXls(request, sysConfusion, SysConfusion.class, "混淆表"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysConfusion.class); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataLogController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataLogController.java new file mode 100644 index 00000000..b0f14c12 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataLogController.java @@ -0,0 +1,94 @@ +package com.jero.modules.system.controller; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDataLog; +import com.jero.modules.system.service.ISysDataLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/sys/dataLog") +@Slf4j +public class SysDataLogController { + @Autowired + private ISysDataLogService service; + + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> queryPageList(SysDataLog dataLog,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(dataLog, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = service.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 查询对比数据 + * @param req + * @return + */ + @RequestMapping(value = "/queryCompareList", method = RequestMethod.GET) + public Result> queryCompareList(HttpServletRequest req) { + Result> result = new Result<>(); + String dataId1 = req.getParameter("dataId1"); + String dataId2 = req.getParameter("dataId2"); + List idList = new ArrayList(); + idList.add(dataId1); + idList.add(dataId2); + try { + List list = (List) service.listByIds(idList); + result.setResult(list); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return result; + } + + /** + * 查询版本信息 + * @param req + * @return + */ + @RequestMapping(value = "/queryDataVerList", method = RequestMethod.GET) + public Result> queryDataVerList(HttpServletRequest req) { + Result> result = new Result<>(); + String dataTable = req.getParameter("dataTable"); + String dataId = req.getParameter("dataId"); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("data_table", dataTable); + queryWrapper.eq("data_id", dataId); + List list = service.list(queryWrapper); + if(list==null||list.size()<=0) { + result.error500("未找到版本信息"); + }else { + result.setResult(list); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataSourceController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataSourceController.java new file mode 100644 index 00000000..20de1543 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDataSourceController.java @@ -0,0 +1,216 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.AutoLog; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.dynamic.db.DataSourceCachePool; +import com.jero.modules.system.entity.SysDataSource; +import com.jero.modules.system.service.ISysDataSourceService; +import com.jero.modules.system.util.SecurityUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.util.List; + +/** + * @Description: 多数据源管理 + * @Author: jero-boot + * @Date: 2019-12-25 + * @Version: V1.0 + */ +@Slf4j +@Api(tags = "多数据源管理") +@RestController +@RequestMapping("/sys/dataSource") +public class SysDataSourceController extends JeroController { + + @Autowired + private ISysDataSourceService sysDataSourceService; + + /** + * 分页列表查询 + * + * @param sysDataSource + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "多数据源管理-分页列表查询") + @ApiOperation(value = "多数据源管理-分页列表查询", notes = "多数据源管理-分页列表查询") + @GetMapping(value = "/page") + public Result queryPageList( + SysDataSource sysDataSource, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req + ) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDataSource, req.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = sysDataSourceService.page(page, queryWrapper); + try { + List records = pageList.getRecords(); + records.forEach(item->{ + String dbPassword = item.getDbPassword(); + if(StringUtils.isNotBlank(dbPassword)){ + String decodedStr = SecurityUtil.jiemi(dbPassword); + item.setDbPassword(decodedStr); + } + }); + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.getMessage()); + } + return Result.OK(pageList); + } + + @GetMapping(value = "/options") + public Result queryOptions(SysDataSource sysDataSource, HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDataSource, req.getParameterMap()); + List pageList = sysDataSourceService.list(queryWrapper); + JSONArray array = new JSONArray(pageList.size()); + for (SysDataSource item : pageList) { + JSONObject option = new JSONObject(3); + option.put("value", item.getCode()); + option.put("label", item.getName()); + option.put("text", item.getName()); + array.add(option); + } + return Result.OK(array); + } + + /** + * 添加 + * + * @param sysDataSource + * @return + */ + @AutoLog(value = "多数据源管理-添加") + @ApiOperation(value = "多数据源管理-添加", notes = "多数据源管理-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody SysDataSource sysDataSource) { + try { + String dbPassword = sysDataSource.getDbPassword(); + if(StringUtils.isNotBlank(dbPassword)){ + String encrypt = SecurityUtil.jiami(dbPassword); + sysDataSource.setDbPassword(encrypt); + } + sysDataSourceService.save(sysDataSource); + } catch (Exception e) { + e.printStackTrace(); + } + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysDataSource + * @return + */ + @AutoLog(value = "多数据源管理-编辑") + @ApiOperation(value = "多数据源管理-编辑", notes = "多数据源管理-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysDataSource sysDataSource) { + try { + SysDataSource d = sysDataSourceService.getById(sysDataSource.getId()); + DataSourceCachePool.removeCache(d.getCode()); + String dbPassword = sysDataSource.getDbPassword(); + if(StringUtils.isNotBlank(dbPassword)){ + String encrypt = SecurityUtil.jiami(dbPassword); + sysDataSource.setDbPassword(encrypt); + } + sysDataSourceService.updateById(sysDataSource); + } catch (Exception e) { + e.printStackTrace(); + } + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "多数据源管理-通过id删除") + @ApiOperation(value = "多数据源管理-通过id删除", notes = "多数据源管理-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id") String id) { + SysDataSource sysDataSource = sysDataSourceService.getById(id); + DataSourceCachePool.removeCache(sysDataSource.getCode()); + sysDataSourceService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "多数据源管理-批量删除") + @ApiOperation(value = "多数据源管理-批量删除", notes = "多数据源管理-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids") String ids) { + List idList = Arrays.asList(ids.split(",")); + idList.forEach(item->{ + SysDataSource sysDataSource = sysDataSourceService.getById(item); + DataSourceCachePool.removeCache(sysDataSource.getCode()); + }); + this.sysDataSourceService.removeByIds(idList); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "多数据源管理-通过id查询") + @ApiOperation(value = "多数据源管理-通过id查询", notes = "多数据源管理-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id") String id) { + SysDataSource sysDataSource = sysDataSourceService.getById(id); + return Result.OK(sysDataSource); + } + + /** + * 导出excel + * + * @param request + * @param sysDataSource + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysDataSource sysDataSource) { + return super.exportXls(request, sysDataSource, SysDataSource.class, "多数据源管理"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysDataSource.class); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartController.java new file mode 100644 index 00000000..745b0071 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartController.java @@ -0,0 +1,504 @@ +package com.jero.modules.system.controller; + +import java.io.IOException; +import java.util.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.system.vo.SysDepartTreeModel; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.ImportExcelUtil; +import com.jero.common.util.YouBianCodeUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.model.DepartIdModel; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.service.ISysUserDepartService; +import com.jero.modules.system.service.ISysUserService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +/** + *

+ * 部门表 前端控制器 + *

+ * + * @Author: Steve @Since: 2019-01-22 + */ +@RestController +@RequestMapping("/sys/sysDepart") +@Slf4j +public class SysDepartController { + + @Autowired + private ISysDepartService sysDepartService; + @Autowired + public RedisTemplate redisTemplate; + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysUserDepartService sysUserDepartService; + /** + * 查询数据 查出我的部门,并以树结构数据格式响应给前端 + * + * @return + */ + @RequiresPermissions("sys:depart:list") + @RequestMapping(value = "/queryMyDeptTreeList", method = RequestMethod.GET) + public Result> queryMyDeptTreeList() { + Result> result = new Result<>(); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + try { + if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){ + List list = sysDepartService.queryMyDeptTreeList(user.getDepartIds()); + result.setResult(list); + result.setMessage(CommonConstant.USER_IDENTITY_2.toString()); + result.setSuccess(true); + }else{ + result.setMessage(CommonConstant.USER_IDENTITY_1.toString()); + result.setSuccess(true); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return result; + } + + /** + * 查询数据 查出所有部门,并以树结构数据格式响应给前端 + * + * @return + */ + @RequiresPermissions("sys:depart:list") + @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) + public Result> queryTreeList() { + Result> result = new Result<>(); + try { + // 从内存中读取 +// List list =FindsDepartsChildrenUtil.getSysDepartTreeList(); +// if (CollectionUtils.isEmpty(list)) { +// list = sysDepartService.queryTreeList(); +// } + List list = sysDepartService.queryTreeList(); + result.setResult(list); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return result; + } + + /** + * 添加新数据 添加用户新建的部门对象数据,并保存到数据库 + * + * @param sysDepart + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:depart:add") + @RequestMapping(value = "/add", method = RequestMethod.POST) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public Result add(@RequestBody SysDepart sysDepart, HttpServletRequest request) { + Result result = new Result(); + String username = JwtUtil.getUserNameByToken(request); + try { + sysDepart.setCreateBy(username); + sysDepartService.saveDepartData(sysDepart, username); + //清除部门树内存 + // FindsDepartsChildrenUtil.clearSysDepartTreeList(); + // FindsDepartsChildrenUtil.clearDepartIdModel(); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑数据 编辑部门的部分数据,并保存到数据库 + * + * @param sysDepart + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:depart:edit") + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public Result edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) { + String username = JwtUtil.getUserNameByToken(request); + sysDepart.setUpdateBy(username); + Result result = new Result(); + SysDepart sysDepartEntity = sysDepartService.getById(sysDepart.getId()); + if (sysDepartEntity == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = sysDepartService.updateDepartDataById(sysDepart, username); + // TODO 返回false说明什么? + if (ok) { + //清除部门树内存 + //FindsDepartsChildrenUtil.clearSysDepartTreeList(); + //FindsDepartsChildrenUtil.clearDepartIdModel(); + result.success("修改成功!"); + } + } + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:depart:del") + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public Result delete(@RequestParam(name="id",required=true) String id) { + + Result result = new Result(); + SysDepart sysDepart = sysDepartService.getById(id); + if(sysDepart==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysDepartService.delete(id); + if(ok) { + //清除部门树内存 + //FindsDepartsChildrenUtil.clearSysDepartTreeList(); + // FindsDepartsChildrenUtil.clearDepartIdModel(); + result.success("删除成功!"); + } + } + return result; + } + + + /** + * 批量删除 根据前端请求的多个ID,对数据库执行删除相关部门数据的操作 + * + * @param ids + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:depart:del") + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + + Result result = new Result(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.sysDepartService.deleteBatchWithChildren(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有部门的名称,方便用户的操作 + * + * @return + */ + @RequiresPermissions("sys:depart:list") + @RequestMapping(value = "/queryIdTree", method = RequestMethod.GET) + public Result> queryIdTree() { +// Result> result = new Result>(); +// List idList; +// try { +// idList = FindsDepartsChildrenUtil.wrapDepartIdModel(); +// if (idList != null && idList.size() > 0) { +// result.setResult(idList); +// result.setSuccess(true); +// } else { +// sysDepartService.queryTreeList(); +// idList = FindsDepartsChildrenUtil.wrapDepartIdModel(); +// result.setResult(idList); +// result.setSuccess(true); +// } +// return result; +// } catch (Exception e) { +// log.error(e.getMessage(),e); +// result.setSuccess(false); +// return result; +// } + Result> result = new Result<>(); + try { + List list = sysDepartService.queryDepartIdTreeList(); + result.setResult(list); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return result; + } + + /** + *

+ * 部门搜索功能方法,根据关键字模糊搜索相关部门 + *

+ * + * @param keyWord + * @return + */ + @RequiresPermissions("sys:depart:list") + @RequestMapping(value = "/searchBy", method = RequestMethod.GET) + public Result> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord,@RequestParam(name = "myDeptSearch", required = false) String myDeptSearch) { + Result> result = new Result>(); + //部门查询,myDeptSearch为1时为我的部门查询,登录用户为上级时查只查负责部门下数据 + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String departIds = null; + if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){ + departIds = user.getDepartIds(); + } + List treeList = this.sysDepartService.searhBy(keyWord,myDeptSearch,departIds); + if (treeList == null || treeList.size() == 0) { + result.setSuccess(false); + result.setMessage("未查询匹配数据!"); + return result; + } + result.setResult(treeList); + return result; + } + + + /** + * 导出excel + * + * @param request + */ + @RequiresPermissions("sys:depart:export") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysDepart sysDepart,HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = sysDepartService.list(queryWrapper); + //按字典排序 + Collections.sort(pageList, new Comparator() { + @Override + public int compare(SysDepart arg0, SysDepart arg1) { + return arg0.getOrgCode().compareTo(arg1.getOrgCode()); + } + }); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表"); + mv.addObject(NormalExcelConstants.CLASS, SysDepart.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("部门列表数据", "导出人:"+user.getRealname(), "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:depart:import") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + List errorMessageList = new ArrayList<>(); + List listSysDeparts = null; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + // orgCode编码长度 + int codeLength = YouBianCodeUtil.zhanweiLength; + listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params); + //按长度排序 + Collections.sort(listSysDeparts, new Comparator() { + @Override + public int compare(SysDepart arg0, SysDepart arg1) { + return arg0.getOrgCode().length() - arg1.getOrgCode().length(); + } + }); + + int num = 0; + for (SysDepart sysDepart : listSysDeparts) { + String orgCode = sysDepart.getOrgCode(); + if(orgCode.length() > codeLength) { + String parentCode = orgCode.substring(0, orgCode.length()-codeLength); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("org_code", parentCode); + try { + SysDepart parentDept = sysDepartService.getOne(queryWrapper); + if(!parentDept.equals(null)) { + sysDepart.setParentId(parentDept.getId()); + } else { + sysDepart.setParentId(""); + } + }catch (Exception e) { + //没有查找到parentDept + } + }else{ + sysDepart.setParentId(""); + } + //update-begin---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------ + sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+""); + //update-end---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------ + sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE); + num++; + } + //清空部门缓存 + Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*"); + Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*"); + redisTemplate.delete(keys3); + redisTemplate.delete(keys4); + return ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + + + /** + * 查询所有部门信息 + * @return + */ + @RequiresPermissions("sys:depart:list") + @GetMapping("listAll") + public Result> listAll(@RequestParam(name = "id", required = false) String id) { + Result> result = new Result<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.orderByAsc(SysDepart::getOrgCode); + if(oConvertUtils.isNotEmpty(id)){ + String arr[] = id.split(","); + query.in(SysDepart::getId,arr); + } + List ls = this.sysDepartService.list(query); + result.setSuccess(true); + result.setResult(ls); + return result; + } + /** + * 查询数据 查出所有部门,并以树结构数据格式响应给前端 + * + * @return + */ + @RequiresPermissions("sys:depart:list") + @RequestMapping(value = "/queryTreeByKeyWord", method = RequestMethod.GET) + public Result> queryTreeByKeyWord(@RequestParam(name = "keyWord", required = false) String keyWord) { + Result> result = new Result<>(); + try { + Map map=new HashMap(); + List list = sysDepartService.queryTreeByKeyWord(keyWord); + //根据keyWord获取用户信息 + LambdaQueryWrapper queryUser = new LambdaQueryWrapper(); + queryUser.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0); + queryUser.and(i -> i.like(SysUser::getUsername, keyWord).or().like(SysUser::getRealname, keyWord)); + List sysUsers = this.sysUserService.list(queryUser); + map.put("userList",sysUsers); + map.put("departList",list); + result.setResult(map); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return result; + } + + /** + * 根据部门编码获取部门信息 + * + * @param orgCode + * @return + */ + @RequiresPermissions("sys:depart:list") + @GetMapping("/getDepartName") + public Result getDepartName(@RequestParam(name = "orgCode") String orgCode) { + Result result = new Result<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysDepart::getOrgCode, orgCode); + SysDepart sysDepart = sysDepartService.getOne(query); + result.setSuccess(true); + result.setResult(sysDepart); + return result; + } + + /** + * 根据部门id获取用户信息 + * + * @param id + * @return + */ + @RequiresPermissions("sys:depart:list") + @GetMapping("/getUsersByDepartId") + public Result> getUsersByDepartId(@RequestParam(name = "id") String id) { + Result> result = new Result<>(); + List sysUsers = sysUserDepartService.queryUserByDepId(id); + result.setSuccess(true); + result.setResult(sysUsers); + return result; + } + + /** + * 根据部门id查询部门所有的父级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:50 + * @param departId 部门id + */ + @RequiresPermissions("sys:depart:list") + @GetMapping("/listParentDepartsByDepId") + List listParentDepartsByDepId(@RequestParam("departId") String departId){ + return sysDepartService.listParentDepartsByDepId(departId); + } + /** + * 根据部门id查询部门所有的子级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:54 + * @param departId 部门id + */ + @RequiresPermissions("sys:depart:list") + @GetMapping("/listSonDepartsByDepId") + List listSonDepartsByDepId(@RequestParam("departId") String departId){ + return sysDepartService.listSonDepartsByDepId(departId); + } + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartPermissionController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartPermissionController.java new file mode 100644 index 00000000..093b4776 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartPermissionController.java @@ -0,0 +1,314 @@ +package com.jero.modules.system.controller; + +import java.util.*; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepartPermission; +import com.jero.modules.system.entity.SysDepartRolePermission; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.entity.SysPermissionDataRule; +import com.jero.modules.system.model.TreeModel; +import com.jero.modules.system.service.ISysDepartPermissionService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.jero.modules.system.service.ISysDepartRolePermissionService; +import com.jero.modules.system.service.ISysPermissionDataRuleService; +import com.jero.modules.system.service.ISysPermissionService; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + + /** + * @Description: 部门权限表 + * @Author: jero-boot + * @Date: 2020-02-11 + * @Version: V1.0 + */ +@Slf4j +@Api(tags="部门权限表") +@RestController +@RequestMapping("/sys/sysDepartPermission") +public class SysDepartPermissionController extends JeroController { + @Autowired + private ISysDepartPermissionService sysDepartPermissionService; + + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + + @Autowired + private ISysPermissionService sysPermissionService; + + @Autowired + private ISysDepartRolePermissionService sysDepartRolePermissionService; + + /** + * 分页列表查询 + * + * @param sysDepartPermission + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value="部门权限表-分页列表查询", notes="部门权限表-分页列表查询") + @GetMapping(value = "/page") + public Result queryPageList(SysDepartPermission sysDepartPermission, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDepartPermission, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysDepartPermissionService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param sysDepartPermission + * @return + */ + @ApiOperation(value="部门权限表-添加", notes="部门权限表-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody SysDepartPermission sysDepartPermission) { + sysDepartPermissionService.save(sysDepartPermission); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysDepartPermission + * @return + */ + @ApiOperation(value="部门权限表-编辑", notes="部门权限表-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysDepartPermission sysDepartPermission) { + sysDepartPermissionService.updateById(sysDepartPermission); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @ApiOperation(value="部门权限表-通过id删除", notes="部门权限表-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + sysDepartPermissionService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @ApiOperation(value="部门权限表-批量删除", notes="部门权限表-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.sysDepartPermissionService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @ApiOperation(value="部门权限表-通过id查询", notes="部门权限表-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + SysDepartPermission sysDepartPermission = sysDepartPermissionService.getById(id); + return Result.OK(sysDepartPermission); + } + + /** + * 导出excel + * + * @param request + * @param sysDepartPermission + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysDepartPermission sysDepartPermission) { + return super.exportXls(request, sysDepartPermission, SysDepartPermission.class, "部门权限表"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysDepartPermission.class); + } + + /** + * 部门管理授权查询数据规则数据 + */ + @GetMapping(value = "/datarule/{permissionId}/{departId}") + public Result loadDatarule(@PathVariable("permissionId") String permissionId,@PathVariable("departId") String departId) { + List list = sysPermissionDataRuleService.getPermRuleListByPermId(permissionId); + if(list==null || list.size()==0) { + return Result.error("未找到权限配置信息"); + }else { + Map map = new HashMap<>(); + map.put("datarule", list); + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(SysDepartPermission::getPermissionId, permissionId) + .eq(SysDepartPermission::getDepartId,departId); + SysDepartPermission sysDepartPermission = sysDepartPermissionService.getOne(query); + if(sysDepartPermission==null) { + //return Result.error("未找到角色菜单配置信息"); + }else { + String drChecked = sysDepartPermission.getDataRuleIds(); + if(oConvertUtils.isNotEmpty(drChecked)) { + map.put("drChecked", drChecked.endsWith(",")?drChecked.substring(0, drChecked.length()-1):drChecked); + } + } + return Result.OK(map); + //TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key + } + } + + /** + * 保存数据规则至部门菜单关联表 + */ + @PostMapping(value = "/datarule") + public Result saveDatarule(@RequestBody JSONObject jsonObject) { + try { + String permissionId = jsonObject.getString("permissionId"); + String departId = jsonObject.getString("departId"); + String dataRuleIds = jsonObject.getString("dataRuleIds"); + log.info("保存数据规则>>"+"菜单ID:"+permissionId+"部门ID:"+ departId+"数据权限ID:"+dataRuleIds); + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(SysDepartPermission::getPermissionId, permissionId) + .eq(SysDepartPermission::getDepartId,departId); + SysDepartPermission sysDepartPermission = sysDepartPermissionService.getOne(query); + if(sysDepartPermission==null) { + return Result.error("请先保存部门菜单权限!"); + }else { + sysDepartPermission.setDataRuleIds(dataRuleIds); + this.sysDepartPermissionService.updateById(sysDepartPermission); + } + } catch (Exception e) { + log.error("SysDepartPermissionController.saveDatarule()发生异常:" + e.getMessage(),e); + return Result.error("保存失败"); + } + return Result.OK("保存成功!"); + } + + /** + * 查询角色授权 + * + * @return + */ + @RequestMapping(value = "/queryDeptRolePermission", method = RequestMethod.GET) + public Result> queryDeptRolePermission(@RequestParam(name = "roleId", required = true) String roleId) { + Result> result = new Result<>(); + try { + List list = sysDepartRolePermissionService.list(new QueryWrapper().lambda().eq(SysDepartRolePermission::getRoleId, roleId)); + result.setResult(list.stream().map(SysDepartRolePermission -> String.valueOf(SysDepartRolePermission.getPermissionId())).collect(Collectors.toList())); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 保存角色授权 + * + * @return + */ + @RequestMapping(value = "/saveDeptRolePermission", method = RequestMethod.POST) + public Result saveDeptRolePermission(@RequestBody JSONObject json) { + long start = System.currentTimeMillis(); + Result result = new Result<>(); + try { + String roleId = json.getString("roleId"); + String permissionIds = json.getString("permissionIds"); + String lastPermissionIds = json.getString("lastpermissionIds"); + this.sysDepartRolePermissionService.saveDeptRolePermission(roleId, permissionIds, lastPermissionIds); + result.success("保存成功!"); + log.info("======部门角色授权成功=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); + } catch (Exception e) { + result.error500("授权失败!"); + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 用户角色授权功能,查询菜单权限树 + * @param request + * @return + */ + @RequestMapping(value = "/queryTreeListForDeptRole", method = RequestMethod.GET) + public Result> queryTreeListForDeptRole(@RequestParam(name="departId",required=true) String departId,HttpServletRequest request) { + Result> result = new Result<>(); + //全部权限ids + List ids = new ArrayList<>(); + try { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + query.inSql(SysPermission::getId,"select permission_id from sys_depart_permission where depart_id='"+departId+"'"); + List list = sysPermissionService.list(query); + for(SysPermission sysPer : list) { + ids.add(sysPer.getId()); + } + List treeList = new ArrayList<>(); + getTreeModelList(treeList, list, null); + Map resMap = new HashMap(); + resMap.put("treeList", treeList); //全部树节点数据 + resMap.put("ids", ids);//全部树ids + result.setResult(resMap); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + private void getTreeModelList(List treeList, List metaList, TreeModel temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + TreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(),permission.getRuleFlag(), permission.isLeaf()); + if(temp==null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if(!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){ + temp.getChildren().add(tree); + if(!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + } + + } + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartRoleController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartRoleController.java new file mode 100644 index 00000000..0de71409 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDepartRoleController.java @@ -0,0 +1,291 @@ +package com.jero.modules.system.controller; + +import java.util.*; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.system.base.controller.JeroController; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.aspect.annotation.AutoLog; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.*; +import com.jero.modules.system.service.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + + /** + * @Description: 部门角色 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +@Slf4j +@Api(tags="部门角色") +@RestController +@RequestMapping("/sys/sysDepartRole") +public class SysDepartRoleController extends JeroController { + @Autowired + private ISysDepartRoleService sysDepartRoleService; + + @Autowired + private ISysDepartRoleUserService departRoleUserService; + + @Autowired + private ISysDepartPermissionService sysDepartPermissionService; + + @Autowired + private ISysDepartRolePermissionService sysDepartRolePermissionService; + + @Autowired + private ISysDepartService sysDepartService; + + /** + * 分页列表查询 + * + * @param sysDepartRole + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value="部门角色-分页列表查询", notes="部门角色-分页列表查询") + @GetMapping(value = "/page") + public Result queryPageList(SysDepartRole sysDepartRole, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + @RequestParam(name="deptId",required=false) String deptId, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDepartRole, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + List deptIds = null; +// if(oConvertUtils.isEmpty(deptId)){ +// if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals(CommonConstant.USER_IDENTITY_2) ){ +// deptIds = sysDepartService.getMySubDepIdsByDepId(user.getDepartIds()); +// }else{ +// return Result.OK(null); +// } +// }else{ +// deptIds = sysDepartService.getSubDepIdsByDepId(deptId); +// } +// queryWrapper.in("depart_id",deptIds); + + //我的部门,选中部门只能看当前部门下的角色 + queryWrapper.eq("depart_id",deptId); + IPage pageList = sysDepartRoleService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param sysDepartRole + * @return + */ + //@RequiresRoles({"admin"}) + @ApiOperation(value="部门角色-添加", notes="部门角色-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody SysDepartRole sysDepartRole) { + sysDepartRoleService.save(sysDepartRole); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysDepartRole + * @return + */ + //@RequiresRoles({"admin"}) + @ApiOperation(value="部门角色-编辑", notes="部门角色-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysDepartRole sysDepartRole) { + sysDepartRoleService.updateById(sysDepartRole); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + //@RequiresRoles({"admin"}) + @AutoLog(value = "部门角色-通过id删除") + @ApiOperation(value="部门角色-通过id删除", notes="部门角色-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + sysDepartRoleService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + //@RequiresRoles({"admin"}) + @AutoLog(value = "部门角色-批量删除") + @ApiOperation(value="部门角色-批量删除", notes="部门角色-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.sysDepartRoleService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @ApiOperation(value="部门角色-通过id查询", notes="部门角色-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + SysDepartRole sysDepartRole = sysDepartRoleService.getById(id); + return Result.OK(sysDepartRole); + } + + /** + * 获取部门下角色 + * @param departId + * @return + */ + @RequestMapping(value = "/getDeptRoleList", method = RequestMethod.GET) + public Result> getDeptRoleList(@RequestParam(value = "departId") String departId,@RequestParam(value = "userId") String userId){ + Result> result = new Result<>(); + //查询选中部门的角色 + List deptRoleList = sysDepartRoleService.list(new LambdaQueryWrapper().eq(SysDepartRole::getDepartId,departId)); + result.setSuccess(true); + result.setResult(deptRoleList); + return result; + } + + /** + * 设置 + * @param json + * @return + */ + //@RequiresRoles({"admin"}) + @RequestMapping(value = "/deptRoleUserAdd", method = RequestMethod.POST) + public Result deptRoleAdd(@RequestBody JSONObject json) { + String newRoleId = json.getString("newRoleId"); + String oldRoleId = json.getString("oldRoleId"); + String userId = json.getString("userId"); + departRoleUserService.deptRoleUserAdd(userId,newRoleId,oldRoleId); + return Result.OK("添加成功!"); + } + + /** + * 根据用户id获取已设置部门角色 + * @param userId + * @return + */ + @RequestMapping(value = "/getDeptRoleByUserId", method = RequestMethod.GET) + public Result> getDeptRoleByUserId(@RequestParam(value = "userId") String userId,@RequestParam(value = "departId") String departId){ + Result> result = new Result<>(); + //查询部门下角色 + List roleList = sysDepartRoleService.list(new QueryWrapper().eq("depart_id",departId)); + List roleIds = roleList.stream().map(SysDepartRole::getId).collect(Collectors.toList()); + //根据角色id,用户id查询已授权角色 + List roleUserList = departRoleUserService.list(new QueryWrapper().eq("user_id",userId).in("drole_id",roleIds)); + result.setSuccess(true); + result.setResult(roleUserList); + return result; + } + + /** + * 查询数据规则数据 + */ + @GetMapping(value = "/datarule/{permissionId}/{departId}/{roleId}") + public Result loadDatarule(@PathVariable("permissionId") String permissionId,@PathVariable("departId") String departId,@PathVariable("roleId") String roleId) { + //查询已授权的部门规则 + List list = sysDepartPermissionService.getPermRuleListByDeptIdAndPermId(departId,permissionId); + if(list==null || list.size()==0) { + return Result.error("未找到权限配置信息"); + }else { + Map map = new HashMap<>(); + map.put("datarule", list); + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(SysDepartRolePermission::getPermissionId, permissionId) + .eq(SysDepartRolePermission::getRoleId,roleId); + SysDepartRolePermission sysRolePermission = sysDepartRolePermissionService.getOne(query); + if(sysRolePermission==null) { + //return Result.error("未找到角色菜单配置信息"); + }else { + String drChecked = sysRolePermission.getDataRuleIds(); + if(oConvertUtils.isNotEmpty(drChecked)) { + map.put("drChecked", drChecked.endsWith(",")?drChecked.substring(0, drChecked.length()-1):drChecked); + } + } + return Result.OK(map); + //TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key + } + } + + /** + * 保存数据规则至角色菜单关联表 + */ + @PostMapping(value = "/datarule") + public Result saveDatarule(@RequestBody JSONObject jsonObject) { + try { + String permissionId = jsonObject.getString("permissionId"); + String roleId = jsonObject.getString("roleId"); + String dataRuleIds = jsonObject.getString("dataRuleIds"); + log.info("保存数据规则>>"+"菜单ID:"+permissionId+"角色ID:"+ roleId+"数据权限ID:"+dataRuleIds); + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(SysDepartRolePermission::getPermissionId, permissionId) + .eq(SysDepartRolePermission::getRoleId,roleId); + SysDepartRolePermission sysRolePermission = sysDepartRolePermissionService.getOne(query); + if(sysRolePermission==null) { + return Result.error("请先保存角色菜单权限!"); + }else { + sysRolePermission.setDataRuleIds(dataRuleIds); + this.sysDepartRolePermissionService.updateById(sysRolePermission); + } + } catch (Exception e) { + log.error("SysRoleController.saveDatarule()发生异常:" + e.getMessage(),e); + return Result.error("保存失败"); + } + return Result.OK("保存成功!"); + } + + /** + * 导出excel + * + * @param request + * @param sysDepartRole + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysDepartRole sysDepartRole) { + return super.exportXls(request, sysDepartRole, SysDepartRole.class, "部门角色"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysDepartRole.class); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java new file mode 100644 index 00000000..e5697827 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java @@ -0,0 +1,585 @@ +package com.jero.modules.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.ImportExcelUtil; +import com.jero.common.util.SqlInjectionUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDict; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.model.SysDictTree; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysDictItemService; +import com.jero.modules.system.service.ISysDictService; +import com.jero.modules.system.vo.SysDictPage; +import org.jeecgframework.poi.excel.ExcelImportCheckUtil; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + *

+ * 字典表 前端控制器 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@RestController +@Api(tags = "字典控制器") +@RequestMapping("/sys/dict") +@Slf4j +public class SysDictController { + + @Autowired + private ISysDictService sysDictService; + @Autowired + private ISysDictItemService sysDictItemService; + @Autowired + public RedisTemplate redisTemplate; + + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/page", method = RequestMethod.GET) + @ApiOperation(value = "字典控制器-分页列表查询", notes = "字典控制器-分页列表查询") + public Result> queryPageList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysDictService.page(page, queryWrapper); + log.debug("查询当前页:"+pageList.getCurrent()); + log.debug("查询当前页数量:"+pageList.getSize()); + log.debug("查询结果数量:"+pageList.getRecords().size()); + log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:获取树形字典数据 + * @param sysDict + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @SuppressWarnings("unchecked") + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-树形字典数据", notes = "字典控制器-树形字典数据") + @RequestMapping(value = "/treeList", method = RequestMethod.GET) + public Result> treeList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + // 构造查询条件 + String dictName = sysDict.getDictName(); + if(oConvertUtils.isNotEmpty(dictName)) { + query.like(true, SysDict::getDictName, dictName); + } + query.orderByDesc(true, SysDict::getCreateTime); + List list = sysDictService.list(query); + List treeList = new ArrayList<>(); + for (SysDict node : list) { + treeList.add(new SysDictTree(node)); + } + result.setSuccess(true); + result.setResult(treeList); + return result; + } + + /** + * 获取字典数据 + * @param dictCode 字典code + * @param dictCode 表名,文本字段,code字段 | 举例:sys_user,realname,id + * @return + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-根据字典编码获取字典数据", notes = "字典控制器-根据字典编码获取字典数据") + @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) + public Result> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { + log.info(" dictCode : "+ dictCode); + Result> result = new Result>(); + List ls = null; + try { + if(dictCode.indexOf(",")!=-1) { + //关联表字典(举例:sys_user,realname,id) + String[] params = dictCode.split(","); + + if(params.length<3) { + result.error500("字典Code格式不正确!"); + return result; + } + //SQL注入校验(只限制非法串改数据库) + final String[] sqlInjCheck = {params[0],params[1],params[2]}; + SqlInjectionUtil.filterContent(sqlInjCheck); + + if(params.length==4) { + //SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用) + SqlInjectionUtil.specialFilterContent(params[3]); + ls = sysDictService.queryTableDictItemsByCodeAndFilter(params[0],params[1],params[2],params[3]); + }else if (params.length==3) { + ls = sysDictService.queryTableDictItemsByCode(params[0],params[1],params[2]); + }else{ + result.error500("字典Code格式不正确!"); + return result; + } + }else { + //字典表 + ls = sysDictService.queryDictItemsByCode(dictCode); + } + + result.setSuccess(true); + result.setResult(ls); + log.debug(result.toString()); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 获取全部字典数据 + * + * @return + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-获取全部字典数据", notes = "字典控制器-获取全部字典数据") + @RequestMapping(value = "/queryAllDictItems", method = RequestMethod.GET) + public Result queryAllDictItems(HttpServletRequest request) { + Map> res = new HashMap>(); + res = sysDictService.queryAllDictItems(); + return Result.OK(res); + } + + /** + * 获取字典数据 + * @param dictCode + * @return + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-通过字典code和字典值key获取字典数据", notes = "字典控制器-通过字典code和字典值key获取字典数据") + @RequestMapping(value = "/getDictText/{dictCode}/{key}", method = RequestMethod.GET) + public Result getDictText(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) { + log.info(" dictCode : "+ dictCode); + Result result = new Result(); + String text = null; + try { + text = sysDictService.queryDictTextByKey(dictCode, key); + result.setSuccess(true); + result.setResult(text); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + return result; + } + + /** + * 大数据量的字典表 走异步加载 即前端输入内容过滤数据 + * @param dictCode + * @return + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-通过字典code获取字典数据", notes = "字典控制器-通过字典code获取字典数据") + @RequestMapping(value = "/loadDict/{dictCode}", method = RequestMethod.GET) + public Result> loadDict(@PathVariable String dictCode, + @RequestParam(name="keyword") String keyword, + @RequestParam(value = "sign",required = false) String sign, + @RequestParam(value = "pageSize", required = false) Integer pageSize) { + log.info(" 加载字典表数据,加载关键字: "+ keyword); + Result> result = new Result>(); + List ls = null; + try { + if(dictCode.indexOf(",")!=-1) { + String[] params = dictCode.split(","); + if(params.length!=3) { + result.error500("字典Code格式不正确!"); + return result; + } + if(pageSize!=null){ + ls = sysDictService.queryLittleTableDictItems(params[0],params[1],params[2],keyword, pageSize); + }else{ + ls = sysDictService.queryTableDictItems(params[0],params[1],params[2],keyword); + } + result.setSuccess(true); + result.setResult(ls); + log.info(result.toString()); + }else { + result.error500("字典Code格式不正确!"); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 根据字典code加载字典text 返回 + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-根据字典code加载字典text", notes = "字典控制器-根据字典code加载字典text") + @RequestMapping(value = "/loadDictItem/{dictCode}", method = RequestMethod.GET) + public Result> loadDictItem(@PathVariable String dictCode, @RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { + Result> result = new Result<>(); + try { + if(dictCode.indexOf(",")!=-1) { + String[] params = dictCode.split(","); + if(params.length!=3) { + result.error500("字典Code格式不正确!"); + return result; + } + List texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys); + + result.setSuccess(true); + result.setResult(texts); + log.info(result.toString()); + }else { + result.error500("字典Code格式不正确!"); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 根据表名——显示字段-存储字段 pid 加载树形数据 + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据") + @RequestMapping(value = "/loadTreeData", method = RequestMethod.GET) + public Result> loadTreeData(@RequestParam(name="pid") String pid, @RequestParam(name="pidField") String pidField, + @RequestParam(name="tableName") String tbname, + @RequestParam(name="text") String text, + @RequestParam(name="code") String code, + @RequestParam(name="hasChildField", required = false) String hasChildField, + @RequestParam(value = "sign", required = false) String sign, HttpServletRequest request) { + Result> result = new Result>(); + + // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) + String dictCode = tbname +","+ text +","+ code; + SqlInjectionUtil.filterContent(dictCode); + List ls = sysDictService.queryTreeList(null, tbname, text, code, pidField, pid, hasChildField); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * 查询后返回树型数据 + */ + @RequiresPermissions("sys:dict:list") + @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 加载树形数据") + @RequestMapping(value = "/queryAllTreeData", method = RequestMethod.GET) + public Result> queryAllTreeData(@RequestParam(name="pidField") String pidField, + @RequestParam(name="tableName") String tbname, + @RequestParam(name="text") String text, + @RequestParam(name="code") String code, + HttpServletRequest request) { + Result> result = new Result>(); + + // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) + String dictCode = tbname +","+ text +","+ code; + SqlInjectionUtil.filterContent(dictCode); + List ls = sysDictService.queryAllTreeData(tbname, text, code, pidField); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * @功能:新增 + * @param sysDict + * @return + */ + @RequiresPermissions("sys:dict:add") + @ApiOperation(value = "字典控制器-新增字典", notes = "字典控制器-新增字典") + @RequiresRoles({"admin"}) + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result add(@RequestBody SysDict sysDict) { + Result result = new Result(); + try { + sysDict.setCreateTime(new Date()); + sysDict.setDelFlag(CommonConstant.DEL_FLAG_0); + sysDictService.save(sysDict); + result.success("保存成功!"); + //添加成功后需要刷新缓存 + sysDictService.refreshCache(); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * @功能:编辑 + * @param sysDict + * @return + */ + @RequiresPermissions("sys:dict:edit") + @ApiOperation(value = "字典控制器-编辑字典", notes = "字典控制器-编辑字典") + @RequiresRoles({"admin"}) + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result edit(@RequestBody SysDict sysDict) { + Result result = new Result(); + SysDict sysdict = sysDictService.getById(sysDict.getId()); + if(sysdict==null) { + result.error500("未找到对应实体"); + }else { + sysDict.setUpdateTime(new Date()); + boolean ok = sysDictService.updateById(sysDict); + if(ok) { + result.success("编辑成功!"); + //编辑成功后需要刷新缓存 + sysDictService.refreshCache(); + } + } + return result; + } + + /** + * @功能:删除 + * @param id + * @return + */ + @RequiresPermissions("sys:dict:del") + @ApiOperation(value = "字典控制器-删除字典", notes = "字典控制器-删除字典") + @RequiresRoles({"admin"}) + @DeleteMapping(value = "/delete") + @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + boolean ok = sysDictService.removeById(id); + if(ok) { + result.success("删除成功!"); + }else{ + result.error500("删除失败!"); + } + return result; + } + + /** + * @功能:批量删除 + * @param ids + * @return + */ + @RequiresPermissions("sys:dict:del") + @ApiOperation(value = "字典控制器-批量字典", notes = "字典控制器-批量字典") + @DeleteMapping(value = "/deleteBatch") + @CacheEvict(value= CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(oConvertUtils.isEmpty(ids)) { + result.error500("参数不识别!"); + }else { + sysDictService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * @功能:刷新缓存 + * @date 修改时间 2021.4.8 + * @return + */ + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/refleshCache") + public Result refleshCache() { + Result result = new Result(); + sysDictService.refreshCache(); + return result; + } + + /** + * 导出excel + * + * @param request + */ + @RequiresPermissions("sys:dict:export") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysDict sysDict, HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = new ArrayList(); + + List sysDictList = sysDictService.list(queryWrapper); + for (SysDict dictMain : sysDictList) { + SysDictPage vo = new SysDictPage(); + BeanUtils.copyProperties(dictMain, vo); + // 查询机票 + List sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId()); + vo.setSysDictItemList(sysDictItemList); + pageList.add(vo); + } + + // 导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "数据字典"); + // 注解对象Class + mv.addObject(NormalExcelConstants.CLASS, SysDictPage.class); + // 自定义表格参数 + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典")); + // 导出数据列表 + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param + * @return + */ + @RequiresPermissions("sys:dict:import") + @RequiresRoles({"admin"}) + @PostMapping(value = "/importExcel") + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(2); + params.setNeedSave(true); + try { + //导入Excel格式校验,看匹配的字段文本概率 + Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params); + if(!t){ + throw new RuntimeException("导入Excel校验失败 !"); + } + List list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params); + // 错误信息 + List errorMessage = new ArrayList<>(); + int successLines = 0, errorLines = 0; + for (int i=0;i< list.size();i++) { + SysDict po = new SysDict(); + BeanUtils.copyProperties(list.get(i), po); + po.setDelFlag(CommonConstant.DEL_FLAG_0); + try { + Integer integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList()); + if(integer>0){ + successLines++; + }else{ + errorLines++; + int lineNumber = i + 1; + errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); + } + } catch (Exception e) { + errorLines++; + int lineNumber = i + 1; + errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); + } + } + return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + + + /** + * 查询被删除的列表 + * @return + */ + @RequiresPermissions("sys:dict:list") + @GetMapping(value = "/deleteList") + public Result> deleteList() { + Result> result = new Result>(); + List list = this.sysDictService.queryDeleteList(); + result.setSuccess(true); + result.setResult(list); + return result; + } + + /** + * 物理删除 + * @param id + * @return + */ + @RequiresPermissions("sys:dict:list") + @DeleteMapping(value = "/deletePhysic/{id}") + public Result deletePhysic(@PathVariable String id) { + try { + sysDictService.deleteOneDictPhysically(id); + return Result.OK("删除成功!"); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("删除失败!"); + } + } + + /** + * 取回 + * @param id + * @return + */ + @RequiresPermissions("sys:dict:list") + @PutMapping(value = "/back/{id}") + public Result back(@PathVariable String id) { + try { + sysDictService.updateDictDelFlag(0,id); + return Result.OK("操作成功!"); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("操作失败!"); + } + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictItemController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictItemController.java new file mode 100644 index 00000000..17ae15ab --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictItemController.java @@ -0,0 +1,190 @@ +package com.jero.modules.system.controller; + + +import java.util.Arrays; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.service.ISysDictItemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + *

+ * 前端控制器 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@RestController +@RequestMapping("/sys/dictItem") +@Slf4j +public class SysDictItemController { + + @Autowired + private ISysDictItemService sysDictItemService; + + /** + * @功能:查询字典数据 + * @param sysDictItem + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> queryPageList(SysDictItem sysDictItem,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDictItem, req.getParameterMap()); + queryWrapper.orderByAsc("sort_order"); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysDictItemService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:新增 + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/add", method = RequestMethod.POST) + @CacheEvict(value= CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result add(@RequestBody SysDictItem sysDictItem) { + Result result = new Result(); + try { + sysDictItem.setCreateTime(new Date()); + sysDictItemService.save(sysDictItem); + result.success("保存成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * @功能:编辑 + * @param sysDictItem + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result edit(@RequestBody SysDictItem sysDictItem) { + Result result = new Result(); + SysDictItem sysdict = sysDictItemService.getById(sysDictItem.getId()); + if(sysdict==null) { + result.error500("未找到对应实体"); + }else { + sysDictItem.setUpdateTime(new Date()); + boolean ok = sysDictItemService.updateById(sysDictItem); + //TODO 返回false说明什么? + if(ok) { + result.success("编辑成功!"); + } + } + return result; + } + + /** + * @功能:删除字典数据 + * @param id + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysDictItem joinSystem = sysDictItemService.getById(id); + if(joinSystem==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysDictItemService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + return result; + } + + /** + * @功能:批量删除字典数据 + * @param ids + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysDictItemService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 字典值重复校验 + * @param sysDictItem + * @param request + * @return + */ + @RequiresPermissions("sys:dict:list") + @RequestMapping(value = "/dictItemCheck", method = RequestMethod.GET) + @ApiOperation("字典重复校验接口") + public Result doDictItemCheck(SysDictItem sysDictItem, HttpServletRequest request) { + int num = 0; + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(SysDictItem::getItemValue,sysDictItem.getItemValue()); + queryWrapper.eq(SysDictItem::getDictId,sysDictItem.getDictId()); + if (StringUtils.isNotBlank(sysDictItem.getId())) { + // 编辑页面校验 + queryWrapper.ne(SysDictItem::getId,sysDictItem.getId()); + } + num = sysDictItemService.count(queryWrapper); + if (num == 0) { + // 该值可用 + return Result.OK("该值可用!"); + } else { + // 该值不可用 + log.info("该值不可用,系统中已存在!"); + return Result.error("该值不可用,系统中已存在!"); + } + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysFillRuleController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysFillRuleController.java new file mode 100644 index 00000000..4b40acc5 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysFillRuleController.java @@ -0,0 +1,213 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.AutoLog; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.FillRuleUtil; +import com.jero.modules.system.entity.SysFillRule; +import com.jero.modules.system.service.ISysFillRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; + +/** + * @Description: 填值规则 + * @Author: jero-boot + * @Date: 2019-11-07 + * @Version: V1.0 + */ +@Slf4j +@Api(tags = "填值规则") +@RestController +@RequestMapping("/sys/fillRule") +public class SysFillRuleController extends JeroController { + @Autowired + private ISysFillRuleService sysFillRuleService; + + /** + * 分页列表查询 + * + * @param sysFillRule + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "填值规则-分页列表查询") + @ApiOperation(value = "填值规则-分页列表查询", notes = "填值规则-分页列表查询") + @GetMapping(value = "/page") + public Result queryPageList(SysFillRule sysFillRule, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysFillRule, req.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = sysFillRuleService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 测试 ruleCode + * + * @param ruleCode + * @return + */ + @GetMapping(value = "/testFillRule") + public Result testFillRule(@RequestParam("ruleCode") String ruleCode) { + Object result = FillRuleUtil.executeRule(ruleCode, new JSONObject()); + return Result.OK(result); + } + + /** + * 添加 + * + * @param sysFillRule + * @return + */ + @AutoLog(value = "填值规则-添加") + @ApiOperation(value = "填值规则-添加", notes = "填值规则-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody SysFillRule sysFillRule) { + sysFillRuleService.save(sysFillRule); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysFillRule + * @return + */ + @AutoLog(value = "填值规则-编辑") + @ApiOperation(value = "填值规则-编辑", notes = "填值规则-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysFillRule sysFillRule) { + sysFillRuleService.updateById(sysFillRule); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "填值规则-通过id删除") + @ApiOperation(value = "填值规则-通过id删除", notes = "填值规则-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysFillRuleService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "填值规则-批量删除") + @ApiOperation(value = "填值规则-批量删除", notes = "填值规则-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.sysFillRuleService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "填值规则-通过id查询") + @ApiOperation(value = "填值规则-通过id查询", notes = "填值规则-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + SysFillRule sysFillRule = sysFillRuleService.getById(id); + return Result.OK(sysFillRule); + } + + /** + * 导出excel + * + * @param request + * @param sysFillRule + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysFillRule sysFillRule) { + return super.exportXls(request, sysFillRule, SysFillRule.class, "填值规则"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysFillRule.class); + } + + /** + * 通过 ruleCode 执行自定义填值规则 + * + * @param ruleCode 要执行的填值规则编码 + * @param formData 表单数据,可根据表单数据的不同生成不同的填值结果 + * @return 运行后的结果 + */ + @PutMapping("/executeRuleByCode/{ruleCode}") + public Result executeByRuleCode(@PathVariable("ruleCode") String ruleCode, @RequestBody JSONObject formData) { + Object result = FillRuleUtil.executeRule(ruleCode, formData); + return Result.OK(result); + } + + + /** + * 批量通过 ruleCode 执行自定义填值规则 + * + * @param ruleData 要执行的填值规则JSON数组: + * 示例: { "commonFormData": {}, rules: [ { "ruleCode": "xxx", "formData": null } ] } + * @return 运行后的结果,返回示例: [{"ruleCode": "order_num_rule", "result": "CN2019111117212984"}] + * + */ + @PutMapping("/executeRuleByCodeBatch") + public Result executeByRuleCodeBatch(@RequestBody JSONObject ruleData) { + JSONObject commonFormData = ruleData.getJSONObject("commonFormData"); + JSONArray rules = ruleData.getJSONArray("rules"); + // 遍历 rules ,批量执行规则 + JSONArray results = new JSONArray(rules.size()); + for (int i = 0; i < rules.size(); i++) { + JSONObject rule = rules.getJSONObject(i); + String ruleCode = rule.getString("ruleCode"); + JSONObject formData = rule.getJSONObject("formData"); + // 如果没有传递 formData,就用common的 + if (formData == null) { + formData = commonFormData; + } + // 执行填值规则 + Object result = FillRuleUtil.executeRule(ruleCode, formData); + JSONObject obj = new JSONObject(rules.size()); + obj.put("ruleCode", ruleCode); + obj.put("result", result); + results.add(obj); + } + return Result.OK(results); + } + +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysGatewayRouteController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysGatewayRouteController.java new file mode 100644 index 00000000..b5c77c00 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysGatewayRouteController.java @@ -0,0 +1,76 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.system.base.controller.JeroController; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysGatewayRoute; +import com.jero.modules.system.service.ISysGatewayRouteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Description: gateway路由管理 + * @Author: jero-boot + * @Date: 2020-05-26 + * @Version: V1.0 + */ +@Api(tags = "gateway路由管理") +@RestController +@RequestMapping("/sys/gatewayRoute") +@Slf4j +public class SysGatewayRouteController extends JeroController { + + @Autowired + private ISysGatewayRouteService sysGatewayRouteService; + + @PostMapping(value = "/updateAll") + public Result updateAll(@RequestBody JSONObject json) { + sysGatewayRouteService.updateAll(json); + return Result.OK("操作成功!"); + } + + @GetMapping(value = "/page") + public Result queryPageList(SysGatewayRoute sysGatewayRoute) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + List ls = sysGatewayRouteService.list(query); + JSONArray array = new JSONArray(); + for(SysGatewayRoute rt: ls){ + JSONObject obj = (JSONObject) JSONObject.toJSON(rt); + if(oConvertUtils.isNotEmpty(rt.getPredicates())){ + obj.put("predicates", JSONArray.parseArray(rt.getPredicates())); + } + if(oConvertUtils.isNotEmpty(rt.getFilters())){ + obj.put("filters", JSONArray.parseArray(rt.getFilters())); + } + array.add(obj); + } + return Result.OK(array); + } + + @GetMapping(value = "/clearRedis") + public Result clearRedis() { + sysGatewayRouteService.clearRedis(); + return Result.OK("清除成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + //@RequiresRoles({"admin"}) + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysGatewayRouteService.deleteById(id); + return Result.OK("删除路由成功"); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysLogController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysLogController.java new file mode 100644 index 00000000..3637cd3f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysLogController.java @@ -0,0 +1,117 @@ +package com.jero.modules.system.controller; + + +import java.util.Arrays; + +import javax.servlet.http.HttpServletRequest; + +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysLog; +import com.jero.modules.system.entity.SysRole; +import com.jero.modules.system.service.ISysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + *

+ * 系统日志表 前端控制器 + *

+ * + * @Author zhangweijian + * @since 2018-12-26 + */ +@RestController +@RequestMapping("/sys/log") +@Slf4j +public class SysLogController { + + @Autowired + private ISysLogService sysLogService; + + /** + * @功能:查询日志记录 + * @param syslog + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> queryPageList(SysLog syslog,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(syslog, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + //日志关键词 + String keyWord = req.getParameter("keyWord"); + if(oConvertUtils.isNotEmpty(keyWord)) { + queryWrapper.like("log_content",keyWord); + } + //TODO 过滤逻辑处理 + //TODO begin、end逻辑处理 + //TODO 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 + //创建时间/创建人的赋值 + IPage pageList = sysLogService.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:删除单个日志记录 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysLog sysLog = sysLogService.getById(id); + if(sysLog==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysLogService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + return result; + } + + /** + * @功能:批量,全部清空日志记录 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + if("allclear".equals(ids)) { + this.sysLogService.removeAll(); + result.success("清除成功!"); + } + this.sysLogService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java new file mode 100644 index 00000000..33bbcf01 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java @@ -0,0 +1,807 @@ +package com.jero.modules.system.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.MD5Util; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepartPermission; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.entity.SysPermissionDataRule; +import com.jero.modules.system.entity.SysRolePermission; +import com.jero.modules.system.model.SysPermissionTree; +import com.jero.modules.system.model.TreeModel; +import com.jero.modules.system.service.*; +import com.jero.modules.system.util.PermissionDataUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 菜单权限表 前端控制器 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Slf4j +@RestController +@RequestMapping("/sys/permission") +public class SysPermissionController { + + @Autowired + private ISysPermissionService sysPermissionService; + + @Autowired + private ISysRolePermissionService sysRolePermissionService; + + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + + @Autowired + private ISysDepartPermissionService sysDepartPermissionService; + + /** + * 加载数据节点 + * + * @return + */ + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> list() { + long start = System.currentTimeMillis(); + Result> result = new Result<>(); + try { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List list = sysPermissionService.list(query); + List treeList = new ArrayList<>(); + getTreeList(treeList, list, null); + result.setResult(treeList); + result.setSuccess(true); + log.info("======获取全部菜单数据=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /*update_begin author:wuxianquan date:20190908 for:先查询一级菜单,当用户点击展开菜单时加载子菜单 */ + /** + * 系统菜单列表(一级菜单) + * + * @return + */ + @RequestMapping(value = "/getSystemMenuList", method = RequestMethod.GET) + public Result> getSystemMenuList() { + long start = System.currentTimeMillis(); + Result> result = new Result<>(); + try { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getMenuType,CommonConstant.MENU_TYPE_0); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List list = sysPermissionService.list(query); + List sysPermissionTreeList = new ArrayList(); + for(SysPermission sysPermission : list){ + SysPermissionTree sysPermissionTree = new SysPermissionTree(sysPermission); + sysPermissionTreeList.add(sysPermissionTree); + } + result.setResult(sysPermissionTreeList); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + log.info("======获取一级菜单数据=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); + return result; + } + + /** + * 查询子菜单 + * @param parentId + * @return + */ + @RequestMapping(value = "/getSystemSubmenu", method = RequestMethod.GET) + public Result> getSystemSubmenu(@RequestParam("parentId") String parentId){ + Result> result = new Result<>(); + try{ + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getParentId,parentId); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List list = sysPermissionService.list(query); + List sysPermissionTreeList = new ArrayList(); + for(SysPermission sysPermission : list){ + SysPermissionTree sysPermissionTree = new SysPermissionTree(sysPermission); + sysPermissionTreeList.add(sysPermissionTree); + } + result.setResult(sysPermissionTreeList); + result.setSuccess(true); + }catch (Exception e){ + log.error(e.getMessage(), e); + } + return result; + } + /*update_end author:wuxianquan date:20190908 for:先查询一级菜单,当用户点击展开菜单时加载子菜单 */ + + // update_begin author:sunjianlei date:20200108 for: 新增批量根据父ID查询子级菜单的接口 ------------- + /** + * 查询子菜单 + * + * @param parentIds 父ID(多个采用半角逗号分割) + * @return 返回 key-value 的 Map + */ + @GetMapping("/getSystemSubmenuBatch") + public Result getSystemSubmenuBatch(@RequestParam("parentIds") String parentIds) { + try { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + List parentIdList = Arrays.asList(parentIds.split(",")); + query.in(SysPermission::getParentId, parentIdList); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List list = sysPermissionService.list(query); + Map> listMap = new HashMap<>(); + for (SysPermission item : list) { + String pid = item.getParentId(); + if (parentIdList.contains(pid)) { + List mapList = listMap.get(pid); + if (mapList == null) { + mapList = new ArrayList<>(); + } + mapList.add(new SysPermissionTree(item)); + listMap.put(pid, mapList); + } + } + return Result.OK(listMap); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("批量查询子菜单失败:" + e.getMessage()); + } + } + // update_end author:sunjianlei date:20200108 for: 新增批量根据父ID查询子级菜单的接口 ------------- + +// /** +// * 查询用户拥有的菜单权限和按钮权限(根据用户账号) +// * +// * @return +// */ +// @RequestMapping(value = "/queryByUser", method = RequestMethod.GET) +// public Result queryByUser(HttpServletRequest req) { +// Result result = new Result<>(); +// try { +// String username = req.getParameter("username"); +// List metaList = sysPermissionService.queryByUser(username); +// JSONArray jsonArray = new JSONArray(); +// this.getPermissionJsonArray(jsonArray, metaList, null); +// result.setResult(jsonArray); +// result.success("查询成功"); +// } catch (Exception e) { +// result.error500("查询失败:" + e.getMessage()); +// log.error(e.getMessage(), e); +// } +// return result; +// } + + /** + * 查询用户拥有的菜单权限和按钮权限 + * + * @return + */ + @RequestMapping(value = "/getUserPermissionByToken", method = RequestMethod.GET) + public Result getUserPermissionByToken() { + Result result = new Result(); + try { + //直接获取当前用户不适用前端token + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (oConvertUtils.isEmpty(loginUser)) { + return Result.error("请登录系统!"); + } + List metaList = sysPermissionService.queryByUser(loginUser.getUsername()); + //添加首页路由 + //update-begin-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 + //if(!PermissionDataUtil.hasIndexPage(metaList)){ + // SysPermission indexMenu = sysPermissionService.list(new LambdaQueryWrapper().eq(SysPermission::getName,"首页")).get(0); + // metaList.add(0,indexMenu); + //} + //update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 + JSONObject json = new JSONObject(); + JSONArray menujsonArray = new JSONArray(); + this.getPermissionJsonArray(menujsonArray, metaList, null); + JSONArray authjsonArray = new JSONArray(); + this.getAuthJsonArray(authjsonArray, metaList); + //查询所有的权限 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_2); + //query.eq(SysPermission::getStatus, "1"); + List allAuthList = sysPermissionService.list(query); + JSONArray allauthjsonArray = new JSONArray(); + this.getAllAuthJsonArray(allauthjsonArray, allAuthList); + //路由菜单 + json.put("menu", menujsonArray); + //按钮权限(用户拥有的权限集合) + json.put("auth", authjsonArray); + //全部权限配置集合(按钮权限,访问权限) + json.put("allAuth", allauthjsonArray); + result.setResult(json); + result.success("查询成功"); + } catch (Exception e) { + result.error500("查询失败:" + e.getMessage()); + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 添加菜单 + * @param permission + * @return + */ + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result add(@RequestBody SysPermission permission) { + Result result = new Result(); + try { + permission = PermissionDataUtil.intelligentProcessData(permission); + sysPermissionService.addPermission(permission); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑菜单 + * @param permission + * @return + */ + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/edit", method = { RequestMethod.PUT, RequestMethod.POST }) + public Result edit(@RequestBody SysPermission permission) { + Result result = new Result<>(); + try { + permission = PermissionDataUtil.intelligentProcessData(permission); + sysPermissionService.editPermission(permission); + result.success("修改成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + /** + * 删除菜单 + * @param id + * @return + */ + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name = "id", required = true) String id) { + Result result = new Result<>(); + try { + sysPermissionService.deletePermission(id); + result.success("删除成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500(e.getMessage()); + } + return result; + } + + /** + * 批量删除菜单 + * @param ids + * @return + */ + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + Result result = new Result<>(); + try { + String[] arr = ids.split(","); + for (String id : arr) { + if (oConvertUtils.isNotEmpty(id)) { + sysPermissionService.deletePermission(id); + } + } + result.success("删除成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("删除成功!"); + } + return result; + } + + /** + * 获取全部的权限树 + * + * @return + */ + @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) + public Result> queryTreeList() { + Result> result = new Result<>(); + // 全部权限ids + List ids = new ArrayList<>(); + try { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List list = sysPermissionService.list(query); + for (SysPermission sysPer : list) { + ids.add(sysPer.getId()); + } + List treeList = new ArrayList<>(); + getTreeModelList(treeList, list, null); + + Map resMap = new HashMap(); + resMap.put("treeList", treeList); // 全部树节点数据 + resMap.put("ids", ids);// 全部树ids + result.setResult(resMap); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 异步加载数据节点 + * + * @return + */ + @RequestMapping(value = "/queryListAsync", method = RequestMethod.GET) + public Result> queryAsync(@RequestParam(name = "pid", required = false) String parentId) { + Result> result = new Result<>(); + try { + List list = sysPermissionService.queryListByParentId(parentId); + if (list == null || list.size() <= 0) { + result.error500("未找到角色信息"); + } else { + result.setResult(list); + result.setSuccess(true); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + return result; + } + + /** + * 查询角色授权 + * + * @return + */ + @RequestMapping(value = "/queryRolePermission", method = RequestMethod.GET) + public Result> queryRolePermission(@RequestParam(name = "roleId", required = true) String roleId) { + Result> result = new Result<>(); + try { + List list = sysRolePermissionService.list(new QueryWrapper().lambda().eq(SysRolePermission::getRoleId, roleId)); + result.setResult(list.stream().map(SysRolePermission -> String.valueOf(SysRolePermission.getPermissionId())).collect(Collectors.toList())); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 保存角色授权 + * + * @return + */ + @RequestMapping(value = "/saveRolePermission", method = RequestMethod.POST) + //@RequiresRoles({ "admin" }) + public Result saveRolePermission(@RequestBody JSONObject json) { + long start = System.currentTimeMillis(); + Result result = new Result<>(); + try { + String roleId = json.getString("roleId"); + String permissionIds = json.getString("permissionIds"); + String lastPermissionIds = json.getString("lastpermissionIds"); + this.sysRolePermissionService.saveRolePermission(roleId, permissionIds, lastPermissionIds); + result.success("保存成功!"); + log.info("======角色授权成功=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); + } catch (Exception e) { + result.error500("授权失败!"); + log.error(e.getMessage(), e); + } + return result; + } + + private void getTreeList(List treeList, List metaList, SysPermissionTree temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + SysPermissionTree tree = new SysPermissionTree(permission); + if (temp == null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if (!tree.getIsLeaf()) { + getTreeList(treeList, metaList, tree); + } + } else if (temp != null && tempPid != null && tempPid.equals(temp.getId())) { + temp.getChildren().add(tree); + if (!tree.getIsLeaf()) { + getTreeList(treeList, metaList, tree); + } + } + + } + } + + private void getTreeModelList(List treeList, List metaList, TreeModel temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + TreeModel tree = new TreeModel(permission); + if (temp == null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if (!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + } else if (temp != null && tempPid != null && tempPid.equals(temp.getKey())) { + temp.getChildren().add(tree); + if (!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + } + + } + } + + /** + * 获取权限JSON数组 + * @param jsonArray + * @param allList + */ + private void getAllAuthJsonArray(JSONArray jsonArray,List allList) { + JSONObject json = null; + for (SysPermission permission : allList) { + json = new JSONObject(); + json.put("action", permission.getPerms()); + json.put("status", permission.getStatus()); + //1显示2禁用 + json.put("type", permission.getPermsType()); + json.put("describe", permission.getName()); + jsonArray.add(json); + } + } + + /** + * 获取权限JSON数组 + * @param jsonArray + * @param metaList + */ + private void getAuthJsonArray(JSONArray jsonArray,List metaList) { + for (SysPermission permission : metaList) { + if(permission.getMenuType()==null) { + continue; + } + JSONObject json = null; + if(permission.getMenuType().equals(CommonConstant.MENU_TYPE_2) &&CommonConstant.STATUS_1.equals(permission.getStatus())) { + json = new JSONObject(); + json.put("action", permission.getPerms()); + json.put("type", permission.getPermsType()); + json.put("describe", permission.getName()); + jsonArray.add(json); + } + } + } + /** + * 获取菜单JSON数组 + * @param jsonArray + * @param metaList + * @param parentJson + */ + private void getPermissionJsonArray(JSONArray jsonArray, List metaList, JSONObject parentJson) { + for (SysPermission permission : metaList) { + if (permission.getMenuType() == null) { + continue; + } + String tempPid = permission.getParentId(); + JSONObject json = getPermissionJsonObject(permission); + if(json==null) { + continue; + } + if (parentJson == null && oConvertUtils.isEmpty(tempPid)) { + jsonArray.add(json); + if (!permission.isLeaf()) { + getPermissionJsonArray(jsonArray, metaList, json); + } + } else if (parentJson != null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString("id"))) { + // 类型( 0:一级菜单 1:子菜单 2:按钮 ) + if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2)) { + JSONObject metaJson = parentJson.getJSONObject("meta"); + if (metaJson.containsKey("permissionList")) { + metaJson.getJSONArray("permissionList").add(json); + } else { + JSONArray permissionList = new JSONArray(); + permissionList.add(json); + metaJson.put("permissionList", permissionList); + } + // 类型( 0:一级菜单 1:子菜单 2:按钮 ) + } else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_1) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_0)) { + if (parentJson.containsKey("children")) { + parentJson.getJSONArray("children").add(json); + } else { + JSONArray children = new JSONArray(); + children.add(json); + parentJson.put("children", children); + } + + if (!permission.isLeaf()) { + getPermissionJsonArray(jsonArray, metaList, json); + } + } + } + + } + } + + /** + * 根据菜单配置生成路由json + * @param permission + * @return + */ + private JSONObject getPermissionJsonObject(SysPermission permission) { + JSONObject json = new JSONObject(); + // 类型(0:一级菜单 1:子菜单 2:按钮) + if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2)) { + //json.put("action", permission.getPerms()); + //json.put("type", permission.getPermsType()); + //json.put("describe", permission.getName()); + return null; + } else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_0) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_1)) { + json.put("id", permission.getId()); + if (permission.isRoute()) { + json.put("route", "1");// 表示生成路由 + } else { + json.put("route", "0");// 表示不生成路由 + } + + if (isWWWHttpUrl(permission.getUrl())) { + json.put("path", MD5Util.MD5Encode(permission.getUrl(), "utf-8")); + } else { + json.put("path", permission.getUrl()); + } + + // 重要规则:路由name (通过URL生成路由name,路由name供前端开发,页面跳转使用) + if (oConvertUtils.isNotEmpty(permission.getComponentName())) { + json.put("name", permission.getComponentName()); + } else { + json.put("name", urlToRouteName(permission.getUrl())); + } + + // 是否隐藏路由,默认都是显示的 + if (permission.isHidden()) { + json.put("hidden", true); + } + // 聚合路由 + if (permission.isAlwaysShow()) { + json.put("alwaysShow", true); + } + json.put("component", permission.getComponent()); + JSONObject meta = new JSONObject(); + // 由用户设置是否缓存页面 用布尔值 + if (permission.isKeepAlive()) { + meta.put("keepAlive", true); + } else { + meta.put("keepAlive", false); + } + + /*update_begin author:wuxianquan date:20190908 for:往菜单信息里添加外链菜单打开方式 */ + //外链菜单打开方式 + if (permission.isInternalOrExternal()) { + meta.put("internalOrExternal", true); + } else { + meta.put("internalOrExternal", false); + } + /* update_end author:wuxianquan date:20190908 for: 往菜单信息里添加外链菜单打开方式*/ + + meta.put("title", permission.getName()); + + //update-begin--Author:scott Date:20201015 for:路由缓存问题,关闭了tab页时再打开就不刷新 #842 + String component = permission.getComponent(); + if(oConvertUtils.isNotEmpty(permission.getComponentName()) || oConvertUtils.isNotEmpty(component)){ + meta.put("componentName", oConvertUtils.getString(permission.getComponentName(),component.substring(component.lastIndexOf("/")+1))); + } + //update-end--Author:scott Date:20201015 for:路由缓存问题,关闭了tab页时再打开就不刷新 #842 + + if (oConvertUtils.isEmpty(permission.getParentId())) { + // 一级菜单跳转地址 + json.put("redirect", permission.getRedirect()); + if (oConvertUtils.isNotEmpty(permission.getIcon())) { + meta.put("icon", permission.getIcon()); + } + } else { + if (oConvertUtils.isNotEmpty(permission.getIcon())) { + meta.put("icon", permission.getIcon()); + } + } + if (isWWWHttpUrl(permission.getUrl())) { + meta.put("url", permission.getUrl()); + } + json.put("meta", meta); + } + + return json; + } + + /** + * 判断是否外网URL 例如: http://localhost:8080/jero-boot/swagger-ui.html#/ 支持特殊格式: {{ + * window._CONFIG['domianURL'] }}/druid/ {{ JS代码片段 }},前台解析会自动执行JS代码片段 + * + * @return + */ + private boolean isWWWHttpUrl(String url) { + if (url != null && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("{{"))) { + return true; + } + return false; + } + + /** + * 通过URL生成路由name(去掉URL前缀斜杠,替换内容中的斜杠‘/’为-) 举例: URL = /isystem/role RouteName = + * isystem-role + * + * @return + */ + private String urlToRouteName(String url) { + if (oConvertUtils.isNotEmpty(url)) { + if (url.startsWith("/")) { + url = url.substring(1); + } + url = url.replace("/", "-"); + + // 特殊标记 + url = url.replace(":", "@"); + return url; + } else { + return null; + } + } + + /** + * 根据菜单id来获取其对应的权限数据 + * + * @param sysPermissionDataRule + * @return + */ + @RequestMapping(value = "/getPermRuleListByPermId", method = RequestMethod.GET) + public Result> getPermRuleListByPermId(SysPermissionDataRule sysPermissionDataRule) { + List permRuleList = sysPermissionDataRuleService.getPermRuleListByPermId(sysPermissionDataRule.getPermissionId()); + Result> result = new Result<>(); + result.setSuccess(true); + result.setResult(permRuleList); + return result; + } + + /** + * 添加菜单权限数据 + * + * @param sysPermissionDataRule + * @return + */ + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/addPermissionRule", method = RequestMethod.POST) + public Result addPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { + Result result = new Result(); + try { + sysPermissionDataRule.setCreateTime(new Date()); + sysPermissionDataRuleService.savePermissionDataRule(sysPermissionDataRule); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/editPermissionRule", method = { RequestMethod.PUT, RequestMethod.POST }) + public Result editPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { + Result result = new Result(); + try { + sysPermissionDataRuleService.saveOrUpdate(sysPermissionDataRule); + result.success("更新成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + /** + * 删除菜单权限数据 + * + * @param id + * @return + */ + //@RequiresRoles({ "admin" }) + @RequestMapping(value = "/deletePermissionRule", method = RequestMethod.DELETE) + public Result deletePermissionRule(@RequestParam(name = "id", required = true) String id) { + Result result = new Result(); + try { + sysPermissionDataRuleService.deletePermissionDataRule(id); + result.success("删除成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + /** + * 查询菜单权限数据 + * + * @param sysPermissionDataRule + * @return + */ + @RequestMapping(value = "/queryPermissionRule", method = RequestMethod.GET) + public Result> queryPermissionRule(SysPermissionDataRule sysPermissionDataRule) { + Result> result = new Result<>(); + try { + List permRuleList = sysPermissionDataRuleService.queryPermissionRule(sysPermissionDataRule); + result.setResult(permRuleList); + result.success("查询成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + /** + * 部门权限表 + * @param departId + * @return + */ + @RequestMapping(value = "/queryDepartPermission", method = RequestMethod.GET) + public Result> queryDepartPermission(@RequestParam(name = "departId", required = true) String departId) { + Result> result = new Result<>(); + try { + List list = sysDepartPermissionService.list(new QueryWrapper().lambda().eq(SysDepartPermission::getDepartId, departId)); + result.setResult(list.stream().map(SysDepartPermission -> String.valueOf(SysDepartPermission.getPermissionId())).collect(Collectors.toList())); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 保存部门授权 + * + * @return + */ + @RequestMapping(value = "/saveDepartPermission", method = RequestMethod.POST) + //@RequiresRoles({ "admin" }) + public Result saveDepartPermission(@RequestBody JSONObject json) { + long start = System.currentTimeMillis(); + Result result = new Result<>(); + try { + String departId = json.getString("departId"); + String permissionIds = json.getString("permissionIds"); + String lastPermissionIds = json.getString("lastpermissionIds"); + this.sysDepartPermissionService.saveDepartPermission(departId, permissionIds, lastPermissionIds); + result.success("保存成功!"); + log.info("======部门授权成功=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); + } catch (Exception e) { + result.error500("授权失败!"); + log.error(e.getMessage(), e); + } + return result; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java new file mode 100644 index 00000000..0615d8ac --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java @@ -0,0 +1,425 @@ +package com.jero.modules.system.controller; + + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jero.modules.system.entity.*; +import com.jero.modules.system.service.*; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.PmsUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.model.TreeModel; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.jero.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + *

+ * 角色表 前端控制器 + *

+ * + * @Author scott + * @since 2018-12-19 + */ +@RestController +@RequestMapping("/sys/role") +@Slf4j +public class SysRoleController { + @Autowired + private ISysRoleService sysRoleService; + + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + + @Autowired + private ISysRolePermissionService sysRolePermissionService; + + @Autowired + private ISysPermissionService sysPermissionService; + + @Autowired + private ISysUserService sysUserService; + + /** + * 分页列表查询 + * @param role + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequiresPermissions("sys:role:list") + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> queryPageList(SysRole role, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysRoleService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param role + * @return + */ + @RequiresPermissions("sys:role:add") + @RequestMapping(value = "/add", method = RequestMethod.POST) + //@RequiresRoles({"admin"}) + public Result add(@RequestBody SysRole role) { + Result result = new Result(); + try { + role.setCreateTime(new Date()); + sysRoleService.save(role); + result.success("添加成功!"); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param role + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:role:edit") + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result edit(@RequestBody SysRole role) { + Result result = new Result(); + SysRole sysrole = sysRoleService.getById(role.getId()); + if(sysrole==null) { + result.error500("未找到对应实体"); + }else { + role.setUpdateTime(new Date()); + boolean ok = sysRoleService.updateById(role); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:role:del") + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name="id",required=true) String id) { + IPage pageInfo = sysUserService.getUserByRoleId(new Page<>(), id, null); + long total = pageInfo.getTotal(); + if (total == 0) { + sysRoleService.deleteRole(id); + return Result.OK("删除角色成功"); + } else { + return Result.error("删除角色失败,该角色下存在未删除用户"); + } + } + + /** + * 批量删除 + * @param ids + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:role:del") + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(oConvertUtils.isEmpty(ids)) { + result.error500("未选中角色!"); + }else { + sysRoleService.deleteBatchRole(ids.split(",")); + result.success("删除角色成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @RequiresPermissions("sys:role:list") + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result queryById(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysRole sysrole = sysRoleService.getById(id); + if(sysrole==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysrole); + result.setSuccess(true); + } + return result; + } + @RequiresPermissions("sys:role:list") + @RequestMapping(value = "/queryall", method = RequestMethod.GET) + public Result> queryall() { + Result> result = new Result<>(); + List list = sysRoleService.list(); + if(list==null||list.size()<=0) { + result.error500("未找到角色信息"); + }else { + result.setResult(list); + result.setSuccess(true); + } + return result; + } + + /** + * 校验角色编码唯一 + */ + @RequiresPermissions("sys:role:list") + @RequestMapping(value = "/checkRoleCode", method = RequestMethod.GET) + public Result checkUsername(String id,String roleCode) { + Result result = new Result<>(); + result.setResult(true);//如果此参数为false则程序发生异常 + log.info("--验证角色编码是否唯一---id:"+id+"--roleCode:"+roleCode); + try { + SysRole role = null; + if(oConvertUtils.isNotEmpty(id)) { + role = sysRoleService.getById(id); + } + SysRole newRole = sysRoleService.getOne(new QueryWrapper().lambda().eq(SysRole::getRoleCode, roleCode)); + if(newRole!=null) { + //如果根据传入的roleCode查询到信息了,那么就需要做校验了。 + if(role==null) { + //role为空=>新增模式=>只要roleCode存在则返回false + result.setSuccess(false); + result.setMessage("角色编码已存在"); + return result; + }else if(!id.equals(newRole.getId())) { + //否则=>编辑模式=>判断两者ID是否一致- + result.setSuccess(false); + result.setMessage("角色编码已存在"); + return result; + } + } + } catch (Exception e) { + result.setSuccess(false); + result.setResult(false); + result.setMessage(e.getMessage()); + return result; + } + result.setSuccess(true); + return result; + } + + /** + * 导出excel + * @param request + */ + @RequiresPermissions("sys:role:export") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysRole sysRole,HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysRole, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = sysRoleService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME,"角色列表"); + mv.addObject(NormalExcelConstants.CLASS,SysRole.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("角色列表数据","导出人:"+user.getRealname(),"导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST,pageList); + return mv; + } + + /** + * 通过excel导入数据 + * @param request + * @param response + * @return + */ + @RequiresPermissions("sys:role:import") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + return sysRoleService.importExcelCheckRoleCode(file, params); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("文件导入失败:" + e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + return Result.error("文件导入失败!"); + } + + /** + * 查询数据规则数据 + */ + @RequiresPermissions("sys:role:list") + @GetMapping(value = "/datarule/{permissionId}/{roleId}") + public Result loadDatarule(@PathVariable("permissionId") String permissionId,@PathVariable("roleId") String roleId) { + List list = sysPermissionDataRuleService.getPermRuleListByPermId(permissionId); + if(list==null || list.size()==0) { + return Result.error("未找到权限配置信息"); + }else { + Map map = new HashMap<>(); + map.put("datarule", list); + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(SysRolePermission::getPermissionId, permissionId) + .isNotNull(SysRolePermission::getDataRuleIds) + .eq(SysRolePermission::getRoleId,roleId); + SysRolePermission sysRolePermission = sysRolePermissionService.getOne(query); + if(sysRolePermission==null) { + //return Result.error("未找到角色菜单配置信息"); + }else { + String drChecked = sysRolePermission.getDataRuleIds(); + if(oConvertUtils.isNotEmpty(drChecked)) { + map.put("drChecked", drChecked.endsWith(",")?drChecked.substring(0, drChecked.length()-1):drChecked); + } + } + return Result.OK(map); + //TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key + } + } + + /** + * 保存数据规则至角色菜单关联表 + */ + @RequiresPermissions("sys:role:list") + @PostMapping(value = "/datarule") + public Result saveDatarule(@RequestBody JSONObject jsonObject) { + try { + String permissionId = jsonObject.getString("permissionId"); + String roleId = jsonObject.getString("roleId"); + String dataRuleIds = jsonObject.getString("dataRuleIds"); + log.info("保存数据规则>>"+"菜单ID:"+permissionId+"角色ID:"+ roleId+"数据权限ID:"+dataRuleIds); + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(SysRolePermission::getPermissionId, permissionId) + .eq(SysRolePermission::getRoleId,roleId); + SysRolePermission sysRolePermission = sysRolePermissionService.getOne(query); + if(sysRolePermission==null) { + return Result.error("请先保存角色菜单权限!"); + }else { + sysRolePermission.setDataRuleIds(dataRuleIds); + this.sysRolePermissionService.updateById(sysRolePermission); + } + } catch (Exception e) { + log.error("SysRoleController.saveDatarule()发生异常:" + e.getMessage(),e); + return Result.error("保存失败"); + } + return Result.OK("保存成功!"); + } + + + /** + * 用户角色授权功能,查询菜单权限树 + * @param request + * @return + */ + @RequiresPermissions("sys:role:list") + @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) + public Result> queryTreeList(HttpServletRequest request) { + Result> result = new Result<>(); + //全部权限ids + List ids = new ArrayList<>(); + try { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List list = sysPermissionService.list(query); + for(SysPermission sysPer : list) { + ids.add(sysPer.getId()); + } + List treeList = new ArrayList<>(); + getTreeModelList(treeList, list, null); + Map resMap = new HashMap(); + resMap.put("treeList", treeList); //全部树节点数据 + resMap.put("ids", ids);//全部树ids + result.setResult(resMap); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + @RequiresPermissions("sys:role:list") + private void getTreeModelList(List treeList,List metaList,TreeModel temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + TreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(),permission.getRuleFlag(), permission.isLeaf()); + if(temp==null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if(!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){ + temp.getChildren().add(tree); + if(!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + } + + } + } + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserAgentController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserAgentController.java new file mode 100644 index 00000000..6b061de7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserAgentController.java @@ -0,0 +1,264 @@ +package com.jero.modules.system.controller; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysUserAgent; +import com.jero.modules.system.service.ISysUserAgentService; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: 用户代理人设置 + * @Author: jero-boot + * @Date: 2019-04-17 + * @Version: V1.0 + */ +@RestController +@RequestMapping("/sys/sysUserAgent") +@Slf4j +public class SysUserAgentController { + @Autowired + private ISysUserAgentService sysUserAgentService; + + @Value("${jero.path.upload}") + private String upLoadPath; + + /** + * 分页列表查询 + * @param sysUserAgent + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/page") + public Result> queryPageList(SysUserAgent sysUserAgent, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysUserAgent, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysUserAgentService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param sysUserAgent + * @return + */ + @PostMapping(value = "/add") + public Result add(@RequestBody SysUserAgent sysUserAgent) { + Result result = new Result(); + try { + sysUserAgentService.save(sysUserAgent); + result.success("代理人设置成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysUserAgent + * @return + */ + @PutMapping(value = "/edit") + public Result edit(@RequestBody SysUserAgent sysUserAgent) { + Result result = new Result(); + SysUserAgent sysUserAgentEntity = sysUserAgentService.getById(sysUserAgent.getId()); + if(sysUserAgentEntity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysUserAgentService.updateById(sysUserAgent); + //TODO 返回false说明什么? + if(ok) { + result.success("代理人设置成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysUserAgent sysUserAgent = sysUserAgentService.getById(id); + if(sysUserAgent==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysUserAgentService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysUserAgentService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + SysUserAgent sysUserAgent = sysUserAgentService.getById(id); + if(sysUserAgent==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysUserAgent); + result.setSuccess(true); + } + return result; + } + + /** + * 通过userName查询 + * @param userName + * @return + */ + @GetMapping(value = "/queryByUserName") + public Result queryByUserName(@RequestParam(name="userName",required=true) String userName) { + Result result = new Result(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(SysUserAgent::getUserName, userName); + SysUserAgent sysUserAgent = sysUserAgentService.getOne(queryWrapper); + if(sysUserAgent==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysUserAgent); + result.setSuccess(true); + } + return result; + } + + /** + * 导出excel + * + * @param sysUserAgent + * @param request + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysUserAgent sysUserAgent,HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysUserAgent, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = sysUserAgentService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "用户代理人设置列表"); + mv.addObject(NormalExcelConstants.CLASS, SysUserAgent.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + ExportParams exportParams = new ExportParams("用户代理人设置列表数据", "导出人:"+user.getRealname(), "导出信息"); + exportParams.setImageBasePath(upLoadPath); + mv.addObject(NormalExcelConstants.PARAMS, exportParams); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List listSysUserAgents = ExcelImportUtil.importExcel(file.getInputStream(), SysUserAgent.class, params); + for (SysUserAgent sysUserAgentExcel : listSysUserAgents) { + sysUserAgentService.save(sysUserAgentExcel); + } + return Result.OK("文件导入成功!数据行数:" + listSysUserAgents.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java new file mode 100644 index 00000000..e261ea25 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java @@ -0,0 +1,1375 @@ +package com.jero.modules.system.controller; + + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jero.common.exception.JeroBootException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.PermissionData; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.*; +import com.jero.modules.system.entity.*; +import com.jero.modules.system.model.DepartIdModel; +import com.jero.modules.system.model.SysUserSysDepartModel; +import com.jero.modules.system.service.*; +import com.jero.modules.system.vo.SysDepartUsersVO; +import com.jero.modules.system.vo.SysUserRoleVO; +import org.apache.shiro.subject.Subject; +import org.checkerframework.framework.qual.RequiresQualifier; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.ConstraintViolation; +import javax.validation.Validator; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 用户表 前端控制器 + *

+ * + * @Author scott + * @since 2018-12-20 + */ +@Slf4j +@RestController +@RequestMapping("/sys/user") +public class SysUserController { + @Autowired + private ISysBaseAPI sysBaseAPI; + + @Autowired + private ISysUserService sysUserService; + + @Autowired + private ISysDepartService sysDepartService; + + @Autowired + private ISysUserRoleService sysUserRoleService; + + @Autowired + private ISysUserDepartService sysUserDepartService; + + @Autowired + private ISysUserRoleService userRoleService; + + @Autowired + private ISysDepartRoleUserService departRoleUserService; + + @Autowired + private ISysDepartRoleService departRoleService; + + @Autowired + private RedisUtil redisUtil; + + @Value("${jero.path.upload}") + private String upLoadPath; + + @Resource + private BaseCommonService baseCommonService; + + /** + * 获取用户列表数据 + * @param user + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequiresPermissions("sys:user:list") + @PermissionData(pageComponent = "system/UserList") + @RequestMapping(value = "/page", method = RequestMethod.GET) + public Result> queryPageList(SysUser user,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap()); + //TODO 外部模拟登陆临时账号,列表不显示 + queryWrapper.ne("username","_reserve_user_external"); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysUserService.page(page, queryWrapper); + List userList = new ArrayList<>(); + for (SysUser record : pageList.getRecords()) { + record.setEmail(PasswordUtil.decrypt(record.getEmail())); + record.setPhone(PasswordUtil.decrypt(record.getPhone())); + userList.add(record); + } + pageList.setRecords(userList); + //批量查询用户的所属部门 + //step.1 先拿到全部的 useids + //step.2 通过 useids,一次性查询用户的所属部门名字 + List userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList()); + if(userIds!=null && userIds.size()>0){ + Map useDepNames = sysUserService.getDepNamesByUserIds(userIds); + pageList.getRecords().forEach(item->{ + item.setOrgCodeTxt(useDepNames.get(item.getId())); + }); + } + result.setSuccess(true); + result.setResult(pageList); + log.info(pageList.toString()); + return result; + } + + //@RequiresRoles({"admin"}) + @RequiresPermissions("user:add") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result add(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String selectedRoles = jsonObject.getString("selectedroles"); + String selectedDeparts = jsonObject.getString("selecteddeparts"); + String confirmPassword = jsonObject.getString("confirmpassword"); + String rsaPublicKey = jsonObject.getString("rsaPublicKey"); + String rsaPrivateKey = String.valueOf(redisUtil.get(rsaPublicKey)); + SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); + String email; + String phone; + try { + //1:先用私钥解密数据 + email = CommonUtils.decryptBtRsaPriKey(user.getEmail(), rsaPrivateKey); + phone = CommonUtils.decryptBtRsaPriKey(user.getPhone(), rsaPrivateKey); + } catch (Exception e) { + throw new JeroBootException("解密失败!", e); + } + //2:把解密的数据进行校验 + user.setEmail(email); + user.setPhone(phone); + ValidUtil.validate(user); + //3:把数据加密在放回来 + user.setEmail(PasswordUtil.encrypt(email)); + user.setPhone(PasswordUtil.encrypt(phone)); + if (!confirmPassword.equals(user.getPassword())) { + throw new JeroBootException("两次密码输入不一致"); + } + String password; + try { + password = CommonUtils.decryptBtRsaPriKey(user.getPassword(), rsaPrivateKey); + } catch (Exception e) { + throw new JeroBootException("解密失败!", e); + } + //设置创建时间 + user.setCreateTime(new Date()); + String salt = oConvertUtils.randomGen(8); + user.setSalt(salt); + String passwordEncode = PasswordUtil.encrypt(user.getUsername(), password, salt); + user.setPassword(passwordEncode); + user.setStatus(1); + user.setDelFlag(CommonConstant.DEL_FLAG_0); + sysUserService.addUserWithRole(user, selectedRoles); + sysUserService.addUserWithDepart(user, selectedDeparts); + result.success("添加成功!"); + + return result; + } + + //@RequiresRoles({"admin"}) + @RequiresPermissions("user:edit") + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result edit(@RequestBody JSONObject jsonObject) { + String rsaPublicKey = jsonObject.getString("rsaPublicKey"); + String rsaPrivateKey = String.valueOf(redisUtil.get(rsaPublicKey)); + Result result = new Result(); + SysUser sysUser = sysUserService.getById(jsonObject.getString("id")); + baseCommonService.addLog("编辑用户,id: " + jsonObject.getString("id"), CommonConstant.LOG_TYPE_2, 2); + if (sysUser == null) { + result.error500("未找到对应实体"); + } else { + SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); + String email; + String phone; + try { + //1:先用私钥解密数据 + email = CommonUtils.decryptBtRsaPriKey(user.getEmail(), rsaPrivateKey); + phone = CommonUtils.decryptBtRsaPriKey(user.getPhone(), rsaPrivateKey); + } catch (Exception e) { + throw new JeroBootException("解密失败!",e); + } + //2:把解密的数据进行校验 + user.setEmail(email); + user.setPhone(phone); + ValidUtil.validate(user); + //3:把数据加密在放回来 + user.setEmail(PasswordUtil.encrypt(email)); + user.setPhone(PasswordUtil.encrypt(phone)); + + user.setUpdateTime(new Date()); + //String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), sysUser.getSalt()); + user.setPassword(sysUser.getPassword()); + String roles = jsonObject.getString("selectedroles"); + String departs = jsonObject.getString("selecteddeparts"); + sysUserService.editUserWithRole(user, roles); + sysUserService.editUserWithDepart(user, departs); + sysUserService.updateNullPhoneEmail(); + result.success("修改成功!"); + } + return result; + } + + /** + * 删除用户 + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result delete(@RequestParam(name="id",required=true) String id) { + baseCommonService.addLog("删除用户,id: " +id ,CommonConstant.LOG_TYPE_2, 3); + this.sysUserService.deleteUser(id); + return Result.OK("删除用户成功"); + } + + /** + * 批量删除用户 + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + baseCommonService.addLog("批量删除用户, ids: " +ids ,CommonConstant.LOG_TYPE_2, 3); + this.sysUserService.deleteBatchUsers(ids); + return Result.OK("批量删除用户成功"); + } + + /** + * 冻结&解冻用户 + * @param jsonObject + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/frozenBatch", method = RequestMethod.PUT) + public Result frozenBatch(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + try { + String ids = jsonObject.getString("ids"); + String status = jsonObject.getString("status"); + String[] arr = ids.split(","); + for (String id : arr) { + if(oConvertUtils.isNotEmpty(id)) { + this.sysUserService.update(new SysUser().setStatus(Integer.parseInt(status)), + new UpdateWrapper().lambda().eq(SysUser::getId,id)); + } + } + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败"+e.getMessage()); + } + result.success("操作成功!"); + return result; + + } + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result queryById(@RequestParam(name = "id", required = true) String id) { + Result result = new Result(); + SysUser sysUser = sysUserService.getById(id); + if (sysUser == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(sysUser); + result.setSuccess(true); + } + return result; + } + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/queryUserRole", method = RequestMethod.GET) + public Result> queryUserRole(@RequestParam(name = "userid", required = true) String userid) { + Result> result = new Result<>(); + List list = new ArrayList(); + List userRole = sysUserRoleService.list(new QueryWrapper().lambda().eq(SysUserRole::getUserId, userid)); + if (userRole == null || userRole.size() <= 0) { + result.error500("未找到用户相关角色信息"); + } else { + for (SysUserRole sysUserRole : userRole) { + list.add(sysUserRole.getRoleId()); + } + result.setSuccess(true); + result.setResult(list); + } + return result; + } + + + /** + * 校验用户账号是否唯一
+ * 可以校验其他 需要检验什么就传什么。。。 + * + * @param sysUser + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/checkOnlyUser", method = RequestMethod.GET) + public Result checkOnlyUser(SysUser sysUser) { + Result result = new Result<>(); + //如果此参数为false则程序发生异常 + result.setResult(true); + try { + //通过传入信息查询新的用户信息 + SysUser user = sysUserService.getOne(new QueryWrapper(sysUser)); + if (user != null) { + result.setSuccess(false); + result.setMessage("用户账号已存在"); + return result; + } + + } catch (Exception e) { + result.setSuccess(false); + result.setMessage(e.getMessage()); + return result; + } + result.setSuccess(true); + return result; + } + + /** + * 修改密码 + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("user:edit") + @RequestMapping(value = "/changePassword", method = RequestMethod.PUT) + public Result changePassword(@RequestBody SysUser sysUser) { + SysUser u = this.sysUserService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, sysUser.getUsername())); + if (u == null) { + return Result.error("用户不存在!"); + } + sysUser.setId(u.getId()); + return sysUserService.changePassword(sysUser); + } + + /** + * 查询指定用户和部门关联的数据 + * + * @param userId + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/userDepartList", method = RequestMethod.GET) + public Result> getUserDepartsList(@RequestParam(name = "userId", required = true) String userId) { + Result> result = new Result<>(); + try { + List depIdModelList = this.sysUserDepartService.queryDepartIdsOfUser(userId); + if (depIdModelList != null && depIdModelList.size() > 0) { + result.setSuccess(true); + result.setMessage("查找成功"); + result.setResult(depIdModelList); + } else { + result.setSuccess(false); + result.setMessage("查找失败"); + } + return result; + } catch (Exception e) { + log.error(e.getMessage(), e); + result.setSuccess(false); + result.setMessage("查找过程中出现了异常: " + e.getMessage()); + return result; + } + + } + + /** + * 生成在添加用户情况下没有主键的问题,返回给前端,根据该id绑定部门数据 + * + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/generateUserId", method = RequestMethod.GET) + public Result generateUserId() { + Result result = new Result<>(); + System.out.println("我执行了,生成用户ID=============================="); + String userId = UUID.randomUUID().toString().replace("-", ""); + result.setSuccess(true); + result.setResult(userId); + return result; + } + + /** + * 根据部门id查询用户信息 + * + * @param id + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/queryUserByDepId", method = RequestMethod.GET) + public Result> queryUserByDepId(@RequestParam(name = "id", required = true) String id,@RequestParam(name="realname",required=false) String realname) { + Result> result = new Result<>(); + //List userList = sysUserDepartService.queryUserByDepId(id); + SysDepart sysDepart = sysDepartService.getById(id); + List userList = sysUserDepartService.queryUserByDepCode(sysDepart.getOrgCode(),realname); + + //批量查询用户的所属部门 + //step.1 先拿到全部的 useids + //step.2 通过 useids,一次性查询用户的所属部门名字 + List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + if(userIds!=null && userIds.size()>0){ + Map useDepNames = sysUserService.getDepNamesByUserIds(userIds); + userList.forEach(item->{ + //TODO 临时借用这个字段用于页面展示 + item.setOrgCodeTxt(useDepNames.get(item.getId())); + }); + } + + try { + result.setSuccess(true); + result.setResult(userList); + return result; + } catch (Exception e) { + log.error(e.getMessage(), e); + result.setSuccess(false); + return result; + } + } + + /** + * 导出excel + * + * @param request + * @param sysUser + */ + @RequiresPermissions("sys:user:export") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysUser sysUser,HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysUser, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + //update-begin--Author:kangxiaolin Date:20180825 for:[03]用户导出,如果选择数据则只导出相关数据-------------------- + String selections = request.getParameter("selections"); + if(!oConvertUtils.isEmpty(selections)){ + queryWrapper.in("id",selections.split(",")); + } + //update-end--Author:kangxiaolin Date:20180825 for:[03]用户导出,如果选择数据则只导出相关数据---------------------- + List pageList = sysUserService.list(queryWrapper); + + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "用户列表"); + mv.addObject(NormalExcelConstants.CLASS, SysUser.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + ExportParams exportParams = new ExportParams("用户列表数据", "导出人:"+user.getRealname(), "导出信息"); + exportParams.setImageBasePath(upLoadPath); + mv.addObject(NormalExcelConstants.PARAMS, exportParams); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:import") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response)throws IOException { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + // 错误信息 + List errorMessage = new ArrayList<>(); + int successLines = 0, errorLines = 0; + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List listSysUsers = ExcelImportUtil.importExcel(file.getInputStream(), SysUser.class, params); + for (int i = 0; i < listSysUsers.size(); i++) { + SysUser sysUserExcel = listSysUsers.get(i); + if (StringUtils.isBlank(sysUserExcel.getPassword())) { + // 密码默认为 “123456” + sysUserExcel.setPassword("123456"); + } + // 密码加密加盐 + String salt = oConvertUtils.randomGen(8); + sysUserExcel.setSalt(salt); + String passwordEncode = PasswordUtil.encrypt(sysUserExcel.getUsername(), sysUserExcel.getPassword(), salt); + sysUserExcel.setPassword(passwordEncode); + try { + sysUserService.save(sysUserExcel); + successLines++; + } catch (Exception e) { + errorLines++; + String message = e.getMessage().toLowerCase(); + int lineNumber = i + 1; + // 通过索引名判断出错信息 + if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_USERNAME)) { + errorMessage.add("第 " + lineNumber + " 行:用户名已经存在,忽略导入。"); + } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_WORK_NO)) { + errorMessage.add("第 " + lineNumber + " 行:工号已经存在,忽略导入。"); + } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_PHONE)) { + errorMessage.add("第 " + lineNumber + " 行:手机号已经存在,忽略导入。"); + } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_EMAIL)) { + errorMessage.add("第 " + lineNumber + " 行:电子邮件已经存在,忽略导入。"); + } else { + errorMessage.add("第 " + lineNumber + " 行:未知错误,忽略导入"); + log.error(e.getMessage(), e); + } + } + // 批量将部门和用户信息建立关联关系 + String departIds = sysUserExcel.getDepartIds(); + if (StringUtils.isNotBlank(departIds)) { + String userId = sysUserExcel.getId(); + String[] departIdArray = departIds.split(","); + List userDepartList = new ArrayList<>(departIdArray.length); + for (String departId : departIdArray) { + userDepartList.add(new SysUserDepart(userId, departId)); + } + sysUserDepartService.saveBatch(userDepartList); + } + + } + } catch (Exception e) { + errorMessage.add("发生异常:" + e.getMessage()); + log.error(e.getMessage(), e); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); + } + + /** + * @功能:根据id 批量查询 + * @param userIds + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/queryByIds", method = RequestMethod.GET) + public Result> queryByIds(@RequestParam String userIds) { + Result> result = new Result<>(); + String[] userId = userIds.split(","); + Collection idList = Arrays.asList(userId); + Collection userRole = sysUserService.listByIds(idList); + result.setSuccess(true); + result.setResult(userRole); + return result; + } + + /** + * 首页用户修改密码 + */ + //@RequiresRoles({"admin"}) + @RequestMapping(value = "/updatePassword", method = RequestMethod.PUT) + public Result changPassword(@RequestBody JSONObject json) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String username = json.getString("username"); + String oldPassword = json.getString("oldpassword"); + String password = json.getString("password"); + String confirmPassword = json.getString("confirmpassword"); + SysUser user = this.sysUserService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, username)); + if(user==null) { + return Result.error("用户不存在!"); + } + return sysUserService.resetPassword(username,oldPassword,password,confirmPassword); + } + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/userRoleList", method = RequestMethod.GET) + public Result> userRoleList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result>(); + Page page = new Page(pageNo, pageSize); + String roleId = req.getParameter("roleId"); + String username = req.getParameter("username"); + IPage pageList = sysUserService.getUserByRoleId(page,roleId,username); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 给指定角色添加用户 + * + * @param + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("user:add") + @RequestMapping(value = "/addSysUserRole", method = RequestMethod.POST) + public Result addSysUserRole(@RequestBody SysUserRoleVO sysUserRoleVO) { + Result result = new Result(); + try { + String sysRoleId = sysUserRoleVO.getRoleId(); + for(String sysUserId:sysUserRoleVO.getUserIdList()) { + SysUserRole sysUserRole = new SysUserRole(sysUserId,sysRoleId); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("role_id", sysRoleId).eq("user_id",sysUserId); + SysUserRole one = sysUserRoleService.getOne(queryWrapper); + if(one==null){ + sysUserRoleService.save(sysUserRole); + } + + } + result.setMessage("添加成功!"); + result.setSuccess(true); + return result; + }catch(Exception e) { + log.error(e.getMessage(), e); + result.setSuccess(false); + result.setMessage("出错了: " + e.getMessage()); + return result; + } + } + /** + * 删除指定角色的用户关系 + * @param + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/deleteUserRole", method = RequestMethod.DELETE) + public Result deleteUserRole(@RequestParam(name="roleId") String roleId, + @RequestParam(name="userId",required=true) String userId + ) { + Result result = new Result(); + try { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("role_id", roleId).eq("user_id",userId); + sysUserRoleService.remove(queryWrapper); + result.success("删除成功!"); + }catch(Exception e) { + log.error(e.getMessage(), e); + result.error500("删除失败!"); + } + return result; + } + + /** + * 批量删除指定角色的用户关系 + * + * @param + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/deleteUserRoleBatch", method = RequestMethod.DELETE) + public Result deleteUserRoleBatch( + @RequestParam(name="roleId") String roleId, + @RequestParam(name="userIds",required=true) String userIds) { + Result result = new Result(); + try { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("role_id", roleId).in("user_id",Arrays.asList(userIds.split(","))); + sysUserRoleService.remove(queryWrapper); + result.success("删除成功!"); + }catch(Exception e) { + log.error(e.getMessage(), e); + result.error500("删除失败!"); + } + return result; + } + + /** + * 部门用户列表 + */ + @RequestMapping(value = "/departUserList", method = RequestMethod.GET) + @RequiresPermissions("sys:user:list") + public Result> departUserList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result>(); + Page page = new Page(pageNo, pageSize); + String depId = req.getParameter("depId"); + String username = req.getParameter("username"); + //根据部门ID查询,当前和下级所有的部门IDS + List subDepids = new ArrayList<>(); + //部门id为空时,查询我的部门下所有用户 + if(oConvertUtils.isEmpty(depId)){ + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + int userIdentity = user.getUserIdentity() != null?user.getUserIdentity():CommonConstant.USER_IDENTITY_1; + if(oConvertUtils.isNotEmpty(userIdentity) && userIdentity == CommonConstant.USER_IDENTITY_2 ){ + subDepids = sysDepartService.getMySubDepIdsByDepId(user.getDepartIds()); + } + }else{ + subDepids = sysDepartService.getSubDepIdsByDepId(depId); + } + if(subDepids != null && subDepids.size()>0){ + IPage pageList = sysUserService.getUserByDepIds(page,subDepids,username); + //批量查询用户的所属部门 + //step.1 先拿到全部的 useids + //step.2 通过 useids,一次性查询用户的所属部门名字 + List userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList()); + if(userIds!=null && userIds.size()>0){ + Map useDepNames = sysUserService.getDepNamesByUserIds(userIds); + pageList.getRecords().forEach(item -> { + //批量查询用户的所属部门 + item.setOrgCode(useDepNames.get(item.getId())); + }); + } + result.setSuccess(true); + result.setResult(pageList); + }else{ + result.setSuccess(true); + result.setResult(null); + } + return result; + } + + + /** + * 根据 orgCode 查询用户,包括子部门下的用户 + * 若某个用户包含多个部门,则会显示多条记录,可自行处理成单条记录 + */ + @GetMapping("/queryByOrgCode") + @RequiresPermissions("sys:user:list") + public Result queryByDepartId( + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + @RequestParam(name = "orgCode") String orgCode, + SysUser userParams + ) { + IPage pageList = sysUserService.queryUserByOrgCode(orgCode, userParams, new Page(pageNo, pageSize)); + return Result.OK(pageList); + } + + /** + * 给指定部门添加对应的用户 + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("user:add") + @RequestMapping(value = "/editSysDepartWithUser", method = RequestMethod.POST) + public Result editSysDepartWithUser(@RequestBody SysDepartUsersVO sysDepartUsersVO) { + Result result = new Result(); + try { + String sysDepId = sysDepartUsersVO.getDepId(); + for(String sysUserId:sysDepartUsersVO.getUserIdList()) { + SysUserDepart sysUserDepart = new SysUserDepart(null,sysUserId,sysDepId); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("dep_id", sysDepId).eq("user_id",sysUserId); + SysUserDepart one = sysUserDepartService.getOne(queryWrapper); + if(one==null){ + sysUserDepartService.save(sysUserDepart); + } + } + result.setMessage("添加成功!"); + result.setSuccess(true); + return result; + }catch(Exception e) { + log.error(e.getMessage(), e); + result.setSuccess(false); + result.setMessage("出错了: " + e.getMessage()); + return result; + } + } + + /** + * 删除指定机构的用户关系 + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/deleteUserInDepart", method = RequestMethod.DELETE) + public Result deleteUserInDepart(@RequestParam(name="depId") String depId, + @RequestParam(name="userId",required=true) String userId + ) { + Result result = new Result(); + try { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("dep_id", depId).eq("user_id",userId); + boolean b = sysUserDepartService.remove(queryWrapper); + if(b){ + List sysDepartRoleList = departRoleService.list(new QueryWrapper().eq("depart_id",depId)); + List roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList()); + if(roleIds != null && roleIds.size()>0){ + QueryWrapper query = new QueryWrapper<>(); + query.eq("user_id",userId).in("drole_id",roleIds); + departRoleUserService.remove(query); + } + result.success("删除成功!"); + }else{ + result.error500("当前选中部门与用户无关联关系!"); + } + }catch(Exception e) { + log.error(e.getMessage(), e); + result.error500("删除失败!"); + } + return result; + } + + /** + * 批量删除指定机构的用户关系 + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/deleteUserInDepartBatch", method = RequestMethod.DELETE) + public Result deleteUserInDepartBatch( + @RequestParam(name="depId") String depId, + @RequestParam(name="userIds",required=true) String userIds) { + Result result = new Result(); + try { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("dep_id", depId).in("user_id",Arrays.asList(userIds.split(","))); + boolean b = sysUserDepartService.remove(queryWrapper); + if(b){ + departRoleUserService.removeDeptRoleUser(Arrays.asList(userIds.split(",")),depId); + } + result.success("删除成功!"); + }catch(Exception e) { + log.error(e.getMessage(), e); + result.error500("删除失败!"); + } + return result; + } + + /** + * 查询当前用户的所有部门/当前部门编码 + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/getCurrentUserDeparts", method = RequestMethod.GET) + public Result> getCurrentUserDeparts() { + Result> result = new Result>(); + try { + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + List list = this.sysDepartService.queryUserDeparts(sysUser.getId()); + Map map = new HashMap(); + map.put("list", list); + map.put("orgCode", sysUser.getOrgCode()); + result.setSuccess(true); + result.setResult(map); + }catch(Exception e) { + log.error(e.getMessage(), e); + result.error500("查询失败!"); + } + return result; + } + + + + + /** + * 用户注册接口 + * + * @param jsonObject + * @param user + * @return + */ + @PostMapping("/register") + public Result userRegister(@RequestBody JSONObject jsonObject, SysUser user) { + Result result = new Result(); + String phone = jsonObject.getString("phone"); + String smscode = jsonObject.getString("smscode"); + Object code = redisUtil.get(phone); + String username = jsonObject.getString("username"); + //未设置用户名,则用手机号作为用户名 + if(oConvertUtils.isEmpty(username)){ + username = phone; + } + //未设置密码,则随机生成一个密码 + String password = jsonObject.getString("password"); + if(oConvertUtils.isEmpty(password)){ + password = RandomUtil.randomString(8); + } + String email = jsonObject.getString("email"); + SysUser sysUser1 = sysUserService.getUserByName(username); + if (sysUser1 != null) { + result.setMessage("用户名已注册"); + result.setSuccess(false); + return result; + } + SysUser sysUser2 = sysUserService.getUserByPhone(phone); + if (sysUser2 != null) { + result.setMessage("该手机号已注册"); + result.setSuccess(false); + return result; + } + + if(oConvertUtils.isNotEmpty(email)){ + SysUser sysUser3 = sysUserService.getUserByEmail(email); + if (sysUser3 != null) { + result.setMessage("邮箱已被注册"); + result.setSuccess(false); + return result; + } + } + if(null == code){ + result.setMessage("手机验证码失效,请重新获取"); + result.setSuccess(false); + return result; + } + if (!smscode.equals(code.toString())) { + result.setMessage("手机验证码错误"); + result.setSuccess(false); + return result; + } + + try { + user.setCreateTime(new Date());// 设置创建时间 + String salt = oConvertUtils.randomGen(8); + String passwordEncode = PasswordUtil.encrypt(username, password, salt); + user.setSalt(salt); + user.setUsername(username); + user.setRealname(username); + user.setPassword(passwordEncode); + user.setEmail(email); + user.setPhone(phone); + user.setStatus(CommonConstant.USER_UNFREEZE); + user.setDelFlag(CommonConstant.DEL_FLAG_0); + user.setActivitiSync(CommonConstant.ACT_SYNC_0); + sysUserService.addUserWithRole(user,"ee8626f80f7c2619917b6236f3a7f02b");//默认临时角色 test + result.success("注册成功"); + } catch (Exception e) { + result.error500("注册失败"); + } + return result; + } + + /** + * 根据用户名或手机号查询用户信息 + * @param + * @return + */ + @RequiresPermissions("sys:user:list") + @GetMapping("/querySysUser") + public Result> querySysUser(SysUser sysUser) { + String phone = sysUser.getPhone(); + String username = sysUser.getUsername(); + Result> result = new Result>(); + Map map = new HashMap(); + if (oConvertUtils.isNotEmpty(phone)) { + SysUser user = sysUserService.getUserByPhone(phone); + if(user!=null) { + map.put("username",user.getUsername()); + map.put("phone",user.getPhone()); + result.setSuccess(true); + result.setResult(map); + return result; + } + } + if (oConvertUtils.isNotEmpty(username)) { + SysUser user = sysUserService.getUserByName(username); + if(user!=null) { + map.put("username",user.getUsername()); + map.put("phone",user.getPhone()); + result.setSuccess(true); + result.setResult(map); + return result; + } + } + result.setSuccess(false); + result.setMessage("验证失败"); + return result; + } + + /** + * 用户手机号验证 + */ + @PostMapping("/phoneVerification") + public Result> phoneVerification(@RequestBody JSONObject jsonObject) { + Result> result = new Result>(); + String phone = jsonObject.getString("phone"); + String smscode = jsonObject.getString("smscode"); + Object code = redisUtil.get(phone); + if (!smscode.equals(code)) { + result.setMessage("手机验证码错误"); + result.setSuccess(false); + return result; + } + //设置有效时间 + redisUtil.set(phone, smscode,600); + //新增查询用户名 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysUser::getPhone,phone); + SysUser user = sysUserService.getOne(query); + Map map = new HashMap<>(); + map.put("smscode",smscode); + map.put("username",user.getUsername()); + result.setResult(map); + result.setSuccess(true); + return result; + } + + /** + * 用户更改密码 + */ + @GetMapping("/passwordChange") + public Result passwordChange(@RequestParam(name="username")String username, + @RequestParam(name="password")String password, + @RequestParam(name="smscode")String smscode, + @RequestParam(name="phone") String phone) { + Result result = new Result(); + if(oConvertUtils.isEmpty(username) || oConvertUtils.isEmpty(password) || oConvertUtils.isEmpty(smscode) || oConvertUtils.isEmpty(phone) ) { + result.setMessage("更改密码失败!"); + result.setSuccess(false); + return result; + } + + SysUser sysUser=new SysUser(); + Object object= redisUtil.get(phone); + if(null==object) { + result.setMessage("短信验证码失效!"); + result.setSuccess(false); + return result; + } + if(!smscode.equals(object)) { + result.setMessage("短信验证码不匹配!"); + result.setSuccess(false); + return result; + } + sysUser = this.sysUserService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername,username).eq(SysUser::getPhone,phone)); + if (sysUser == null) { + result.setMessage("未找到用户!"); + result.setSuccess(false); + return result; + } else { + String salt = oConvertUtils.randomGen(8); + sysUser.setSalt(salt); + String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); + sysUser.setPassword(passwordEncode); + this.sysUserService.updateById(sysUser); + result.setSuccess(true); + result.setMessage("密码更改完成!"); + return result; + } + } + + + /** + * 根据TOKEN获取用户的部分信息(返回的数据是可供表单设计器使用的数据) + * + * @return + */ + @RequiresPermissions("sys:user:list") + @GetMapping("/getUserSectionInfoByToken") + public Result getUserSectionInfoByToken(HttpServletRequest request, @RequestParam(name = "token", required = false) String token) { + try { + String username = null; + // 如果没有传递token,就从header中获取token并获取用户信息 + if (oConvertUtils.isEmpty(token)) { + username = JwtUtil.getUserNameByToken(request); + } else { + username = JwtUtil.getUsername(token); + } + + log.debug(" ------ 通过令牌获取部分用户信息,当前用户: " + username); + + // 根据用户名查询用户信息 + SysUser sysUser = sysUserService.getUserByName(username); + Map map = new HashMap(); + map.put("sysUserId", sysUser.getId()); + map.put("sysUserCode", sysUser.getUsername()); // 当前登录用户登录账号 + map.put("sysUserName", sysUser.getRealname()); // 当前登录用户真实名称 + map.put("sysOrgCode", sysUser.getOrgCode()); // 当前登录用户部门编号 + + log.debug(" ------ 通过令牌获取部分用户信息,已获取的用户信息: " + map); + + return Result.OK(map); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error(500, "查询失败:" + e.getMessage()); + } + } + + /** + * 【APP端接口】获取用户列表 根据用户名和真实名 模糊匹配 + * @param keyword + * @param pageNo + * @param pageSize + * @return + */ + @RequiresPermissions("sys:user:list") + @GetMapping("/appUserList") + public Result appUserList(@RequestParam(name = "keyword", required = false) String keyword, + @RequestParam(name = "username", required = false) String username, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + @RequestParam(name = "syncFlow", required = false) String syncFlow) { + try { + //TODO 从查询效率上将不要用mp的封装的page分页查询 建议自己写分页语句 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + if(oConvertUtils.isNotEmpty(syncFlow)){ + query.eq(SysUser::getActivitiSync, CommonConstant.ACT_SYNC_1); + } + query.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0); + if(oConvertUtils.isNotEmpty(username)){ + if(username.contains(",")){ + query.in(SysUser::getUsername,username.split(",")); + }else{ + query.eq(SysUser::getUsername,username); + } + }else{ + query.and(i -> i.like(SysUser::getUsername, keyword).or().like(SysUser::getRealname, keyword)); + } + Page page = new Page<>(pageNo, pageSize); + IPage res = this.sysUserService.page(page, query); + return Result.OK(res); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error(500, "查询失败:" + e.getMessage()); + } + + } + + /** + * 获取被逻辑删除的用户列表,无分页 + * + * @return logicDeletedUserList + */ + @RequiresPermissions("sys:user:list") + @GetMapping("/recycleBin") + public Result getRecycleBin() { + List logicDeletedUserList = sysUserService.queryLogicDeleted(); + if (logicDeletedUserList.size() > 0) { + // 批量查询用户的所属部门 + // step.1 先拿到全部的 userIds + List userIds = logicDeletedUserList.stream().map(SysUser::getId).collect(Collectors.toList()); + // step.2 通过 userIds,一次性查询用户的所属部门名字 + Map useDepNames = sysUserService.getDepNamesByUserIds(userIds); + logicDeletedUserList.forEach(item -> item.setOrgCode(useDepNames.get(item.getId()))); + } + return Result.OK(logicDeletedUserList); + } + + /** + * 还原被逻辑删除的用户 + * + * @param jsonObject + * @return + */ + @RequiresPermissions("sys:user:list") + @RequestMapping(value = "/putRecycleBin", method = RequestMethod.PUT) + public Result putRecycleBin(@RequestBody JSONObject jsonObject, HttpServletRequest request) { + String userIds = jsonObject.getString("userIds"); + if (StringUtils.isNotBlank(userIds)) { + SysUser updateUser = new SysUser(); + updateUser.setUpdateBy(JwtUtil.getUserNameByToken(request)); + updateUser.setUpdateTime(new Date()); + sysUserService.revertLogicDeleted(Arrays.asList(userIds.split(",")), updateUser); + } + return Result.OK("还原成功"); + } + + /** + * 彻底删除用户 + * + * @param userIds 被删除的用户ID,多个id用半角逗号分割 + * @return + */ + //@RequiresRoles({"admin"}) + @RequiresPermissions("sys:user:del") + @RequestMapping(value = "/deleteRecycleBin", method = RequestMethod.DELETE) + public Result deleteRecycleBin(@RequestParam("userIds") String userIds) { + if (StringUtils.isNotBlank(userIds)) { + sysUserService.removeLogicDeleted(Arrays.asList(userIds.split(","))); + } + return Result.OK("删除成功"); + } + + + /** + * 移动端修改用户信息 + * @param jsonObject + * @return + */ + @RequiresPermissions("user:edit") + @RequestMapping(value = "/appEdit", method = RequestMethod.PUT) + public Result appEdit(HttpServletRequest request,@RequestBody JSONObject jsonObject) { + Result result = new Result(); + try { + String username = JwtUtil.getUserNameByToken(request); + SysUser sysUser = sysUserService.getUserByName(username); + baseCommonService.addLog("移动端编辑用户,id: " +jsonObject.getString("id") ,CommonConstant.LOG_TYPE_2, 2); + String realname=jsonObject.getString("realname"); + String avatar=jsonObject.getString("avatar"); + String sex=jsonObject.getString("sex"); + String phone=jsonObject.getString("phone"); + String email=jsonObject.getString("email"); + Date birthday=jsonObject.getDate("birthday"); + SysUser userPhone = sysUserService.getUserByPhone(phone); + if(sysUser==null) { + result.error500("未找到对应用户!"); + }else { + if(userPhone!=null){ + String userPhonename = userPhone.getUsername(); + if(!userPhonename.equals(username)){ + result.error500("手机号已存在!"); + return result; + } + } + if(StringUtils.isNotBlank(realname)){ + sysUser.setRealname(realname); + } + if(StringUtils.isNotBlank(avatar)){ + sysUser.setAvatar(avatar); + } + if(StringUtils.isNotBlank(sex)){ + sysUser.setSex(Integer.parseInt(sex)); + } + if(StringUtils.isNotBlank(phone)){ + sysUser.setPhone(phone); + } + if(StringUtils.isNotBlank(email)){ + sysUser.setEmail(email); + } + if(null != birthday){ + sysUser.setBirthday(birthday); + } + sysUser.setUpdateTime(new Date()); + sysUserService.updateById(sysUser); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败!"); + } + return result; + } + /** + * 移动端保存设备信息 + * @param clientId + * @return + */ + @RequestMapping(value = "/saveClientId", method = RequestMethod.GET) + public Result saveClientId(HttpServletRequest request,@RequestParam("clientId")String clientId) { + Result result = new Result(); + try { + String username = JwtUtil.getUserNameByToken(request); + SysUser sysUser = sysUserService.getUserByName(username); + if(sysUser==null) { + result.error500("未找到对应用户!"); + }else { + sysUser.setClientId(clientId); + sysUserService.updateById(sysUser); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("操作失败!"); + } + return result; + } + /** + * 根据userid获取用户信息和部门员工信息 + * + * @return Result + */ + @RequiresPermissions("sys:user:list") + @GetMapping("/queryChildrenByUsername") + public Result queryChildrenByUsername(@RequestParam("userId") String userId) { + //获取用户信息 + Map map=new HashMap(); + SysUser sysUser = sysUserService.getById(userId); + String username = sysUser.getUsername(); + Integer identity = sysUser.getUserIdentity(); + map.put("sysUser",sysUser); + if(identity!=null && identity==2){ + //获取部门用户信息 + String departIds = sysUser.getDepartIds(); + if(StringUtils.isNotBlank(departIds)){ + List departIdList = Arrays.asList(departIds.split(",")); + List childrenUser = sysUserService.queryByDepIds(departIdList,username); + map.put("children",childrenUser); + } + } + return Result.OK(map); + } + /** + * 移动端查询部门用户信息 + * @param departId + * @return + */ + @GetMapping("/appQueryByDepartId") + public Result> appQueryByDepartId(@RequestParam(name="departId", required = false) String departId) { + Result> result = new Result>(); + List list=new ArrayList (); + list.add(departId); + List childrenUser = sysUserService.queryByDepIds(list,null); + result.setResult(childrenUser); + return result; + } + /** + * 移动端查询用户信息(通过用户名模糊查询) + * @param keyword + * @return + */ + @GetMapping("/appQueryUser") + public Result> appQueryUser(@RequestParam(name = "keyword", required = false) String keyword) { + Result> result = new Result>(); + LambdaQueryWrapper queryWrapper =new LambdaQueryWrapper(); + //TODO 外部模拟登陆临时账号,列表不显示 + queryWrapper.ne(SysUser::getUsername,"_reserve_user_external"); + if(StringUtils.isNotBlank(keyword)){ + queryWrapper.and(i -> i.like(SysUser::getUsername, keyword).or().like(SysUser::getRealname, keyword)); + } + List list = sysUserService.list(queryWrapper); + //批量查询用户的所属部门 + //step.1 先拿到全部的 useids + //step.2 通过 useids,一次性查询用户的所属部门名字 + List userIds = list.stream().map(SysUser::getId).collect(Collectors.toList()); + if(userIds!=null && userIds.size()>0){ + Map useDepNames = sysUserService.getDepNamesByUserIds(userIds); + list.forEach(item->{ + item.setOrgCodeTxt(useDepNames.get(item.getId())); + }); + } + result.setResult(list); + return result; + } + + /** + * 根据用户名修改手机号 + * @param json + * @return + */ + @RequestMapping(value = "/updateMobile", method = RequestMethod.PUT) + public Result changMobile(@RequestBody JSONObject json,HttpServletRequest request) { + String smscode = json.getString("smscode"); + String phone = json.getString("phone"); + Result result = new Result(); + //获取登录用户名 + String username = JwtUtil.getUserNameByToken(request); + if(oConvertUtils.isEmpty(username) || oConvertUtils.isEmpty(smscode) || oConvertUtils.isEmpty(phone)) { + result.setMessage("修改手机号失败!"); + result.setSuccess(false); + return result; + } + Object object= redisUtil.get(phone); + if(null==object) { + result.setMessage("短信验证码失效!"); + result.setSuccess(false); + return result; + } + if(!smscode.equals(object)) { + result.setMessage("短信验证码不匹配!"); + result.setSuccess(false); + return result; + } + SysUser user = sysUserService.getUserByName(username); + if(user==null) { + return Result.error("用户不存在!"); + } + user.setPhone(phone); + sysUserService.updateById(user); + return Result.OK("手机号设置成功!"); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/ThirdLoginController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/ThirdLoginController.java new file mode 100644 index 00000000..52172d93 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/ThirdLoginController.java @@ -0,0 +1,280 @@ +package com.jero.modules.system.controller; + +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.xkcoding.justauth.AuthRequestFactory; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.util.*; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.system.vo.LoginUser; +import com.jero.modules.system.entity.SysThirdAccount; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.model.ThirdLoginModel; +import com.jero.modules.system.service.ISysThirdAccountService; +import com.jero.modules.system.service.ISysUserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Date; +import java.util.List; + +/** + * @Author scott + * @since 2018-12-17 + */ +@Controller +@RequestMapping("/sys/thirdLogin") +@Slf4j +public class ThirdLoginController { + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysThirdAccountService sysThirdAccountService; + + @Autowired + private BaseCommonService baseCommonService; + @Autowired + private RedisUtil redisUtil; + @Autowired + private AuthRequestFactory factory; + + @RequestMapping("/render/{source}") + public void render(@PathVariable("source") String source, HttpServletResponse response) throws IOException { + log.info("第三方登录进入render:" + source); + AuthRequest authRequest = factory.get(source); + String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); + log.info("第三方登录认证地址:" + authorizeUrl); + response.sendRedirect(authorizeUrl); + } + + @RequestMapping("/{source}/callback") + public String loginThird(@PathVariable("source") String source, AuthCallback callback,ModelMap modelMap) { + log.info("第三方登录进入callback:" + source + " params:" + JSONObject.toJSONString(callback)); + AuthRequest authRequest = factory.get(source); + AuthResponse response = authRequest.login(callback); + log.info(JSONObject.toJSONString(response)); + Result result = new Result(); + if(response.getCode()==2000) { + + JSONObject data = JSONObject.parseObject(JSONObject.toJSONString(response.getData())); + String username = data.getString("username"); + String avatar = data.getString("avatar"); + String uuid = data.getString("uuid"); + //构造第三方登录信息存储对象 + ThirdLoginModel tlm = new ThirdLoginModel(source, uuid, username, avatar); + //判断有没有这个人 + //update-begin-author:wangshuai date:20201118 for:修改成查询第三方账户表 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysThirdAccount::getThirdUserUuid, uuid); + query.eq(SysThirdAccount::getThirdType, source); + List thridList = sysThirdAccountService.list(query); + SysThirdAccount user = null; + if(thridList==null || thridList.size()==0) { + //否则直接创建新账号 + user = saveThirdUser(tlm); + }else { + //已存在 只设置用户名 不设置头像 + user = thridList.get(0); + } + // 生成token + //update-begin-author:wangshuai date:20201118 for:从第三方登录查询是否存在用户id,不存在绑定手机号 + if(oConvertUtils.isNotEmpty(user.getSysUserId())) { + String sysUserId = user.getSysUserId(); + SysUser sysUser = sysUserService.getById(sysUserId); + String token = saveToken(sysUser); + modelMap.addAttribute("token", token); + }else{ + modelMap.addAttribute("token", "绑定手机号,"+""+uuid); + } + //update-end-author:wangshuai date:20201118 for:从第三方登录查询是否存在用户id,不存在绑定手机号 + //update-begin--Author:wangshuai Date:20200729 for:接口在签名校验失败时返回失败的标识码 issues#1441-------------------- + }else{ + modelMap.addAttribute("token", "登录失败"); + } + //update-end--Author:wangshuai Date:20200729 for:接口在签名校验失败时返回失败的标识码 issues#1441-------------------- + result.setSuccess(false); + result.setMessage("第三方登录异常,请联系管理员"); + return "thirdLogin"; + } + + /** + * 创建新账号 + * @param model + * @return + */ + @PostMapping("/user/create") + @ResponseBody + public Result thirdUserCreate(@RequestBody ThirdLoginModel model) { + log.info("第三方登录创建新账号:" ); + Result res = new Result<>(); + Object operateCode = redisUtil.get(CommonConstant.THIRD_LOGIN_CODE); + if(operateCode==null || !operateCode.toString().equals(model.getOperateCode())){ + res.setSuccess(false); + res.setMessage("校验失败"); + return res; + } + //创建新账号 + //update-begin-author:wangshuai date:20201118 for:修改成从第三方登录查出来的user_id,在查询用户表尽行token + SysThirdAccount user = saveThirdUser(model); + if(oConvertUtils.isNotEmpty(user.getSysUserId())){ + String sysUserId = user.getSysUserId(); + SysUser sysUser = sysUserService.getById(sysUserId); + // 生成token + String token = saveToken(sysUser); + //update-end-author:wangshuai date:20201118 for:修改成从第三方登录查出来的user_id,在查询用户表尽行token + res.setResult(token); + res.setSuccess(true); + } + return res; + } + + /** + * 绑定账号 需要设置密码 需要走一遍校验 + * @param json + * @return + */ + @PostMapping("/user/checkPassword") + @ResponseBody + public Result checkPassword(@RequestBody JSONObject json) { + Result result = new Result<>(); + Object operateCode = redisUtil.get(CommonConstant.THIRD_LOGIN_CODE); + if(operateCode==null || !operateCode.toString().equals(json.getString("operateCode"))){ + result.setSuccess(false); + result.setMessage("校验失败"); + return result; + } + String username = json.getString("uuid"); + SysUser user = this.sysUserService.getUserByName(username); + if(user==null){ + result.setMessage("用户未找到"); + result.setSuccess(false); + return result; + } + String password = json.getString("password"); + String salt = user.getSalt(); + String passwordEncode = PasswordUtil.encrypt(user.getUsername(), password, salt); + if(!passwordEncode.equals(user.getPassword())){ + result.setMessage("密码不正确"); + result.setSuccess(false); + return result; + } + + sysUserService.updateById(user); + result.setSuccess(true); + // 生成token + String token = saveToken(user); + result.setResult(token); + return result; + } + + /** + * 创建新用户 + * @param tlm 第三方登录信息 + */ + private SysThirdAccount saveThirdUser(ThirdLoginModel tlm){ + SysThirdAccount user = new SysThirdAccount(); + user.setDelFlag(CommonConstant.DEL_FLAG_0); + user.setStatus(1); + user.setThirdType(tlm.getSource()); + user.setAvatar(tlm.getAvatar()); + user.setRealname(tlm.getUsername()); + user.setThirdUserUuid(tlm.getUuid()); + sysThirdAccountService.save(user); + return user; + } + + private String saveToken(SysUser user) { + // 生成token + String token = JwtUtil.sign(user.getUsername(), user.getPassword()); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + // 设置超时时间 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000); + return token; + } + + @SuppressWarnings("unchecked") + @RequestMapping(value = "/getLoginUser/{token}/{thirdType}", method = RequestMethod.GET) + @ResponseBody + public Result getThirdLoginUser(@PathVariable("token") String token,@PathVariable("thirdType") String thirdType) throws Exception { + Result result = new Result(); + String username = JwtUtil.getUsername(token); + + //1. 校验用户是否有效 + SysUser sysUser = sysUserService.getUserByName(username); + result = sysUserService.checkUserIsEffective(sysUser); + if(!result.isSuccess()) { + return result; + } + //update-begin-author:wangshuai date:20201118 for:如果真实姓名和头像不存在就取第三方登录的 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysThirdAccount::getSysUserId,sysUser.getId()); + query.eq(SysThirdAccount::getThirdType,thirdType); + SysThirdAccount account = sysThirdAccountService.getOne(query); + if(oConvertUtils.isEmpty(sysUser.getRealname())){ + sysUser.setRealname(account.getRealname()); + } + if(oConvertUtils.isEmpty(sysUser.getAvatar())){ + sysUser.setAvatar(account.getAvatar()); + } + //update-end-author:wangshuai date:20201118 for:如果真实姓名和头像不存在就取第三方登录的 + JSONObject obj = new JSONObject(); + //用户登录信息 + obj.put("userInfo", sysUser); + //token 信息 + obj.put("token", token); + result.setResult(obj); + result.setSuccess(true); + result.setCode(200); + baseCommonService.addLog("用户名: " + username + ",登录成功[第三方用户]!", CommonConstant.LOG_TYPE_1, null); + return result; + } + /** + * 第三方绑定手机号返回token + * + * @param jsonObject + * @return + */ + @ApiOperation("手机号登录接口") + @PostMapping("/bindingThirdPhone") + @ResponseBody + public Result bindingThirdPhone(@RequestBody JSONObject jsonObject) { + Result result = new Result(); + String phone = jsonObject.getString("mobile"); + String thirdUserUuid = jsonObject.getString("thirdUserUuid"); + //校验用户有效性 + SysUser sysUser = sysUserService.getUserByPhone(phone); + if(sysUser != null){ + sysThirdAccountService.updateThirdUserId(sysUser,thirdUserUuid); + }else{ + // 不存在手机号,创建用户 + String smscode = jsonObject.getString("captcha"); + Object code = redisUtil.get(phone); + if (!smscode.equals(code)) { + result.setMessage("手机验证码错误"); + result.setSuccess(false); + return result; + } + //创建用户 + sysUser = sysThirdAccountService.createUser(phone,thirdUserUuid); + } + String token = saveToken(sysUser); + result.setSuccess(true); + result.setResult(token); + return result; + } +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncement.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncement.java new file mode 100644 index 00000000..01642f1e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncement.java @@ -0,0 +1,147 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 系统通告表 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +@Data +@TableName("sys_announcement") +public class SysAnnouncement implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /** + * 标题 + */ + @Excel(name = "标题", width = 15) + private java.lang.String titile; + /** + * 内容 + */ + @Excel(name = "内容", width = 30) + private java.lang.String msgContent; + /** + * 开始时间 + */ + @Excel(name = "开始时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date startTime; + /** + * 结束时间 + */ + @Excel(name = "结束时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date endTime; + /** + * 发布人 + */ + @Excel(name = "发布人", width = 15) + private java.lang.String sender; + /** + * 优先级(L低,M中,H高) + */ + @Excel(name = "优先级", width = 15, dicCode = "priority") + @Dict(dicCode = "priority") + private java.lang.String priority; + + /** + * 消息类型1:通知公告2:系统消息 + */ + @Excel(name = "消息类型", width = 15, dicCode = "msg_category") + @Dict(dicCode = "msg_category") + private java.lang.String msgCategory; + /** + * 通告对象类型(USER:指定用户,ALL:全体用户) + */ + @Excel(name = "通告对象类型", width = 15, dicCode = "msg_type") + @Dict(dicCode = "msg_type") + private java.lang.String msgType; + /** + * 发布状态(0未发布,1已发布,2已撤销) + */ + @Excel(name = "发布状态", width = 15, dicCode = "send_status") + @Dict(dicCode = "send_status") + private java.lang.String sendStatus; + /** + * 发布时间 + */ + @Excel(name = "发布时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date sendTime; + /** + * 撤销时间 + */ + @Excel(name = "撤销时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date cancelTime; + /** + * 删除状态(0,正常,1已删除) + */ + private java.lang.String delFlag; + /** + * 创建人 + */ + private java.lang.String createBy; + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /** + * 更新人 + */ + private java.lang.String updateBy; + /** + * 更新时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /** + * 指定用户 + **/ + private java.lang.String userIds; + /** + * 业务类型(email:邮件 bpm:流程) + */ + private java.lang.String busType; + /** + * 业务id + */ + private java.lang.String busId; + /** + * 打开方式 组件:component 路由:url + */ + private java.lang.String openType; + /** + * 组件/路由 地址 + */ + private java.lang.String openPage; + /** + * 摘要 + */ + private java.lang.String msgAbstract; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncementSend.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncementSend.java new file mode 100644 index 00000000..36c32a32 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysAnnouncementSend.java @@ -0,0 +1,48 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 用户通告阅读标记表 + * @Author: jero-boot + * @Date: 2019-02-21 + * @Version: V1.0 + */ +@Data +@TableName("sys_announcement_send") +public class SysAnnouncementSend implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /**通告id*/ + private java.lang.String anntId; + /**用户id*/ + private java.lang.String userId; + /**阅读状态(0未读,1已读)*/ + private java.lang.String readFlag; + /**阅读时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date readTime; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**更新人*/ + private java.lang.String updateBy; + /**更新时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCategory.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCategory.java new file mode 100644 index 00000000..158a7996 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCategory.java @@ -0,0 +1,66 @@ +package com.jero.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; + +/** + * @Description: 分类字典 + * @Author: jero-boot + * @Date: 2019-05-29 + * @Version: V1.0 + */ +@Data +@TableName("sys_category") +public class SysCategory implements Serializable,Comparable{ + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /**父级节点*/ + private java.lang.String pid; + /**类型名称*/ + @Excel(name = "类型名称", width = 15) + private java.lang.String name; + /**类型编码*/ + @Excel(name = "类型编码", width = 15) + private java.lang.String code; + /**创建人*/ + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**更新人*/ + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /**所属部门*/ + private java.lang.String sysOrgCode; + /**是否有子节点*/ + @Excel(name = "是否有子节点(1:有)", width = 15) + private java.lang.String hasChild; + + @Override + public int compareTo(SysCategory o) { + //比较条件我们定的是按照code的长度升序 + // <0:当前对象比传入对象小。 + // =0:当前对象等于传入对象。 + // >0:当前对象比传入对象大。 + int s = this.code.length() - o.code.length(); + return s; + } + @Override + public String toString() { + return "SysCategory [code=" + code + ", name=" + name + "]"; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCheckRule.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCheckRule.java new file mode 100644 index 00000000..c6310da7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysCheckRule.java @@ -0,0 +1,88 @@ +package com.jero.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @Description: 编码校验规则 + * @Author: jero-boot + * @Date: 2020-02-04 + * @Version: V1.0 + */ +@Data +@TableName("sys_check_rule") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "sys_check_rule对象", description = "编码校验规则") +public class SysCheckRule { + + /** + * 主键id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键id") + private String id; + /** + * 规则名称 + */ + @Excel(name = "规则名称", width = 15) + @ApiModelProperty(value = "规则名称") + private String ruleName; + /** + * 规则Code + */ + @Excel(name = "规则Code", width = 15) + @ApiModelProperty(value = "规则Code") + private String ruleCode; + /** + * 规则JSON + */ + @Excel(name = "规则JSON", width = 15) + @ApiModelProperty(value = "规则JSON") + private String ruleJson; + /** + * 规则描述 + */ + @Excel(name = "规则描述", width = 15) + @ApiModelProperty(value = "规则描述") + private String ruleDescription; + /** + * 更新人 + */ + @Excel(name = "更新人", width = 15) + @ApiModelProperty(value = "更新人") + private String updateBy; + /** + * 更新时间 + */ + @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private Date updateTime; + /** + * 创建人 + */ + @Excel(name = "创建人", width = 15) + @ApiModelProperty(value = "创建人") + private String createBy; + /** + * 创建时间 + */ + @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysConfusion.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysConfusion.java new file mode 100644 index 00000000..513aff3d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysConfusion.java @@ -0,0 +1,105 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import com.jero.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + + +/** + * @Description: 混淆表 + * @Author: jero-boot + * @Date: 2021-08-05 + * @Version: V1.0 + */ +@Data +@TableName("sys_confusion") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "sys_confusion对象", description = "混淆表") +public class SysConfusion implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private String id; + + /** + * 创建人 + */ + + @ApiModelProperty(value = "创建人") + private String createBy; + + /** + * 创建日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private LocalDateTime createTime; + + /** + * 更新人 + */ + + @ApiModelProperty(value = "更新人") + private String updateBy; + + /** + * 更新日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private LocalDateTime updateTime; + + /** + * 所属部门 + */ + + @ApiModelProperty(value = "所属部门") + private String sysOrgCode; + + /** + * 混淆类型 + */ + @Excel(name = "表名", width = 15) + @ApiModelProperty(value = "表名") + private String tableName; + + /** + * 表名或字段名 + */ + @Excel(name = "字段名", width = 15) + @ApiModelProperty(value = "字段名") + private String fieldName; + + /** + * 混淆code + */ + @Excel(name = "混淆code", width = 15) + @ApiModelProperty(value = "混淆code") + private String confusionCode; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataLog.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataLog.java new file mode 100644 index 00000000..fefeb24c --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataLog.java @@ -0,0 +1,36 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDataLog implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private String id; //id' + private String createBy; //创建人登录名称 + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; //创建日期 + private String updateBy; //更新人登录名称 + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; //更新日期 + private String dataTable; //表名 + private String dataId; //数据ID + private String dataContent; //数据内容 + private String dataVersion; //版本号 +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataSource.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataSource.java new file mode 100644 index 00000000..3c3c1442 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDataSource.java @@ -0,0 +1,120 @@ +package com.jero.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 多数据源管理 + * @Author: jero-boot + * @Date: 2019-12-25 + * @Version: V1.0 + */ +@Data +@TableName("sys_data_source") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "sys_data_source对象", description = "多数据源管理") +public class SysDataSource { + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /** + * 数据源编码 + */ + @Excel(name = "数据源编码", width = 15) + @ApiModelProperty(value = "数据源编码") + private java.lang.String code; + /** + * 数据源名称 + */ + @Excel(name = "数据源名称", width = 15) + @ApiModelProperty(value = "数据源名称") + private java.lang.String name; + /** + * 描述 + */ + @Excel(name = "备注", width = 15) + @ApiModelProperty(value = "备注") + private java.lang.String remark; + /** + * 数据库类型 + */ + @Dict(dicCode = "database_type") + @Excel(name = "数据库类型", width = 15, dicCode = "database_type") + @ApiModelProperty(value = "数据库类型") + private java.lang.String dbType; + /** + * 驱动类 + */ + @Excel(name = "驱动类", width = 15) + @ApiModelProperty(value = "驱动类") + private java.lang.String dbDriver; + /** + * 数据源地址 + */ + @Excel(name = "数据源地址", width = 15) + @ApiModelProperty(value = "数据源地址") + private java.lang.String dbUrl; + /** + * 数据库名称 + */ + @Excel(name = "数据库名称", width = 15) + @ApiModelProperty(value = "数据库名称") + private java.lang.String dbName; + /** + * 用户名 + */ + @Excel(name = "用户名", width = 15) + @ApiModelProperty(value = "用户名") + private java.lang.String dbUsername; + /** + * 密码 + */ + @Excel(name = "密码", width = 15) + @ApiModelProperty(value = "密码") + private java.lang.String dbPassword; + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + private java.lang.String createBy; + /** + * 创建日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private java.util.Date createTime; + /** + * 更新人 + */ + @ApiModelProperty(value = "更新人") + private java.lang.String updateBy; + /** + * 更新日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private java.util.Date updateTime; + /** + * 所属部门 + */ + @Excel(name = "所属部门", width = 15) + @ApiModelProperty(value = "所属部门") + private java.lang.String sysOrgCode; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepart.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepart.java new file mode 100644 index 00000000..62cc6b75 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepart.java @@ -0,0 +1,135 @@ +package com.jero.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; + +/** + *

+ * 部门表 + *

+ * + * @Author Steve + * @Since 2019-01-22 + */ +@Data +@TableName("sys_depart") +public class SysDepart implements Serializable { + private static final long serialVersionUID = 1L; + + /**ID*/ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /**父机构ID*/ + private String parentId; + /**机构/部门名称*/ + @Excel(name="机构/部门名称",width=15) + private String departName; + /**英文名*/ + @Excel(name="英文名",width=15) + private String departNameEn; + /**缩写*/ + private String departNameAbbr; + /**排序*/ + @Excel(name="排序",width=15) + private Integer departOrder; + /**描述*/ + @Excel(name="描述",width=15) + private String description; + /**机构类别 1公司,2组织机构,2岗位*/ + @Excel(name="机构类别",width=15,dicCode="org_category") + private String orgCategory; + /**机构类型*/ + private String orgType; + /**机构编码*/ + @Excel(name="机构编码",width=15) + private String orgCode; + /**手机号*/ + @Excel(name="手机号",width=15) + private String mobile; + /**传真*/ + @Excel(name="传真",width=15) + private String fax; + /**地址*/ + @Excel(name="地址",width=15) + private String address; + /**备注*/ + @Excel(name="备注",width=15) + private String memo; + /**状态(1启用,0不启用)*/ + @Dict(dicCode = "depart_status") + private String status; + /**删除状态(0,正常,1已删除)*/ + @Dict(dicCode = "del_flag") + private String delFlag; + /**创建人*/ + private String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + /**更新人*/ + private String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 重写equals方法 + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + SysDepart depart = (SysDepart) o; + return Objects.equals(id, depart.id) && + Objects.equals(parentId, depart.parentId) && + Objects.equals(departName, depart.departName) && + Objects.equals(departNameEn, depart.departNameEn) && + Objects.equals(departNameAbbr, depart.departNameAbbr) && + Objects.equals(departOrder, depart.departOrder) && + Objects.equals(description, depart.description) && + Objects.equals(orgCategory, depart.orgCategory) && + Objects.equals(orgType, depart.orgType) && + Objects.equals(orgCode, depart.orgCode) && + Objects.equals(mobile, depart.mobile) && + Objects.equals(fax, depart.fax) && + Objects.equals(address, depart.address) && + Objects.equals(memo, depart.memo) && + Objects.equals(status, depart.status) && + Objects.equals(delFlag, depart.delFlag) && + Objects.equals(createBy, depart.createBy) && + Objects.equals(createTime, depart.createTime) && + Objects.equals(updateBy, depart.updateBy) && + Objects.equals(updateTime, depart.updateTime); + } + + /** + * 重写hashCode方法 + */ + @Override + public int hashCode() { + + return Objects.hash(super.hashCode(), id, parentId, departName, + departNameEn, departNameAbbr, departOrder, description,orgCategory, + orgType, orgCode, mobile, fax, address, memo, status, + delFlag, createBy, createTime, updateBy, updateTime); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartPermission.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartPermission.java new file mode 100644 index 00000000..d89cce0f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartPermission.java @@ -0,0 +1,55 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 部门权限表 + * @Author: jero-boot + * @Date: 2020-02-11 + * @Version: V1.0 + */ +@Data +@TableName("sys_depart_permission") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_depart_permission对象", description="部门权限表") +public class SysDepartPermission { + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**部门id*/ + @Excel(name = "部门id", width = 15) + @ApiModelProperty(value = "部门id") + private java.lang.String departId; + /**权限id*/ + @Excel(name = "权限id", width = 15) + @ApiModelProperty(value = "权限id") + private java.lang.String permissionId; + /**数据规则id*/ + @ApiModelProperty(value = "数据规则id") + private java.lang.String dataRuleIds; + + public SysDepartPermission() { + + } + + public SysDepartPermission(String departId, String permissionId) { + this.departId = departId; + this.permissionId = permissionId; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRole.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRole.java new file mode 100644 index 00000000..51f23ae1 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRole.java @@ -0,0 +1,75 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jero.common.aspect.annotation.Dict; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 部门角色 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +@Data +@TableName("sys_depart_role") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_depart_role对象", description="部门角色") +public class SysDepartRole { + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**部门id*/ + @Excel(name = "部门id", width = 15) + @ApiModelProperty(value = "部门id") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private java.lang.String departId; + /**部门角色名称*/ + @Excel(name = "部门角色名称", width = 15) + @ApiModelProperty(value = "部门角色名称") + private java.lang.String roleName; + /**部门角色编码*/ + @Excel(name = "部门角色编码", width = 15) + @ApiModelProperty(value = "部门角色编码") + private java.lang.String roleCode; + /**描述*/ + @Excel(name = "描述", width = 15) + @ApiModelProperty(value = "描述") + private java.lang.String description; + /**创建人*/ + @Excel(name = "创建人", width = 15) + @ApiModelProperty(value = "创建人") + private java.lang.String createBy; + /**创建时间*/ + @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private java.util.Date createTime; + /**更新人*/ + @Excel(name = "更新人", width = 15) + @ApiModelProperty(value = "更新人") + private java.lang.String updateBy; + /**更新时间*/ + @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private java.util.Date updateTime; + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRolePermission.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRolePermission.java new file mode 100644 index 00000000..80e6aeb7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRolePermission.java @@ -0,0 +1,67 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 部门角色权限 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +@Data +@TableName("sys_depart_role_permission") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_depart_role_permission对象", description="部门角色权限") +public class SysDepartRolePermission { + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**部门id*/ + @Excel(name = "部门id", width = 15) + @ApiModelProperty(value = "部门id") + private java.lang.String departId; + /**角色id*/ + @Excel(name = "角色id", width = 15) + @ApiModelProperty(value = "角色id") + private java.lang.String roleId; + /**权限id*/ + @Excel(name = "权限id", width = 15) + @ApiModelProperty(value = "权限id") + private java.lang.String permissionId; + /**dataRuleIds*/ + @Excel(name = "dataRuleIds", width = 15) + @ApiModelProperty(value = "dataRuleIds") + private java.lang.String dataRuleIds; + /** 操作时间 */ + @Excel(name = "操作时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "操作时间") + private java.util.Date operateDate; + /** 操作ip */ + private java.lang.String operateIp; + + public SysDepartRolePermission() { + } + + public SysDepartRolePermission(String roleId, String permissionId) { + this.roleId = roleId; + this.permissionId = permissionId; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRoleUser.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRoleUser.java new file mode 100644 index 00000000..7a5b2985 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDepartRoleUser.java @@ -0,0 +1,52 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 部门角色人员信息 + * @Author: jero-boot + * @Date: 2020-02-13 + * @Version: V1.0 + */ +@Data +@TableName("sys_depart_role_user") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_depart_role_user对象", description="部门角色人员信息") +public class SysDepartRoleUser { + + /**主键id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键id") + private java.lang.String id; + /**用户id*/ + @Excel(name = "用户id", width = 15) + @ApiModelProperty(value = "用户id") + private java.lang.String userId; + /**角色id*/ + @Excel(name = "角色id", width = 15) + @ApiModelProperty(value = "角色id") + private java.lang.String droleId; + + public SysDepartRoleUser() { + + } + + public SysDepartRoleUser(String userId, String droleId) { + this.userId = userId; + this.droleId = droleId; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDict.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDict.java new file mode 100644 index 00000000..69d2c171 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDict.java @@ -0,0 +1,85 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 字典表 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDict implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * [预留字段,暂时无用] + * 字典类型,0 string,1 number类型,2 boolean + * 前端js对stirng类型和number类型 boolean 类型敏感,需要区分。在select 标签匹配的时候会用到 + * 默认为string类型 + */ + private Integer type; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典编码 + */ + private String dictCode; + + /** + * 描述 + */ + private String description; + + /** + * 删除状态 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java new file mode 100644 index 00000000..036dd0e1 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java @@ -0,0 +1,82 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + *

+ * + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDictItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 字典id + */ + private String dictId; + + /** + * 字典项文本 + */ + @Excel(name = "字典项文本", width = 20) + private String itemText; + + /** + * 字典项值 + */ + @Excel(name = "字典项值", width = 30) + private String itemValue; + + /** + * 描述 + */ + @Excel(name = "描述", width = 40) + private String description; + + /** + * 排序 + */ + @Excel(name = "排序", width = 15,type=4) + private Integer sortOrder; + + + /** + * 状态(1启用 0不启用) + */ + @Dict(dicCode = "dict_item_status") + private Integer status; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysFillRule.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysFillRule.java new file mode 100644 index 00000000..3fb90886 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysFillRule.java @@ -0,0 +1,86 @@ +package com.jero.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 填值规则 + * @Author: jero-boot + * @Date: 2019-11-07 + * @Version: V1.0 + */ +@Data +@TableName("sys_fill_rule") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "sys_fill_rule对象", description = "填值规则") +public class SysFillRule { + + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键ID") + private java.lang.String id; + /** + * 规则名称 + */ + @Excel(name = "规则名称", width = 15) + @ApiModelProperty(value = "规则名称") + private java.lang.String ruleName; + /** + * 规则Code + */ + @Excel(name = "规则Code", width = 15) + @ApiModelProperty(value = "规则Code") + private java.lang.String ruleCode; + /** + * 规则实现类 + */ + @Excel(name = "规则实现类", width = 15) + @ApiModelProperty(value = "规则实现类") + private java.lang.String ruleClass; + /** + * 规则参数 + */ + @Excel(name = "规则参数", width = 15) + @ApiModelProperty(value = "规则参数") + private java.lang.String ruleParams; + /** + * 修改人 + */ + @Excel(name = "修改人", width = 15) + @ApiModelProperty(value = "修改人") + private java.lang.String updateBy; + /** + * 修改时间 + */ + @Excel(name = "修改时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "修改时间") + private java.util.Date updateTime; + /** + * 创建人 + */ + @Excel(name = "创建人", width = 15) + @ApiModelProperty(value = "创建人") + private java.lang.String createBy; + /** + * 创建时间 + */ + @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private java.util.Date createTime; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysGatewayRoute.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysGatewayRoute.java new file mode 100644 index 00000000..4c7b2d26 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysGatewayRoute.java @@ -0,0 +1,111 @@ +package com.jero.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: gateway路由管理 + * @Author: jero-boot + * @Date: 2020-05-26 + * @Version: V1.0 + */ +@Data +@TableName("sys_gateway_route") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="sys_gateway_route对象", description="gateway路由管理") +public class SysGatewayRoute implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private String id; + + /**routerKEy*/ + @ApiModelProperty(value = "路由ID") + private String routerId; + + /**服务名*/ + @Excel(name = "服务名", width = 15) + @ApiModelProperty(value = "服务名") + private String name; + + /**服务地址*/ + @Excel(name = "服务地址", width = 15) + @ApiModelProperty(value = "服务地址") + private String uri; + + /** + * 断言配置 + */ + private String predicates; + + /** + * 过滤配置 + */ + private String filters; + + /**是否忽略前缀0-否 1-是*/ + @Excel(name = "忽略前缀", width = 15) + @ApiModelProperty(value = "忽略前缀") + @Dict(dicCode = "yn") + private Integer stripPrefix; + + /**是否重试0-否 1-是*/ + @Excel(name = "是否重试", width = 15) + @ApiModelProperty(value = "是否重试") + @Dict(dicCode = "yn") + private Integer retryable; + + /**是否为保留数据:0-否 1-是*/ + @Excel(name = "保留数据", width = 15) + @ApiModelProperty(value = "保留数据") + @Dict(dicCode = "yn") + private Integer persistable; + + /**是否在接口文档中展示:0-否 1-是*/ + @Excel(name = "在接口文档中展示", width = 15) + @ApiModelProperty(value = "在接口文档中展示") + @Dict(dicCode = "yn") + private Integer showApi; + + /**状态 1有效 0无效*/ + @Excel(name = "状态", width = 15) + @ApiModelProperty(value = "状态") + @Dict(dicCode = "yn") + private Integer status; + + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private Date createTime; + /* *//**更新人*//* + @ApiModelProperty(value = "更新人") + private String updateBy; + *//**更新日期*//* + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private Date updateTime; + *//**所属部门*//* + @ApiModelProperty(value = "所属部门") + private String sysOrgCode;*/ +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysLog.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysLog.java new file mode 100644 index 00000000..2e84df48 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysLog.java @@ -0,0 +1,112 @@ +package com.jero.modules.system.entity; + +import java.util.Date; + +import com.jero.common.aspect.annotation.Dict; +import org.springframework.format.annotation.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 系统日志表 + *

+ * + * @Author zhangweijian + * @since 2018-12-26 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 耗时 + */ + private Long costTime; + + /** + * IP + */ + private String ip; + + /** + * 请求参数 + */ + private String requestParam; + + /** + * 请求类型 + */ + private String requestType; + + /** + * 请求路径 + */ + private String requestUrl; + /** + * 请求方法 + */ + private String method; + + /** + * 操作人用户名称 + */ + private String username; + /** + * 操作人用户账户 + */ + private String userid; + /** + * 操作详细日志 + */ + private String logContent; + + /** + * 日志类型(1登录日志,2操作日志) + */ + @Dict(dicCode = "log_type") + private Integer logType; + + /** + * 操作类型(1查询,2添加,3修改,4删除,5导入,6导出) + */ + @Dict(dicCode = "operate_type") + private Integer operateType; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermission.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermission.java new file mode 100644 index 00000000..460e183e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermission.java @@ -0,0 +1,182 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.jero.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + *

+ * 菜单权限表 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysPermission implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 父id + */ + private String parentId; + + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单权限编码,例如:“sys:schedule:list,sys:schedule:info”,多个逗号隔开 + */ + private String perms; + /** + * 权限策略1显示2禁用 + */ + private String permsType; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 组件 + */ + private String component; + + /** + * 组件名字 + */ + private String componentName; + + /** + * 路径 + */ + private String url; + /** + * 一级菜单跳转地址 + */ + private String redirect; + + /** + * 菜单排序 + */ + private Double sortNo; + + /** + * 类型(0:一级菜单;1:子菜单 ;2:按钮权限) + */ + @Dict(dicCode = "menu_type") + private Integer menuType; + + /** + * 是否叶子节点: 1:是 0:不是 + */ + @TableField(value="is_leaf") + private boolean leaf; + + /** + * 是否路由菜单: 0:不是 1:是(默认值1) + */ + @TableField(value="is_route") + private boolean route; + + + /** + * 是否缓存页面: 0:不是 1:是(默认值1) + */ + @TableField(value="keep_alive") + private boolean keepAlive; + + /** + * 描述 + */ + private String description; + + /** + * 创建人 + */ + private String createBy; + + /** + * 删除状态 0正常 1已删除 + */ + private Integer delFlag; + + /** + * 是否配置菜单的数据权限 1是0否 默认0 + */ + private Integer ruleFlag; + + /** + * 是否隐藏路由菜单: 0否,1是(默认值0) + */ + private boolean hidden; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /**按钮权限状态(0无效1有效)*/ + private java.lang.String status; + + /**alwaysShow*/ + private boolean alwaysShow; + + /*update_begin author:wuxianquan date:20190908 for:实体增加字段 */ + /** 外链菜单打开方式 0/内部打开 1/外部打开 */ + private boolean internalOrExternal; + /*update_end author:wuxianquan date:20190908 for:实体增加字段 */ + + public SysPermission() { + + } + public SysPermission(boolean index) { + if(index) { + this.id = "9502685863ab87f0ad1134142788a385"; + this.name="首页"; + this.component="dashboard/Analysis"; + this.componentName="dashboard-analysis"; + this.url="/dashboard/analysis"; + this.icon="home"; + this.menuType=0; + this.sortNo=0.0; + this.ruleFlag=0; + this.delFlag=0; + this.alwaysShow=false; + this.route=true; + this.keepAlive=true; + this.leaf=true; + this.hidden=false; + } + + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermissionDataRule.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermissionDataRule.java new file mode 100644 index 00000000..f6d16cf7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysPermissionDataRule.java @@ -0,0 +1,83 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 菜单权限规则表 + *

+ * + * @Author huangzhilin + * @since 2019-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysPermissionDataRule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 对应的菜单id + */ + private String permissionId; + + /** + * 规则名称 + */ + private String ruleName; + + /** + * 字段 + */ + private String ruleColumn; + + /** + * 条件 + */ + private String ruleConditions; + + /** + * 规则值 + */ + private String ruleValue; + + /** + * 状态值 1有效 0无效 + */ + private String status; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 修改人 + */ + private String updateBy; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRole.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRole.java new file mode 100644 index 00000000..c5ea1029 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRole.java @@ -0,0 +1,82 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 角色表 + *

+ * + * @Author scott + * @since 2018-12-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysRole implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 角色名称 + */ + @Excel(name="角色名",width=15) + private String roleName; + + /** + * 角色编码 + */ + @Excel(name="角色编码",width=15) + private String roleCode; + + /** + * 描述 + */ + @Excel(name="描述",width=60) + private String description; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRolePermission.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRolePermission.java new file mode 100644 index 00000000..57d32076 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysRolePermission.java @@ -0,0 +1,71 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +/** + *

+ * 角色权限表 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysRolePermission implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 角色id + */ + private String roleId; + + /** + * 权限id + */ + private String permissionId; + + /** + * 数据权限 + */ + private String dataRuleIds; + + /** + * 操作时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date operateDate; + + /** + * 操作ip + */ + private String operateIp; + + public SysRolePermission() { + } + + public SysRolePermission(String roleId, String permissionId) { + this.roleId = roleId; + this.permissionId = permissionId; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysThirdAccount.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysThirdAccount.java new file mode 100644 index 00000000..6c561974 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysThirdAccount.java @@ -0,0 +1,63 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 第三方登录账号表 + * @Author: jero-boot + * @Date: 2020-11-17 + * @Version: V1.0 + */ +@Data +@TableName("sys_third_account") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_third_account对象", description="第三方登录账号表") +public class SysThirdAccount { + + /**编号*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "编号") + private java.lang.String id; + /**第三方登录id*/ + @Excel(name = "第三方登录id", width = 15) + @ApiModelProperty(value = "第三方登录id") + private java.lang.String sysUserId; + /**登录来源*/ + @Excel(name = "登录来源", width = 15) + @ApiModelProperty(value = "登录来源") + private java.lang.String thirdType; + /**头像*/ + @Excel(name = "头像", width = 15) + @ApiModelProperty(value = "头像") + private java.lang.String avatar; + /**状态(1-正常,2-冻结)*/ + @Excel(name = "状态(1-正常,2-冻结)", width = 15) + @ApiModelProperty(value = "状态(1-正常,2-冻结)") + private java.lang.Integer status; + /**删除状态(0-正常,1-已删除)*/ + @Excel(name = "删除状态(0-正常,1-已删除)", width = 15) + @ApiModelProperty(value = "删除状态(0-正常,1-已删除)") + private java.lang.Integer delFlag; + /**真实姓名*/ + @Excel(name = "真实姓名", width = 15) + @ApiModelProperty(value = "真实姓名") + private java.lang.String realname; + /**真实姓名*/ + @Excel(name = "真实姓名", width = 15) + @ApiModelProperty(value = "真实姓名") + private java.lang.String thirdUserUuid; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java new file mode 100644 index 00000000..3dbe88c0 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java @@ -0,0 +1,189 @@ +package com.jero.modules.system.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.jero.common.aspect.annotation.Dict; +import com.jero.modules.system.volid.group.CreateGroup; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + *

+ * 用户表 + *

+ * + * @Author scott + * @since 2018-12-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 登录账号 + */ + @Excel(name = "登录账号", width = 15) + @NotBlank(message = "账号不能为空") + @Size(max = 50,message = "账号最长为50") + private String username; + + /** + * 真实姓名 + */ + @Excel(name = "真实姓名", width = 15) + @NotBlank(message = "姓名不能为空") + @Size(max = 50,message = "姓名最长为50") + private String realname; + + /** + * 密码 + */ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @NotBlank(message = "密码不能为空",groups = CreateGroup.class) + private String password; + + /** + * md5密码盐 + */ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private String salt; + + /** + * 头像 + */ + @Excel(name = "头像", width = 15,type = 2) + private String avatar; + + /** + * 生日 + */ + @Excel(name = "生日", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birthday; + + /** + * 性别(1:男 2:女) + */ + @Excel(name = "性别", width = 15,dicCode="sex") + @Dict(dicCode = "sex") + private Integer sex; + + /** + * 电子邮箱 + */ + @Excel(name = "电子邮箱", width = 15) + @Email(message = "电子邮箱格式不正确") + private String email; + + /** + * 电话 + */ + @Excel(name = "电话", width = 15) + private String phone; + + /** + * 部门code(当前选择登录部门) + */ + private String orgCode; + + /**部门名称*/ + private transient String orgCodeTxt; + + /** + * 状态(1:正常 2:冻结 ) + */ + @Excel(name = "状态", width = 15,dicCode="user_status") + @Dict(dicCode = "user_status") + private Integer status; + + /** + * 删除状态(0,正常,1已删除) + */ + @Excel(name = "删除状态", width = 15,dicCode="del_flag") + @TableLogic + private Integer delFlag; + + /** + * 工号,唯一键 + */ + @Excel(name = "工号", width = 15) + private String workNo; + + /** + * 座机号 + */ + @Excel(name = "座机号", width = 15) + private String telephone; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + /** + * 同步工作流引擎1同步0不同步 + */ + private Integer activitiSync; + + /** + * 身份(0 普通成员 1 上级) + */ + @Excel(name="(1普通成员 2上级)",width = 15) + private Integer userIdentity; + + /** + * 负责部门 + */ + @Excel(name="负责部门",width = 15,dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private String departIds; + + /** + * 多租户id配置,编辑用户的时候设置 + */ + private String relTenantIds; + + /**设备id uniapp推送用*/ + private String clientId; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserAgent.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserAgent.java new file mode 100644 index 00000000..5d1889f9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserAgent.java @@ -0,0 +1,74 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 用户代理人设置 + * @Author: jero-boot + * @Date: 2019-04-17 + * @Version: V1.0 + */ +@Data +@TableName("sys_user_agent") +public class SysUserAgent implements Serializable { + private static final long serialVersionUID = 1L; + + /**序号*/ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /**用户名*/ + @Excel(name = "用户名", width = 15) + private java.lang.String userName; + /**代理人用户名*/ + @Excel(name = "代理人用户名", width = 15) + private java.lang.String agentUserName; + /**代理开始时间*/ + @Excel(name = "代理开始时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date startTime; + /**代理结束时间*/ + @Excel(name = "代理结束时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date endTime; + /**状态0无效1有效*/ + @Excel(name = "状态0无效1有效", width = 15) + private java.lang.String status; + /**创建人名称*/ + @Excel(name = "创建人名称", width = 15) + private java.lang.String createName; + /**创建人登录名称*/ + @Excel(name = "创建人登录名称", width = 15) + private java.lang.String createBy; + /**创建日期*/ + @Excel(name = "创建日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**更新人名称*/ + @Excel(name = "更新人名称", width = 15) + private java.lang.String updateName; + /**更新人登录名称*/ + @Excel(name = "更新人登录名称", width = 15) + private java.lang.String updateBy; + /**更新日期*/ + @Excel(name = "更新日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /**所属部门*/ + @Excel(name = "所属部门", width = 15) + private java.lang.String sysOrgCode; + /**所属公司*/ + @Excel(name = "所属公司", width = 15) + private java.lang.String sysCompanyCode; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserDepart.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserDepart.java new file mode 100644 index 00000000..6ac851a4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserDepart.java @@ -0,0 +1,33 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; +@Data +@TableName("sys_user_depart") +public class SysUserDepart implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键id*/ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /**用户id*/ + private String userId; + /**部门id*/ + private String depId; + public SysUserDepart(String id, String userId, String depId) { + super(); + this.id = id; + this.userId = userId; + this.depId = depId; + } + + public SysUserDepart(String id, String departId) { + this.userId = id; + this.depId = departId; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserRole.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserRole.java new file mode 100644 index 00000000..0108d9d3 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUserRole.java @@ -0,0 +1,50 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 用户角色表 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysUserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 用户id + */ + private String userId; + + /** + * 角色id + */ + private String roleId; + + public SysUserRole() { + } + + public SysUserRole(String userId, String roleId) { + this.userId = userId; + this.roleId = roleId; + } + + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementMapper.java new file mode 100644 index 00000000..1990848b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementMapper.java @@ -0,0 +1,22 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysAnnouncement; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +/** + * @Description: 系统通告表 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +public interface SysAnnouncementMapper extends BaseMapper { + + + List querySysCementListByUserId(Page page, @Param("userId")String userId,@Param("msgCategory")String msgCategory); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementSendMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementSendMapper.java new file mode 100644 index 00000000..bf116af7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysAnnouncementSendMapper.java @@ -0,0 +1,31 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysAnnouncementSend; +import com.jero.modules.system.model.AnnouncementSendModel; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +/** + * @Description: 用户通告阅读标记表 + * @Author: jero-boot + * @Date: 2019-02-21 + * @Version: V1.0 + */ +public interface SysAnnouncementSendMapper extends BaseMapper { + + public List queryByUserId(@Param("userId") String userId); + + /** + * @功能:获取我的消息 + * @param announcementSendModel + * @param pageSize + * @param pageNo + * @return + */ + public List getMyAnnouncementSendList(Page page,@Param("announcementSendModel") AnnouncementSendModel announcementSendModel); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCategoryMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCategoryMapper.java new file mode 100644 index 00000000..594f7af9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCategoryMapper.java @@ -0,0 +1,32 @@ +package com.jero.modules.system.mapper; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import com.jero.modules.system.entity.SysCategory; +import com.jero.modules.system.model.TreeSelectModel; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 分类字典 + * @Author: jero-boot + * @Date: 2019-05-29 + * @Version: V1.0 + */ +public interface SysCategoryMapper extends BaseMapper { + + /** + * 根据父级ID查询树节点数据 + * @param pid + * @return + */ + public List queryListByPid(@Param("pid") String pid,@Param("query") Map query); + + @Select("SELECT ID FROM sys_category WHERE CODE = #{code,jdbcType=VARCHAR}") + public String queryIdByCode(@Param("code") String code); + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCheckRuleMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCheckRuleMapper.java new file mode 100644 index 00000000..c3ad45f9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysCheckRuleMapper.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.system.entity.SysCheckRule; + +/** + * @Description: 编码校验规则 + * @Author: jero-boot + * @Date: 2020-02-04 + * @Version: V1.0 + */ +public interface SysCheckRuleMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysConfusionMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysConfusionMapper.java new file mode 100644 index 00000000..8654beef --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysConfusionMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysConfusion; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 混淆表 + * @Author: jero-boot + * @Date: 2021-08-05 + * @Version: V1.0 + */ +public interface SysConfusionMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataLogMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataLogMapper.java new file mode 100644 index 00000000..adc1824f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataLogMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysDataLog; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SysDataLogMapper extends BaseMapper{ + /** + * 通过表名及数据Id获取最大版本 + * @param tableName + * @param dataId + * @return + */ + public String queryMaxDataVer(@Param("tableName") String tableName,@Param("dataId") String dataId); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataSourceMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataSourceMapper.java new file mode 100644 index 00000000..50d2bbf7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDataSourceMapper.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.system.entity.SysDataSource; + +/** + * @Description: 多数据源管理 + * @Author: jero-boot + * @Date: 2019-12-25 + * @Version: V1.0 + */ +public interface SysDataSourceMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartMapper.java new file mode 100644 index 00000000..1be8f49d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartMapper.java @@ -0,0 +1,53 @@ +package com.jero.modules.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; +import com.jero.modules.system.entity.SysDepart; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +/** + *

+ * 部门 Mapper 接口 + *

+ * + * @Author: Steve + * @Since: 2019-01-22 + */ +public interface SysDepartMapper extends BaseMapper { + + /** + * 根据用户ID查询部门集合 + */ + public List queryUserDeparts(@Param("userId") String userId); + + /** + * 根据用户名查询部门 + * + * @param username + * @return + */ + public List queryDepartsByUsername(@Param("username") String username); + + @Select("select id from sys_depart where org_code=#{orgCode}") + public String queryDepartIdByOrgCode(@Param("orgCode") String orgCode); + + @Select("select id,parent_id from sys_depart where id=#{departId}") + public SysDepart getParentDepartId(@Param("departId") String departId); + + /** + * 根据部门Id查询,当前和下级所有部门IDS + * @param departId + * @return + */ + List getSubDepIdsByDepId(@Param("departId") String departId); + + /** + * 根据部门编码获取部门下所有IDS + * @param orgCodes + * @return + */ + List getSubDepIdsByOrgCodes(@org.apache.ibatis.annotations.Param("orgCodes") String[] orgCodes); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartPermissionMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartPermissionMapper.java new file mode 100644 index 00000000..6014f30f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartPermissionMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysDepartPermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 部门权限表 + * @Author: jero-boot + * @Date: 2020-02-11 + * @Version: V1.0 + */ +public interface SysDepartPermissionMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleMapper.java new file mode 100644 index 00000000..f828560b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleMapper.java @@ -0,0 +1,23 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysDepartRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 部门角色 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +public interface SysDepartRoleMapper extends BaseMapper { + /** + * 根据用户id,部门id查询可授权所有部门角色 + * @param orgCode + * @param userId + * @return + */ + public List queryDeptRoleByDeptAndUser(@Param("orgCode") String orgCode, @Param("userId") String userId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRolePermissionMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRolePermissionMapper.java new file mode 100644 index 00000000..66f1f8c9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRolePermissionMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysDepartRolePermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 部门角色权限 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +public interface SysDepartRolePermissionMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleUserMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleUserMapper.java new file mode 100644 index 00000000..d3796d3d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDepartRoleUserMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysDepartRoleUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 部门角色人员信息 + * @Author: jero-boot + * @Date: 2020-02-13 + * @Version: V1.0 + */ +public interface SysDepartRoleUserMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictItemMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictItemMapper.java new file mode 100644 index 00000000..fd73fb93 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictItemMapper.java @@ -0,0 +1,20 @@ +package com.jero.modules.system.mapper; + +import org.apache.ibatis.annotations.Select; +import com.jero.modules.system.entity.SysDictItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +public interface SysDictItemMapper extends BaseMapper { + @Select("SELECT * FROM sys_dict_item WHERE DICT_ID = #{mainId} order by sort_order asc, item_value asc") + public List selectItemsByMainId(String mainId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictMapper.java new file mode 100644 index 00000000..5ad60700 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysDictMapper.java @@ -0,0 +1,154 @@ +package com.jero.modules.system.mapper; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.ResultType; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.modules.system.entity.SysDict; +import com.jero.modules.system.model.DuplicateCheckVo; +import com.jero.modules.system.model.TreeSelectModel; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 字典表 Mapper 接口 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +public interface SysDictMapper extends BaseMapper { + + /** + * 重复检查SQL + * @return + */ + public Long duplicateCheckCountSql(DuplicateCheckVo duplicateCheckVo); + + public Long duplicateCheckCountSqlNoDataId(DuplicateCheckVo duplicateCheckVo); + + public List queryDictItemsByCode(@Param("code") String code); + + @Deprecated + public List queryTableDictItemsByCode(@Param("table") String table,@Param("text") String text,@Param("code") String code); + + @Deprecated + public List queryTableDictItemsByCodeAndFilter(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("filterSql") String filterSql); + + @Deprecated + @Select("select ${key} as \"label\",${value} as \"value\" from ${table}") + public List> getDictByTableNgAlain(@Param("table") String table, @Param("key") String key, @Param("value") String value); + + public String queryDictTextByKey(@Param("code") String code,@Param("key") String key); + + @Deprecated + public String queryTableDictTextByKey(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("key") String key); + + @Deprecated + public List queryTableDictByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyArray") String[] keyArray); + + /** + * 查询所有部门 作为字典信息 id -->value,departName -->text + * @return + */ + public List queryAllDepartBackDictModel(); + + /** + * 查询所有用户 作为字典信息 username -->value,realname -->text + * @return + */ + public List queryAllUserBackDictModel(); + + /** + * 通过关键字查询出字典表 + * @param table + * @param text + * @param code + * @param keyword + * @return + */ + @Deprecated + public List queryTableDictItems(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("keyword") String keyword); + + + /** + * 通过关键字查询出字典表 + * @param page + * @param table + * @param text + * @param code + * @param keyword + * @return + */ + IPage queryTableDictItems(Page page, @Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyword") String keyword); + + /** + * 根据表名、显示字段名、存储字段名 查询树 + * @param table + * @param text + * @param code + * @param pid + * @param hasChildField + * @return + */ + List queryTreeList(@Param("query") String query,@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("pidField") String pidField,@Param("pid") String pid,@Param("hasChildField") String hasChildField); + + /** + * 根据表名、显示字段名、存储字段名拼接树结构 + * @param table + * @param text + * @param code + * @return + */ + List queryTreeDataByKeyword(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("pidField") String pidField); + + /** + * 根据表名、显示字段名、存储字段名、自身ID查询 + * @param id + * @param table + * @param text + * @param code + * @return + */ + TreeSelectModel queryTreeDataItemById(@Param("id") String id,@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("pidField") String pidField); + + /** + * 删除 + * @param id + */ + @Select("delete from sys_dict where id = #{id}") + public void deleteOneById(@Param("id") String id); + + /** + * 查询被逻辑删除的数据 + * @return + */ + @Select("select * from sys_dict where del_flag = 1") + public List queryDeleteList(); + + /** + * 修改状态值 + * @param delFlag + * @param id + */ + @Update("update sys_dict set del_flag = #{flag,jdbcType=INTEGER} where id = #{id,jdbcType=VARCHAR}") + public void updateDictDelFlag(@Param("flag") int delFlag, @Param("id") String id); + + + /** + * 分页查询字典表数据 + * @param page + * @param query + * @return + */ + @Deprecated + public Page queryDictTablePageList(Page page, @Param("query") DictQuery query); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysFillRuleMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysFillRuleMapper.java new file mode 100644 index 00000000..d19df5f3 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysFillRuleMapper.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.system.entity.SysFillRule; + +/** + * @Description: 填值规则 + * @Author: jero-boot + * @Date: 2019-11-07 + * @Version: V1.0 + */ +public interface SysFillRuleMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysGatewayRouteMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysGatewayRouteMapper.java new file mode 100644 index 00000000..76b2ed66 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysGatewayRouteMapper.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.system.entity.SysGatewayRoute; + +/** + * @Description: gateway路由管理 + * @Author: jero-boot + * @Date: 2020-05-26 + * @Version: V1.0 + */ +public interface SysGatewayRouteMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysLogMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysLogMapper.java new file mode 100644 index 00000000..847f1fac --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysLogMapper.java @@ -0,0 +1,57 @@ +package com.jero.modules.system.mapper; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysLog; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 系统日志表 Mapper 接口 + *

+ * + * @Author zhangweijian + * @since 2018-12-26 + */ +public interface SysLogMapper extends BaseMapper { + + /** + * @功能:清空所有日志记录 + */ + public void removeAll(); + + /** + * 获取系统总访问次数 + * + * @return Long + */ + Long findTotalVisitCount(); + + //update-begin--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + /** + * 获取系统今日访问次数 + * + * @return Long + */ + Long findTodayVisitCount(@Param("dayStart") Date dayStart, @Param("dayEnd") Date dayEnd); + + /** + * 获取系统今日访问 IP数 + * + * @return Long + */ + Long findTodayIp(@Param("dayStart") Date dayStart, @Param("dayEnd") Date dayEnd); + //update-end--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + + /** + * 首页:根据时间统计访问数量/ip数量 + * @param dayStart + * @param dayEnd + * @return + */ + List> findVisitCount(@Param("dayStart") Date dayStart, @Param("dayEnd") Date dayEnd, @Param("dbType") String dbType); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionDataRuleMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionDataRuleMapper.java new file mode 100644 index 00000000..9cf62908 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionDataRuleMapper.java @@ -0,0 +1,28 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysPermissionDataRule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 权限规则 Mapper 接口 + *

+ * + * @Author huangzhilin + * @since 2019-04-01 + */ +public interface SysPermissionDataRuleMapper extends BaseMapper { + + /** + * 根据用户名和权限id查询 + * @param username + * @param permissionId + * @return + */ + public List queryDataRuleIds(@Param("username") String username,@Param("permissionId") String permissionId); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionMapper.java new file mode 100644 index 00000000..16b5e63f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysPermissionMapper.java @@ -0,0 +1,57 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.model.TreeModel; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 菜单权限表 Mapper 接口 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +public interface SysPermissionMapper extends BaseMapper { + /** + * 通过父菜单ID查询子菜单 + * @param parentId + * @return + */ + public List queryListByParentId(@Param("parentId") String parentId); + + /** + * 根据用户查询用户权限 + */ + public List queryByUser(@Param("username") String username); + + /** + * 修改菜单状态字段: 是否子节点 + */ + @Update("update sys_permission set is_leaf=#{leaf} where id = #{id}") + public int setMenuLeaf(@Param("id") String id,@Param("leaf") int leaf); + + /** + * 获取模糊匹配规则的数据权限URL + */ + @Select("SELECT url FROM sys_permission WHERE del_flag = 0 and menu_type = 2 and url like '%*%'") + public List queryPermissionUrlWithStar(); + + + /** + * 根据用户账号查询菜单权限 + * @param sysPermission + * @param username + * @return + */ + public int queryCountByUsername(@Param("username") String username, @Param("permission") SysPermission sysPermission); + + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRoleMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRoleMapper.java new file mode 100644 index 00000000..cd2b9365 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRoleMapper.java @@ -0,0 +1,37 @@ +package com.jero.modules.system.mapper; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; +import com.jero.modules.system.entity.SysRole; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 角色表 Mapper 接口 + *

+ * + * @Author scott + * @since 2018-12-19 + */ +public interface SysRoleMapper extends BaseMapper { + + /** + * @Author scott + * @Date 2019/12/13 16:12 + * @Description: 删除角色与用户关系 + */ + @Delete("delete from sys_user_role where role_id = #{roleId}") + void deleteRoleUserRelation(@Param("roleId") String roleId); + + + /** + * @Author scott + * @Date 2019/12/13 16:12 + * @Description: 删除角色与权限关系 + */ + @Delete("delete from sys_role_permission where role_id = #{roleId}") + void deleteRolePermissionRelation(@Param("roleId") String roleId); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRolePermissionMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRolePermissionMapper.java new file mode 100644 index 00000000..e80ba11d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysRolePermissionMapper.java @@ -0,0 +1,16 @@ +package com.jero.modules.system.mapper; + +import com.jero.modules.system.entity.SysRolePermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 角色权限表 Mapper 接口 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +public interface SysRolePermissionMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysThirdAccountMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysThirdAccountMapper.java new file mode 100644 index 00000000..03313966 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysThirdAccountMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysThirdAccount; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 第三方登录账号表 + * @Author: jero-boot + * @Date: 2020-11-17 + * @Version: V1.0 + */ +public interface SysThirdAccountMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserAgentMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserAgentMapper.java new file mode 100644 index 00000000..9036237e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserAgentMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysUserAgent; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 用户代理人设置 + * @Author: jero-boot + * @Date: 2019-04-17 + * @Version: V1.0 + */ +public interface SysUserAgentMapper extends BaseMapper { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserDepartMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserDepartMapper.java new file mode 100644 index 00000000..c38501d3 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserDepartMapper.java @@ -0,0 +1,11 @@ +package com.jero.modules.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysUserDepart; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SysUserDepartMapper extends BaseMapper{ + + List getUserDepartByUid(@Param("userId") String userId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java new file mode 100644 index 00000000..0032e1c0 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java @@ -0,0 +1,142 @@ +package com.jero.modules.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.SysUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.system.model.SysUserSysDepartModel; +import com.jero.modules.system.vo.SysUserDepVo; + +import java.util.List; + +/** + *

+ * 用户表 Mapper 接口 + *

+ * + * @Author scott + * @since 2018-12-20 + */ +public interface SysUserMapper extends BaseMapper { + /** + * 通过用户账号查询用户信息 + * @param username + * @return + */ + public SysUser getUserByName(@Param("username") String username); + + /** + * 根据部门Id查询用户信息 + * @param page + * @param departId + * @return + */ + IPage getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username); + + /** + * 根据用户Ids,查询用户所属部门名称信息 + * @param userIds + * @return + */ + List getDepNamesByUserIds(@Param("userIds")List userIds); + + /** + * 根据部门Ids,查询部门下用户信息 + * @param page + * @param departIds + * @return + */ + IPage getUserByDepIds(Page page, @Param("departIds") List departIds, @Param("username") String username); + + /** + * 根据角色Id查询用户信息 + * @param page + * @param + * @return + */ + IPage getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username); + + /** + * 根据用户名设置部门ID + * @param username + * @param departId + */ + void updateUserDepart(@Param("username") String username,@Param("orgCode") String orgCode); + + /** + * 根据手机号查询用户信息 + * @param phone + * @return + */ + public SysUser getUserByPhone(@Param("phone") String phone); + + + /** + * 根据邮箱查询用户信息 + * @param email + * @return + */ + public SysUser getUserByEmail(@Param("email")String email); + + /** + * 根据 orgCode 查询用户,包括子部门下的用户 + * + * @param page 分页对象, xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象) + * @param orgCode + * @param userParams 用户查询条件,可为空 + * @return + */ + List getUserByOrgCode(IPage page, @Param("orgCode") String orgCode, @Param("userParams") SysUser userParams); + + + /** + * 查询 getUserByOrgCode 的Total + * + * @param orgCode + * @param userParams 用户查询条件,可为空 + * @return + */ + Integer getUserByOrgCodeTotal(@Param("orgCode") String orgCode, @Param("userParams") SysUser userParams); + + /** + * @Author scott + * @Date 2019/12/13 16:10 + * @Description: 批量删除角色与用户关系 + */ + void deleteBathRoleUserRelation(@Param("roleIdArray") String[] roleIdArray); + + /** + * @Author scott + * @Date 2019/12/13 16:10 + * @Description: 批量删除角色与权限关系 + */ + void deleteBathRolePermissionRelation(@Param("roleIdArray") String[] roleIdArray); + + /** + * 查询被逻辑删除的用户 + */ + List selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper wrapper); + + /** + * 还原被逻辑删除的用户 + */ + int revertLogicDeleted(@Param("userIds") String userIds, @Param("entity") SysUser entity); + + /** + * 彻底删除被逻辑删除的用户 + */ + int deleteLogicDeleted(@Param("userIds") String userIds); + + /** 更新空字符串为null【此写法有sql注入风险,禁止随便用】 */ + int updateNullByEmptyString(@Param("fieldName") String fieldName); + + /** + * 根据部门Ids,查询部门下用户信息 + * @param departIds + * @return + */ + List queryByDepIds(@Param("departIds")List departIds,@Param("username") String username); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserRoleMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserRoleMapper.java new file mode 100644 index 00000000..91e0e272 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,25 @@ +package com.jero.modules.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import com.jero.modules.system.entity.SysUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 用户角色表 Mapper 接口 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +public interface SysUserRoleMapper extends BaseMapper { + + @Select("select role_code from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))") + List getRoleByUserName(@Param("username") String username); + + @Select("select id from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))") + List getRoleIdByUserName(@Param("username") String username); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementMapper.xml new file mode 100644 index 00000000..7fd44a61 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementSendMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementSendMapper.xml new file mode 100644 index 00000000..de13e8b6 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysAnnouncementSendMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCategoryMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCategoryMapper.xml new file mode 100644 index 00000000..669f35b8 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCategoryMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCheckRuleMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCheckRuleMapper.xml new file mode 100644 index 00000000..102e6e77 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysCheckRuleMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysConfusionMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysConfusionMapper.xml new file mode 100644 index 00000000..101a4a7a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysConfusionMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataLogMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataLogMapper.xml new file mode 100644 index 00000000..9b85dcc4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataLogMapper.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataSourceMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataSourceMapper.xml new file mode 100644 index 00000000..0188be81 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDataSourceMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartMapper.xml new file mode 100644 index 00000000..960893dd --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartPermissionMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartPermissionMapper.xml new file mode 100644 index 00000000..b8517451 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartPermissionMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleMapper.xml new file mode 100644 index 00000000..ba2e85fc --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRolePermissionMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRolePermissionMapper.xml new file mode 100644 index 00000000..38a6e1df --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRolePermissionMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleUserMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleUserMapper.xml new file mode 100644 index 00000000..acde2573 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDepartRoleUserMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictItemMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictItemMapper.xml new file mode 100644 index 00000000..b8652495 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictItemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictMapper.xml new file mode 100644 index 00000000..a95bedd2 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysDictMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysFillRuleMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysFillRuleMapper.xml new file mode 100644 index 00000000..c8d6d520 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysFillRuleMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysGatewayRouteMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysGatewayRouteMapper.xml new file mode 100644 index 00000000..ecf7e19e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysGatewayRouteMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysLogMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysLogMapper.xml new file mode 100644 index 00000000..a5385300 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysLogMapper.xml @@ -0,0 +1,69 @@ + + + + + + + DELETE FROM sys_log + + + + + + + + + + + + + + + diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml new file mode 100644 index 00000000..9efbab1f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionMapper.xml new file mode 100644 index 00000000..7afc17d7 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysPermissionMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysThirdAccountMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysThirdAccountMapper.xml new file mode 100644 index 00000000..9598cc57 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysThirdAccountMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserAgentMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserAgentMapper.xml new file mode 100644 index 00000000..6e39cd57 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserAgentMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserDepartMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserDepartMapper.xml new file mode 100644 index 00000000..65af5072 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserDepartMapper.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml new file mode 100644 index 00000000..4166c093 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + UPDATE sys_user SET org_code = #{orgCode} where username = #{username} + + + + + + + + + + + FROM + sys_depart + INNER JOIN sys_user_depart ON sys_user_depart.dep_id = sys_depart.id + INNER JOIN sys_user ON sys_user.id = sys_user_depart.user_id + WHERE + sys_user.del_flag = 0 AND sys_depart.org_code LIKE '${orgCode}%' + + + + AND sys_user.realname LIKE concat(concat('%',#{userParams.realname}),'%') + + + AND sys_user.work_no LIKE concat(concat('%',#{userParams.workNo}),'%') + + + + + + + + + + + + + delete from sys_user_role + where role_id in + + #{id} + + + + + delete from sys_role_permission + where role_id in + + #{id} + + + + + + + + + UPDATE + sys_user + SET + del_flag = 0, + update_by = #{entity.updateBy}, + update_time = #{entity.updateTime} + WHERE + del_flag = 1 + AND id IN (${userIds}) + + + + + DELETE FROM sys_user WHERE del_flag = 1 AND id IN (${userIds}) + + + + + UPDATE sys_user SET ${fieldName} = NULL WHERE ${fieldName} = '' + + + + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/AnnouncementSendModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/AnnouncementSendModel.java new file mode 100644 index 00000000..f6ba4956 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/AnnouncementSendModel.java @@ -0,0 +1,80 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +/** + * @Description: 用户通告阅读标记表 + * @Author: jero-boot + * @Date: 2019-02-21 + * @Version: V1.0 + */ +@Data +public class AnnouncementSendModel implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /**通告id*/ + private java.lang.String anntId; + /**用户id*/ + private java.lang.String userId; + /**标题*/ + private java.lang.String titile; + /**内容*/ + private java.lang.String msgContent; + /**发布人*/ + private java.lang.String sender; + /**优先级(L低,M中,H高)*/ + private java.lang.String priority; + /**阅读状态*/ + private java.lang.String readFlag; + /**发布时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date sendTime; + /**页数*/ + private java.lang.Integer pageNo; + /**大小*/ + private java.lang.Integer pageSize; + /** + * 消息类型1:通知公告2:系统消息 + */ + private java.lang.String msgCategory; + /** + * 业务id + */ + private java.lang.String busId; + /** + * 业务类型 + */ + private java.lang.String busType; + /** + * 打开方式 组件:component 路由:url + */ + private java.lang.String openType; + /** + * 组件/路由 地址 + */ + private java.lang.String openPage; + + /** + * 业务类型查询(0.非bpm业务) + */ + private java.lang.String bizSource; + + /** + * 摘要 + */ + private java.lang.String msgAbstract; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/DepartIdModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/DepartIdModel.java new file mode 100644 index 00000000..d3192850 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/DepartIdModel.java @@ -0,0 +1,93 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.jero.common.system.vo.SysDepartTreeModel; +import com.jero.modules.system.entity.SysDepart; + +/** + *

+ * 部门表 封装树结构的部门的名称的实体类 + *

+ * + * @Author Steve + * @Since 2019-01-22 + * + */ +public class DepartIdModel implements Serializable { + + private static final long serialVersionUID = 1L; + + // 主键ID + private String key; + + // 主键ID + private String value; + + // 部门名称 + private String title; + + List children = new ArrayList<>(); + + /** + * 将SysDepartTreeModel的部分数据放在该对象当中 + * @param treeModel + * @return + */ + public DepartIdModel convert(SysDepartTreeModel treeModel) { + this.key = treeModel.getId(); + this.value = treeModel.getId(); + this.title = treeModel.getDepartName(); + return this; + } + + /** + * 该方法为用户部门的实现类所使用 + * @param sysDepart + * @return + */ + public DepartIdModel convertByUserDepart(SysDepart sysDepart) { + this.key = sysDepart.getId(); + this.value = sysDepart.getId(); + this.title = sysDepart.getDepartName(); + return this; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/DuplicateCheckVo.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/DuplicateCheckVo.java new file mode 100644 index 00000000..affcc0c4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/DuplicateCheckVo.java @@ -0,0 +1,53 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Title: DuplicateCheckVo + * @Description: 重复校验VO + * @Author 张代浩 + * @Date 2019-03-25 + * @Version V1.0 + */ +@Data +@ApiModel(value="重复校验数据模型",description="重复校验数据模型") +public class DuplicateCheckVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 表名 + */ + @NotBlank(message = "混淆code不能为空") + @ApiModelProperty(value="混淆code",name="confusionCode",example="id") + private String confusionCode; + + /** + * 表名 + */ + @ApiModelProperty(value="表名",name="tableName",example="sys_log") + private String tableName; + + /** + * 字段名 + */ + @ApiModelProperty(value="字段名",name="fieldName",example="id") + private String fieldName; + + /** + * 字段值 + */ + @ApiModelProperty(value="字段值",name="fieldVal",example="1000") + private String fieldVal; + + /** + * 数据ID + */ + @ApiModelProperty(value="数据ID",name="dataId",example="2000") + private String dataId; + +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysDictTree.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysDictTree.java new file mode 100644 index 00000000..99769d17 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysDictTree.java @@ -0,0 +1,96 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; +import java.util.Date; + +import com.jero.modules.system.entity.SysDict; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 字典表 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDictTree implements Serializable { + + private static final long serialVersionUID = 1L; + + private String key; + + private String title; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /** + * 字典类型,0 string,1 number类型,2 boolean + * 前端js对stirng类型和number类型 boolean 类型敏感,需要区分。在select 标签匹配的时候会用到 + * 默认为string类型 + */ + private Integer type; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典编码 + */ + private String dictCode; + + /** + * 描述 + */ + private String description; + + /** + * 删除状态 + */ + private Integer delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + public SysDictTree(SysDict node) { + this.id = node.getId(); + this.key = node.getId(); + this.title = node.getDictName(); + this.dictCode = node.getDictCode(); + this.description = node.getDescription(); + this.delFlag = node.getDelFlag(); + this.type = node.getType(); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysLoginModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysLoginModel.java new file mode 100644 index 00000000..212b43b5 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysLoginModel.java @@ -0,0 +1,64 @@ +package com.jero.modules.system.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 登录表单 + * + * @Author scott + * @since 2019-01-18 + */ +@ApiModel(value="登录对象", description="登录对象") +public class SysLoginModel { + @ApiModelProperty(value = "账号") + private String username; + @ApiModelProperty(value = "密码") + private String password; + @ApiModelProperty(value = "验证码") + private String captcha; + @ApiModelProperty(value = "验证码key") + private String checkKey; + @ApiModelProperty(value = "RSA公钥") + private String rsaPublicKey; + + 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 getCaptcha() { + return captcha; + } + + public void setCaptcha(String captcha) { + this.captcha = captcha; + } + + public String getCheckKey() { + return checkKey; + } + + public void setCheckKey(String checkKey) { + this.checkKey = checkKey; + } + + public String getRsaPublicKey() { + return rsaPublicKey; + } + + public void setRsaPublicKey(String rsaPublicKey) { + this.rsaPublicKey = rsaPublicKey; + } +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysPermissionTree.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysPermissionTree.java new file mode 100644 index 00000000..e66fab32 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysPermissionTree.java @@ -0,0 +1,394 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import com.jero.modules.system.entity.SysPermission; + +public class SysPermissionTree implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + private String key; + private String title; + + /** + * 父id + */ + private String parentId; + + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单权限编码 + */ + private String perms; + /** + * 权限策略1显示2禁用 + */ + private String permsType; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 组件 + */ + private String component; + + /** + * 跳转网页链接 + */ + private String url; + + /** + * 一级菜单跳转地址 + */ + private String redirect; + + /** + * 菜单排序 + */ + private Double sortNo; + + /** + * 类型(0:一级菜单;1:子菜单 ;2:按钮权限) + */ + private Integer menuType; + + /** + * 是否叶子节点: 1:是 0:不是 + */ + private boolean isLeaf; + + /** + * 是否路由菜单: 0:不是 1:是(默认值1) + */ + private boolean route; + + + /** + * 是否路缓存页面: 0:不是 1:是(默认值1) + */ + private boolean keepAlive; + + + /** + * 描述 + */ + private String description; + + /** + * 删除状态 0正常 1已删除 + */ + private Integer delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /**alwaysShow*/ + private boolean alwaysShow; + /**是否隐藏路由菜单: 0否,1是(默认值0)*/ + private boolean hidden; + + /**按钮权限状态(0无效1有效)*/ + private java.lang.String status; + + /*update_begin author:wuxianquan date:20190908 for:model增加字段 */ + /** 外链菜单打开方式 0/内部打开 1/外部打开 */ + private boolean internalOrExternal; + /*update_end author:wuxianquan date:20190908 for:model增加字段 */ + + + public SysPermissionTree() { + } + + public SysPermissionTree(SysPermission permission) { + this.key = permission.getId(); + this.id = permission.getId(); + this.perms = permission.getPerms(); + this.permsType = permission.getPermsType(); + this.component = permission.getComponent(); + this.createBy = permission.getCreateBy(); + this.createTime = permission.getCreateTime(); + this.delFlag = permission.getDelFlag(); + this.description = permission.getDescription(); + this.icon = permission.getIcon(); + this.isLeaf = permission.isLeaf(); + this.menuType = permission.getMenuType(); + this.name = permission.getName(); + this.parentId = permission.getParentId(); + this.sortNo = permission.getSortNo(); + this.updateBy = permission.getUpdateBy(); + this.updateTime = permission.getUpdateTime(); + this.redirect = permission.getRedirect(); + this.url = permission.getUrl(); + this.hidden = permission.isHidden(); + this.route = permission.isRoute(); + this.keepAlive = permission.isKeepAlive(); + this.alwaysShow= permission.isAlwaysShow(); + /*update_begin author:wuxianquan date:20190908 for:赋值 */ + this.internalOrExternal = permission.isInternalOrExternal(); + /*update_end author:wuxianquan date:20190908 for:赋值 */ + this.title=permission.getName(); + if (!permission.isLeaf()) { + this.children = new ArrayList(); + } + this.status = permission.getStatus(); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + private List children; + + public boolean isLeaf() { + return isLeaf; + } + + public void setLeaf(boolean leaf) { + isLeaf = leaf; + } + + public boolean isKeepAlive() { + return keepAlive; + } + + public void setKeepAlive(boolean keepAlive) { + this.keepAlive = keepAlive; + } + + public boolean isAlwaysShow() { + return alwaysShow; + } + + public void setAlwaysShow(boolean alwaysShow) { + this.alwaysShow = alwaysShow; + } + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getRedirect() { + return redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public boolean isHidden() { + return hidden; + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Double getSortNo() { + return sortNo; + } + + public void setSortNo(Double sortNo) { + this.sortNo = sortNo; + } + + public Integer getMenuType() { + return menuType; + } + + public void setMenuType(Integer menuType) { + this.menuType = menuType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public boolean isRoute() { + return route; + } + + public void setRoute(boolean route) { + this.route = route; + } + + public Integer getDelFlag() { + return delFlag; + } + + public void setDelFlag(Integer delFlag) { + this.delFlag = delFlag; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public boolean getIsLeaf() { + return isLeaf; + } + + public void setIsLeaf(boolean isLeaf) { + this.isLeaf = isLeaf; + } + + public String getPermsType() { + return permsType; + } + + public void setPermsType(String permsType) { + this.permsType = permsType; + } + + public java.lang.String getStatus() { + return status; + } + + public void setStatus(java.lang.String status) { + this.status = status; + } + + /*update_begin author:wuxianquan date:20190908 for:get set方法 */ + public boolean isInternalOrExternal() { + return internalOrExternal; + } + + public void setInternalOrExternal(boolean internalOrExternal) { + this.internalOrExternal = internalOrExternal; + } + /*update_end author:wuxianquan date:20190908 for:get set 方法 */ +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysUserSysDepartModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysUserSysDepartModel.java new file mode 100644 index 00000000..3236702f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/SysUserSysDepartModel.java @@ -0,0 +1,26 @@ +package com.jero.modules.system.model; + +import lombok.Data; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.entity.SysUser; + +/** + * 包含 SysUser 和 SysDepart 的 Model + * + * @author sunjianlei + */ +@Data +public class SysUserSysDepartModel { + + private String id; + private String realname; + private String workNo; + private String post; + private String telephone; + private String email; + private String phone; + private String departId; + private String departName; + private String avatar; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/ThirdLoginModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/ThirdLoginModel.java new file mode 100644 index 00000000..97f7457e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/ThirdLoginModel.java @@ -0,0 +1,72 @@ +package com.jero.modules.system.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 第三方登录 信息存储 + */ +@Data +public class ThirdLoginModel implements Serializable { + private static final long serialVersionUID = 4098628709290780891L; + + /** + * 第三方登录 来源 + */ + private String source; + + /** + * 第三方登录 uuid + */ + private String uuid; + + /** + * 第三方登录 username + */ + private String username; + + /** + * 第三方登录 头像 + */ + private String avatar; + + /** + * 账号 后缀第三方登录 防止账号重复 + */ + private String suffix; + + /** + * 操作码 防止被攻击 + */ + private String operateCode; + + public ThirdLoginModel(){ + + } + + /** + * 构造器 + * @param source + * @param uuid + * @param username + * @param avatar + */ + public ThirdLoginModel(String source,String uuid,String username,String avatar){ + this.source = source; + this.uuid = uuid; + this.username = username; + this.avatar = avatar; + } + + /** + * 获取登录账号名 + * @return + */ + public String getUserLoginAccount(){ + if(suffix==null){ + return this.uuid; + } + return this.uuid + this.suffix; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeModel.java new file mode 100644 index 00000000..77e2d21c --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeModel.java @@ -0,0 +1,174 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.jero.modules.system.entity.SysPermission; + +/** + * 树形列表用到 + */ +public class TreeModel implements Serializable { + + private static final long serialVersionUID = 4013193970046502756L; + + private String key; + + private String title; + + private String slotTitle; + + private boolean isLeaf; + + private String icon; + + private Integer ruleFlag; + + private Map scopedSlots; + + public Map getScopedSlots() { + return scopedSlots; + } + + public void setScopedSlots(Map scopedSlots) { + this.scopedSlots = scopedSlots; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean getIsLeaf() { + return isLeaf; + } + + public void setIsLeaf(boolean isLeaf) { + this.isLeaf = isLeaf; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + private List children; + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public TreeModel() { + + } + + public TreeModel(SysPermission permission) { + this.key = permission.getId(); + this.icon = permission.getIcon(); + this.parentId = permission.getParentId(); + this.title = permission.getName(); + this.slotTitle = permission.getName(); + this.value = permission.getId(); + this.isLeaf = permission.isLeaf(); + this.label = permission.getName(); + if(!permission.isLeaf()) { + this.children = new ArrayList(); + } + } + + public TreeModel(String key,String parentId,String slotTitle,Integer ruleFlag,boolean isLeaf) { + this.key = key; + this.parentId = parentId; + this.ruleFlag=ruleFlag; + this.slotTitle = slotTitle; + Map map = new HashMap(); + map.put("title", "hasDatarule"); + this.scopedSlots = map; + this.isLeaf = isLeaf; + this.value = key; + if(!isLeaf) { + this.children = new ArrayList(); + } + } + + private String parentId; + + private String label; + + private String value; + + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } + + /** + * @param label the label to set + */ + public void setLabel(String label) { + this.label = label; + } + + /** + * @return the value + */ + public String getValue() { + return value; + } + + /** + * @param value the value to set + */ + public void setValue(String value) { + this.value = value; + } + + public String getSlotTitle() { + return slotTitle; + } + + public void setSlotTitle(String slotTitle) { + this.slotTitle = slotTitle; + } + + public Integer getRuleFlag() { + return ruleFlag; + } + + public void setRuleFlag(Integer ruleFlag) { + this.ruleFlag = ruleFlag; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeSelectModel.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeSelectModel.java new file mode 100644 index 00000000..448fc051 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/model/TreeSelectModel.java @@ -0,0 +1,94 @@ +package com.jero.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 树形下拉框 + */ +public class TreeSelectModel implements Serializable { + + private static final long serialVersionUID = 9016390975325574747L; + + private String key; + + private String title; + + private boolean isLeaf; + + private String icon; + + private String parentId; + + private String value; + + private String code; + + private List children = new ArrayList<>(); + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isLeaf() { + return isLeaf; + } + + public void setLeaf(boolean isLeaf) { + this.isLeaf = isLeaf; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/CategoryCodeRule.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/CategoryCodeRule.java new file mode 100644 index 00000000..c3543f5f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/CategoryCodeRule.java @@ -0,0 +1,64 @@ +package com.jero.modules.system.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.handler.IFillRuleHandler; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.YouBianCodeUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysCategory; +import com.jero.modules.system.mapper.SysCategoryMapper; + +import java.util.List; + +/** + * @Author scott + * @Date 2019/12/9 11:32 + * @Description: 分类字典编码生成规则 + */ +public class CategoryCodeRule implements IFillRuleHandler { + + public static final String ROOT_PID_VALUE = "0"; + + @Override + public Object execute(JSONObject params, JSONObject formData) { + + String categoryPid = ROOT_PID_VALUE; + String categoryCode = null; + + if (formData != null && formData.size() > 0) { + Object obj = formData.get("pid"); + if (oConvertUtils.isNotEmpty(obj)) categoryPid = obj.toString(); + } else { + if (params != null) { + Object obj = params.get("pid"); + if (oConvertUtils.isNotEmpty(obj)) categoryPid = obj.toString(); + } + } + + /* + * 分成三种情况 + * 1.数据库无数据 调用YouBianCodeUtil.getNextYouBianCode(null); + * 2.添加子节点,无兄弟元素 YouBianCodeUtil.getSubYouBianCode(parentCode,null); + * 3.添加子节点有兄弟元素 YouBianCodeUtil.getNextYouBianCode(lastCode); + * */ + //找同类 确定上一个最大的code值 + LambdaQueryWrapper query = new LambdaQueryWrapper().eq(SysCategory::getPid, categoryPid).isNotNull(SysCategory::getCode).orderByDesc(SysCategory::getCode); + SysCategoryMapper baseMapper = (SysCategoryMapper) SpringContextUtils.getBean("sysCategoryMapper"); + List list = baseMapper.selectList(query); + if (list == null || list.size() == 0) { + if (ROOT_PID_VALUE.equals(categoryPid)) { + //情况1 + categoryCode = YouBianCodeUtil.getNextYouBianCode(null); + } else { + //情况2 + SysCategory parent = (SysCategory) baseMapper.selectById(categoryPid); + categoryCode = YouBianCodeUtil.getSubYouBianCode(parent.getCode(), null); + } + } else { + //情况3 + categoryCode = YouBianCodeUtil.getNextYouBianCode(list.get(0).getCode()); + } + return categoryCode; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrderNumberRule.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrderNumberRule.java new file mode 100644 index 00000000..a675a5e6 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrderNumberRule.java @@ -0,0 +1,36 @@ +package com.jero.modules.system.rule; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.RandomUtils; +import com.jero.common.handler.IFillRuleHandler; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 填值规则Demo:生成订单号 + * 【测试示例】 + */ +public class OrderNumberRule implements IFillRuleHandler { + + @Override + public Object execute(JSONObject params, JSONObject formData) { + String prefix = "CN"; + //订单前缀默认为CN 如果规则参数不为空,则取自定义前缀 + if (params != null) { + Object obj = params.get("prefix"); + if (obj != null) prefix = obj.toString(); + } + SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); + int random = RandomUtils.nextInt(90) + 10; + String value = prefix + format.format(new Date()) + random; + // 根据formData的值的不同,生成不同的订单号 + String name = formData.getString("name"); + if (!StringUtils.isEmpty(name)) { + value += name; + } + return value; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrgCodeRule.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrgCodeRule.java new file mode 100644 index 00000000..bef8b84c --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/rule/OrgCodeRule.java @@ -0,0 +1,94 @@ +package com.jero.modules.system.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.netty.util.internal.StringUtil; +import com.jero.common.handler.IFillRuleHandler; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.YouBianCodeUtil; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.service.ISysDepartService; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author scott + * @Date 2019/12/9 11:33 + * @Description: 机构编码生成规则 + */ +public class OrgCodeRule implements IFillRuleHandler { + + @Override + public Object execute(JSONObject params, JSONObject formData) { + ISysDepartService sysDepartService = (ISysDepartService) SpringContextUtils.getBean("sysDepartServiceImpl"); + + LambdaQueryWrapper query = new LambdaQueryWrapper(); + LambdaQueryWrapper query1 = new LambdaQueryWrapper(); + // 创建一个List集合,存储查询返回的所有SysDepart对象 + List departList = new ArrayList<>(); + String[] strArray = new String[2]; + //定义部门类型 + String orgType = ""; + // 定义新编码字符串 + String newOrgCode = ""; + // 定义旧编码字符串 + String oldOrgCode = ""; + + String parentId = null; + if (formData != null && formData.size() > 0) { + Object obj = formData.get("parentId"); + if (obj != null) parentId = obj.toString(); + } else { + if (params != null) { + Object obj = params.get("parentId"); + if (obj != null) parentId = obj.toString(); + } + } + + //如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回 + if (StringUtil.isNullOrEmpty(parentId)) { + // 线判断数据库中的表是否为空,空则直接返回初始编码 + query1.eq(SysDepart::getParentId, "").or().isNull(SysDepart::getParentId); + query1.orderByDesc(SysDepart::getOrgCode); + departList = sysDepartService.list(query1); + if (departList == null || departList.size() == 0) { + strArray[0] = YouBianCodeUtil.getNextYouBianCode(null); + strArray[1] = "1"; + return strArray; + } else { + SysDepart depart = departList.get(0); + oldOrgCode = depart.getOrgCode(); + orgType = depart.getOrgType(); + newOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode); + } + } else {//反之则查询出所有同级的部门,获取结果后有两种情况,有同级和没有同级 + // 封装查询同级的条件 + query.eq(SysDepart::getParentId, parentId); + // 降序排序 + query.orderByDesc(SysDepart::getOrgCode); + // 查询出同级部门的集合 + List parentList = sysDepartService.list(query); + // 查询出父级部门 + SysDepart depart = sysDepartService.getById(parentId); + // 获取父级部门的Code + String parentCode = depart.getOrgCode(); + // 根据父级部门类型算出当前部门的类型 + orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1); + // 处理同级部门为null的情况 + if (parentList == null || parentList.size() == 0) { + // 直接生成当前的部门编码并返回 + newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null); + } else { //处理有同级部门的情况 + // 获取同级部门的编码,利用工具类 + String subCode = parentList.get(0).getOrgCode(); + // 返回生成的当前部门编码 + newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode); + } + } + // 返回最终封装了部门编码和部门类型的数组 + strArray[0] = newOrgCode; + strArray[1] = orgType; + return strArray; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementSendService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementSendService.java new file mode 100644 index 00000000..74413002 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementSendService.java @@ -0,0 +1,28 @@ +package com.jero.modules.system.service; + +import java.util.List; + +import com.jero.modules.system.entity.SysAnnouncementSend; +import com.jero.modules.system.model.AnnouncementSendModel; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 用户通告阅读标记表 + * @Author: jero-boot + * @Date: 2019-02-21 + * @Version: V1.0 + */ +public interface ISysAnnouncementSendService extends IService { + + public List queryByUserId(String userId); + + /** + * @功能:获取我的消息 + * @param announcementSendModel + * @return + */ + public Page getMyAnnouncementSendPage(Page page,AnnouncementSendModel announcementSendModel); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementService.java new file mode 100644 index 00000000..7ceccbb1 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysAnnouncementService.java @@ -0,0 +1,25 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysAnnouncement; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 系统通告表 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +public interface ISysAnnouncementService extends IService { + + public void saveAnnouncement(SysAnnouncement sysAnnouncement); + + public boolean upDateAnnouncement(SysAnnouncement sysAnnouncement); + + public void saveSysAnnouncement(String title, String msgContent); + + public Page querySysCementPageByUserId(Page page,String userId,String msgCategory); + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCategoryService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCategoryService.java new file mode 100644 index 00000000..f5833247 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCategoryService.java @@ -0,0 +1,62 @@ +package com.jero.modules.system.service; + +import java.util.List; +import java.util.Map; + +import com.jero.common.exception.JeroBootException; +import com.jero.modules.system.entity.SysCategory; +import com.jero.modules.system.model.TreeSelectModel; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 分类字典 + * @Author: jero-boot + * @Date: 2019-05-29 + * @Version: V1.0 + */ +public interface ISysCategoryService extends IService { + + /**根节点父ID的值*/ + public static final String ROOT_PID_VALUE = "0"; + + void addSysCategory(SysCategory sysCategory); + + void updateSysCategory(SysCategory sysCategory); + + /** + * 根据父级编码加载分类字典的数据 + * @param pcode + * @return + */ + public List queryListByCode(String pcode) throws JeroBootException; + + /** + * 根据pid查询子节点集合 + * @param pid + * @return + */ + public List queryListByPid(String pid); + + /** + * 根据pid查询子节点集合,支持查询条件 + * @param pid + * @param condition + * @return + */ + public List queryListByPid(String pid, Map condition); + + /** + * 根据code查询id + * @param code + * @return + */ + public String queryIdByCode(String code); + + /** + * 删除节点时同时删除子节点及修改父级节点 + * @param ids + */ + void deleteSysCategory(String ids); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCheckRuleService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCheckRuleService.java new file mode 100644 index 00000000..fb647f6b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysCheckRuleService.java @@ -0,0 +1,33 @@ +package com.jero.modules.system.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysCheckRule; + +/** + * @Description: 编码校验规则 + * @Author: jero-boot + * @Date: 2020-02-04 + * @Version: V1.0 + */ +public interface ISysCheckRuleService extends IService { + + /** + * 通过 code 获取规则 + * + * @param ruleCode + * @return + */ + SysCheckRule getByCode(String ruleCode); + + + /** + * 通过用户设定的自定义校验规则校验传入的值 + * + * @param checkRule + * @param value + * @return 返回 null代表通过校验,否则就是返回的错误提示文本 + */ + JSONObject checkValue(SysCheckRule checkRule, String value); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysConfusionService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysConfusionService.java new file mode 100644 index 00000000..abff554b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysConfusionService.java @@ -0,0 +1,61 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysConfusion; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: 混淆表 + * @Author: jero-boot + * @Date: 2021-08-05 + * @Version: V1.0 + */ +public interface ISysConfusionService extends IService { + + /** + * 保存 + * + * @param sysConfusion + * @return + */ + void add(SysConfusion sysConfusion); + + /** + * 更新 + * + * @param sysConfusion + * @return + */ + void editById(SysConfusion sysConfusion); + + /** + * 通过id删除 + * + * @param id + * @return + */ + void deleteById(String id); + + /** + * 批量删除 + * + * @param ids + * @return + */ + void deleteByIds(List ids); + + /** + * 通过id查询 + * + * @param id + * @return + */ + SysConfusion queryById(String id); + + /** + * 列表查询 + * + * @return + */ + List queryList(); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataLogService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataLogService.java new file mode 100644 index 00000000..7a94ed2b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataLogService.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysDataLog; + +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ISysDataLogService extends IService { + + /** + * 添加数据日志 + * @param tableName + * @param dataId + * @param dataContent + */ + public void addDataLog(String tableName, String dataId, String dataContent); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataSourceService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataSourceService.java new file mode 100644 index 00000000..9f552cbc --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDataSourceService.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysDataSource; + +/** + * @Description: 多数据源管理 + * @Author: jero-boot + * @Date: 2019-12-25 + * @Version: V1.0 + */ +public interface ISysDataSourceService extends IService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartPermissionService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartPermissionService.java new file mode 100644 index 00000000..1338f0fa --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartPermissionService.java @@ -0,0 +1,30 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysDepartPermission; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysPermissionDataRule; + +import java.util.List; + +/** + * @Description: 部门权限表 + * @Author: jero-boot + * @Date: 2020-02-11 + * @Version: V1.0 + */ +public interface ISysDepartPermissionService extends IService { + /** + * 保存授权 将上次的权限和这次作比较 差异处理提高效率 + * @param departId + * @param permissionIds + * @param lastPermissionIds + */ + public void saveDepartPermission(String departId,String permissionIds,String lastPermissionIds); + + /** + * 根据部门id,菜单id获取数据规则 + * @param permissionId + * @return + */ + List getPermRuleListByDeptIdAndPermId(String departId,String permissionId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRolePermissionService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRolePermissionService.java new file mode 100644 index 00000000..f434fa60 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRolePermissionService.java @@ -0,0 +1,20 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysDepartRolePermission; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 部门角色权限 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +public interface ISysDepartRolePermissionService extends IService { + /** + * 保存授权 将上次的权限和这次作比较 差异处理提高效率 + * @param roleId + * @param permissionIds + * @param lastPermissionIds + */ + public void saveDeptRolePermission(String roleId,String permissionIds,String lastPermissionIds); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleService.java new file mode 100644 index 00000000..1a307ccd --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleService.java @@ -0,0 +1,24 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysDepartRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * @Description: 部门角色 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +public interface ISysDepartRoleService extends IService { + + /** + * 根据用户id,部门id查询可授权所有部门角色 + * @param orgCode + * @param userId + * @return + */ + List queryDeptRoleByDeptAndUser(String orgCode, String userId); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleUserService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleUserService.java new file mode 100644 index 00000000..cc168726 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartRoleUserService.java @@ -0,0 +1,24 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysDepartRoleUser; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * @Description: 部门角色人员信息 + * @Author: jero-boot + * @Date: 2020-02-13 + * @Version: V1.0 + */ +public interface ISysDepartRoleUserService extends IService { + + void deptRoleUserAdd(String userId,String newRoleId,String oldRoleId); + + /** + * 取消用户与部门关联,删除关联关系 + * @param userIds + * @param depId + */ + void removeDeptRoleUser(List userIds,String depId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java new file mode 100644 index 00000000..c38b75a4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java @@ -0,0 +1,126 @@ +package com.jero.modules.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.common.system.vo.SysDepartTreeModel; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.model.DepartIdModel; +import java.util.List; + +/** + *

+ * 部门表 服务实现类 + *

+ * + * @Author:Steve + * @Since: 2019-01-22 + */ +public interface ISysDepartService extends IService{ + + /** + * 查询我的部门信息,并分节点进行显示 + * @return + */ + List queryMyDeptTreeList(String departIds); + + /** + * 查询所有部门信息,并分节点进行显示 + * @return + */ + List queryTreeList(); + + /** + * 查询所有部门DepartId信息,并分节点进行显示 + * @return + */ + public List queryDepartIdTreeList(); + + /** + * 保存部门数据 + * @param sysDepart + */ + void saveDepartData(SysDepart sysDepart,String username); + + /** + * 更新depart数据 + * @param sysDepart + * @return + */ + Boolean updateDepartDataById(SysDepart sysDepart,String username); + + /** + * 删除depart数据 + * @param id + * @return + */ + /* boolean removeDepartDataById(String id); */ + + /** + * 根据关键字搜索相关的部门数据 + * @param keyWord + * @return + */ + List searhBy(String keyWord,String myDeptSearch,String departIds); + + /** + * 根据部门id删除并删除其可能存在的子级部门 + * @param id + * @return + */ + boolean delete(String id); + + /** + * 查询SysDepart集合 + * @param userId + * @return + */ + public List queryUserDeparts(String userId); + + /** + * 根据用户名查询部门 + * + * @param username + * @return + */ + List queryDepartsByUsername(String username); + + /** + * 根据部门id批量删除并删除其可能存在的子级部门 + * @param id + * @return + */ + void deleteBatchWithChildren(List ids); + + /** + * 根据部门Id查询,当前和下级所有部门IDS + * @param departId + * @return + */ + List getSubDepIdsByDepId(String departId); + + /** + * 获取我的部门下级所有部门IDS + * @return + */ + List getMySubDepIdsByDepId(String departIds); + /** + * 根据关键字获取部门信息(通讯录) + * @return + */ + List queryTreeByKeyWord(String keyWord); + + /** + * 根据部门id查询部门所有的父级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:50 + * @param departId 部门id + */ + List listParentDepartsByDepId(String departId); + + /** + * 根据部门id查询部门所有的子级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:54 + * @param departId 部门id + */ + List listSonDepartsByDepId(String departId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictItemService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictItemService.java new file mode 100644 index 00000000..81c0cba9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictItemService.java @@ -0,0 +1,18 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysDictItem; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +public interface ISysDictItemService extends IService { + public List selectItemsByMainId(String mainId); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java new file mode 100644 index 00000000..ba8807cb --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java @@ -0,0 +1,145 @@ +package com.jero.modules.system.service; + +import java.util.List; +import java.util.Map; + +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.modules.system.entity.SysDict; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.model.TreeSelectModel; + +/** + *

+ * 字典表 服务类 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +public interface ISysDictService extends IService { + + public List queryDictItemsByCode(String code); + + public Map> queryAllDictItems(); + + @Deprecated + List queryTableDictItemsByCode(String table, String text, String code); + + @Deprecated + public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql); + + public String queryDictTextByKey(String code, String key); + + @Deprecated + String queryTableDictTextByKey(String table, String text, String code, String key); + + @Deprecated + List queryTableDictByKeys(String table, String text, String code, String keys); + + /** + * 根据字典类型删除关联表中其对应的数据 + * + * @param sysDict + * @return + */ + boolean deleteByDictId(SysDict sysDict); + + /** + * 添加一对多 + */ + public Integer saveMain(SysDict sysDict, List sysDictItemList); + + /** + * 查询所有部门 作为字典信息 id -->value,departName -->text + * @return + */ + public List queryAllDepartBackDictModel(); + + /** + * 查询所有用户 作为字典信息 username -->value,realname -->text + * @return + */ + public List queryAllUserBackDictModel(); + + /** + * 通过关键字查询字典表 + * @param table + * @param text + * @param code + * @param keyword + * @return + */ + @Deprecated + public List queryTableDictItems(String table, String text, String code,String keyword); + + /** + * 查询字典表数据 只查询前10条 + * @param table + * @param text + * @param code + * @param keyword + * @return + */ + public List queryLittleTableDictItems(String table, String text, String code,String keyword, int pageSize); + + /** + * 根据表名、显示字段名、存储字段名 查询树 + * @param table + * @param text + * @param code + * @param pidField + * @param pid + * @param hasChildField + * @return + */ + List queryTreeList(String query,String table, String text, String code, String pidField,String pid,String hasChildField); + + /** + * 根据表名、显示字段名、存储字段名 和查询条件拼接树结构 + * @param table + * @param text + * @param code + * @param pidField + * @return + */ + List queryAllTreeData(String table, String text, String code, String pidField); + + /** + * 真实删除 + * @param id + */ + public void deleteOneDictPhysically(String id); + + /** + * 修改delFlag + * @param delFlag + * @param id + */ + public void updateDictDelFlag(int delFlag,String id); + + /** + * 查询被逻辑删除的数据 + * @return + */ + public List queryDeleteList(); + + /** + * 分页查询 + * @param query + * @param pageSize + * @param pageNo + * @return + */ + @Deprecated + public List queryDictTablePageList(DictQuery query,int pageSize, int pageNo); + + /** + * 刷新dict缓存 + * @date 2021/4/8 9:06 + * @return void + */ + void refreshCache(); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysFillRuleService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysFillRuleService.java new file mode 100644 index 00000000..6f5c20ca --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysFillRuleService.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysFillRule; + +/** + * @Description: 填值规则 + * @Author: jero-boot + * @Date: 2019-11-07 + * @Version: V1.0 + */ +public interface ISysFillRuleService extends IService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysGatewayRouteService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysGatewayRouteService.java new file mode 100644 index 00000000..336e98a9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysGatewayRouteService.java @@ -0,0 +1,38 @@ +package com.jero.modules.system.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysGatewayRoute; + +/** + * @Description: gateway路由管理 + * @Author: jero-boot + * @Date: 2020-05-26 + * @Version: V1.0 + */ +public interface ISysGatewayRouteService extends IService { + + /** + * 添加所有的路由信息到redis + * @param key + */ + void addRoute2Redis(String key); + + /** + * 删除路由 + * @param id + */ + void deleteById(String id); + + /** + * 保存路由配置 + * @param array + */ + void updateAll(JSONObject array); + + /** + * 清空redis中的route信息 + */ + void clearRedis(); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysLogService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysLogService.java new file mode 100644 index 00000000..acd26457 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysLogService.java @@ -0,0 +1,56 @@ +package com.jero.modules.system.service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.jero.modules.system.entity.SysLog; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 系统日志表 服务类 + *

+ * + * @Author zhangweijian + * @since 2018-12-26 + */ +public interface ISysLogService extends IService { + + /** + * @功能:清空所有日志记录 + */ + public void removeAll(); + + /** + * 获取系统总访问次数 + * + * @return Long + */ + Long findTotalVisitCount(); + + //update-begin--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + /** + * 获取系统今日访问次数 + * + * @return Long + */ + Long findTodayVisitCount(Date dayStart, Date dayEnd); + + /** + * 获取系统今日访问 IP数 + * + * @return Long + */ + Long findTodayIp(Date dayStart, Date dayEnd); + //update-end--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + + /** + * 首页:根据时间统计访问数量/ip数量 + * @param dayStart + * @param dayEnd + * @return + */ + List> findVisitCount(Date dayStart, Date dayEnd); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionDataRuleService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionDataRuleService.java new file mode 100644 index 00000000..87dfad27 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionDataRuleService.java @@ -0,0 +1,55 @@ +package com.jero.modules.system.service; + +import java.util.List; + +import com.jero.modules.system.entity.SysPermissionDataRule; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 菜单权限规则 服务类 + *

+ * + * @Author huangzhilin + * @since 2019-04-01 + */ +public interface ISysPermissionDataRuleService extends IService { + + /** + * 根据菜单id查询其对应的权限数据 + * + * @param permRule + */ + List getPermRuleListByPermId(String permissionId); + + /** + * 根据页面传递的参数查询菜单权限数据 + * + * @return + */ + List queryPermissionRule(SysPermissionDataRule permRule); + + + /** + * 根据菜单ID和用户名查找数据权限配置信息 + * @param permission + * @param username + * @return + */ + List queryPermissionDataRules(String username,String permissionId); + + /** + * 新增菜单权限配置 修改菜单rule_flag + * @param sysPermissionDataRule + */ + public void savePermissionDataRule(SysPermissionDataRule sysPermissionDataRule); + + /** + * 删除菜单权限配置 判断菜单还有无权限 + * @param dataRuleId + */ + public void deletePermissionDataRule(String dataRuleId); + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionService.java new file mode 100644 index 00000000..8f48db4f --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysPermissionService.java @@ -0,0 +1,64 @@ +package com.jero.modules.system.service; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.common.exception.JeroBootException; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.model.TreeModel; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 菜单权限表 服务类 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +public interface ISysPermissionService extends IService { + + public List queryListByParentId(String parentId); + + /**真实删除*/ + public void deletePermission(String id) throws JeroBootException; + /**逻辑删除*/ + public void deletePermissionLogical(String id) throws JeroBootException; + + public void addPermission(SysPermission sysPermission) throws JeroBootException; + + public void editPermission(SysPermission sysPermission) throws JeroBootException; + + public List queryByUser(String username); + + /** + * 根据permissionId删除其关联的SysPermissionDataRule表中的数据 + * + * @param id + * @return + */ + public void deletePermRuleByPermId(String id); + + /** + * 查询出带有特殊符号的菜单地址的集合 + * @return + */ + public List queryPermissionUrlWithStar(); + + /** + * 判断用户否拥有权限 + * @param username + * @param sysPermission + * @return + */ + public boolean hasPermission(String username, SysPermission sysPermission); + + /** + * 根据用户和请求地址判断是否有此权限 + * @param username + * @param url + * @return + */ + public boolean hasPermission(String username, String url); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRolePermissionService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRolePermissionService.java new file mode 100644 index 00000000..5afb36d4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRolePermissionService.java @@ -0,0 +1,31 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysRolePermission; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 角色权限表 服务类 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +public interface ISysRolePermissionService extends IService { + + /** + * 保存授权/先删后增 + * @param roleId + * @param permissionIds + */ + public void saveRolePermission(String roleId,String permissionIds); + + /** + * 保存授权 将上次的权限和这次作比较 差异处理提高效率 + * @param roleId + * @param permissionIds + * @param lastPermissionIds + */ + public void saveRolePermission(String roleId,String permissionIds,String lastPermissionIds); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRoleService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRoleService.java new file mode 100644 index 00000000..a2c02569 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysRoleService.java @@ -0,0 +1,43 @@ +package com.jero.modules.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.common.api.vo.Result; +import com.jero.modules.system.entity.SysRole; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.springframework.web.multipart.MultipartFile; + +/** + *

+ * 角色表 服务类 + *

+ * + * @Author scott + * @since 2018-12-19 + */ +public interface ISysRoleService extends IService { + + /** + * 导入 excel ,检查 roleCode 的唯一性 + * + * @param file + * @param params + * @return + * @throws Exception + */ + Result importExcelCheckRoleCode(MultipartFile file, ImportParams params) throws Exception; + + /** + * 删除角色 + * @param roleid + * @return + */ + public boolean deleteRole(String roleid); + + /** + * 批量删除角色 + * @param roleids + * @return + */ + public boolean deleteBatchRole(String[] roleids); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysThirdAccountService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysThirdAccountService.java new file mode 100644 index 00000000..068dcef9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysThirdAccountService.java @@ -0,0 +1,19 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysThirdAccount; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysUser; + +/** + * @Description: 第三方登录账号表 + * @Author: jero-boot + * @Date: 2020-11-17 + * @Version: V1.0 + */ +public interface ISysThirdAccountService extends IService { + /**更新第三方账户信息*/ + void updateThirdUserId(SysUser sysUser,String thirdUserUuid); + /**创建第三方用户*/ + SysUser createUser(String phone, String thirdUserUuid); + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserAgentService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserAgentService.java new file mode 100644 index 00000000..4ec1ca46 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserAgentService.java @@ -0,0 +1,14 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.SysUserAgent; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 用户代理人设置 + * @Author: jero-boot + * @Date: 2019-04-17 + * @Version: V1.0 + */ +public interface ISysUserAgentService extends IService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserDepartService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserDepartService.java new file mode 100644 index 00000000..69036006 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserDepartService.java @@ -0,0 +1,41 @@ +package com.jero.modules.system.service; + + +import java.util.List; + +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.entity.SysUserDepart; +import com.jero.modules.system.model.DepartIdModel; + + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * SysUserDpeart用户组织机构service + *

+ * @Author ZhiLin + * + */ +public interface ISysUserDepartService extends IService { + + + /** + * 根据指定用户id查询部门信息 + * @param userId + * @return + */ + List queryDepartIdsOfUser(String userId); + + + /** + * 根据部门id查询用户信息 + * @param depId + * @return + */ + List queryUserByDepId(String depId); + /** + * 根据部门code,查询当前部门和下级部门的用户信息 + */ + public List queryUserByDepCode(String depCode,String realname); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserRoleService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserRoleService.java new file mode 100644 index 00000000..c70cf633 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserRoleService.java @@ -0,0 +1,18 @@ +package com.jero.modules.system.service; + +import java.util.Map; + +import com.jero.modules.system.entity.SysUserRole; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 用户角色表 服务类 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +public interface ISysUserRoleService extends IService { +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java new file mode 100644 index 00000000..11a3fb7b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java @@ -0,0 +1,236 @@ +package com.jero.modules.system.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.jero.common.api.vo.Result; +import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.modules.system.entity.SysUser; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.model.SysUserSysDepartModel; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 用户表 服务类 + *

+ * + * @Author scott + * @since 2018-12-20 + */ +public interface ISysUserService extends IService { + + /** + * 修改密码 + * + * @param username + * @param oldPassword + * @param newPassword + * @param confirmPassword + * @return + */ + public Result resetPassword(String username, String oldPassword, String newPassword, String confirmPassword); + + /** + * 修改密码 + * + * @param sysUser + * @return + */ + public Result changePassword(SysUser sysUser); + + /** + * 删除用户 + * @param userId + * @return + */ + public boolean deleteUser(String userId); + + /** + * 批量删除用户 + * @param userIds + * @return + */ + public boolean deleteBatchUsers(String userIds); + + public SysUser getUserByName(String username); + + /** + * 添加用户和用户角色关系 + * @param user + * @param roles + */ + public void addUserWithRole(SysUser user,String roles); + + + /** + * 修改用户和用户角色关系 + * @param user + * @param roles + */ + public void editUserWithRole(SysUser user,String roles); + + /** + * 获取用户的授权角色 + * @param username + * @return + */ + public List getRole(String username); + + /** + * 查询用户信息包括 部门信息 + * @param username + * @return + */ + public SysUserCacheInfo getCacheUser(String username); + + /** + * 根据部门Id查询 + * @param + * @return + */ + public IPage getUserByDepId(Page page, String departId, String username); + + /** + * 根据部门Ids查询 + * @param + * @return + */ + public IPage getUserByDepIds(Page page, List departIds, String username); + + /** + * 根据 userIds查询,查询用户所属部门的名称(多个部门名逗号隔开) + * @param + * @return + */ + public Map getDepNamesByUserIds(List userIds); + + /** + * 根据部门 Id 和 QueryWrapper 查询 + * + * @param page + * @param departId + * @param queryWrapper + * @return + */ + public IPage getUserByDepartIdAndQueryWrapper(Page page, String departId, QueryWrapper queryWrapper); + + /** + * 根据 orgCode 查询用户,包括子部门下的用户 + * + * @param orgCode + * @param userParams 用户查询条件,可为空 + * @param page 分页参数 + * @return + */ + IPage queryUserByOrgCode(String orgCode, SysUser userParams, IPage page); + + /** + * 根据角色Id查询 + * @param + * @return + */ + public IPage getUserByRoleId(Page page,String roleId, String username); + + /** + * 通过用户名获取用户角色集合 + * + * @param username 用户名 + * @return 角色集合 + */ + Set getUserRolesSet(String username); + + /** + * 通过用户名获取用户权限集合 + * + * @param username 用户名 + * @return 权限集合 + */ + Set getUserPermissionsSet(String username); + + /** + * 根据用户名设置部门ID + * @param username + * @param orgCode + */ + void updateUserDepart(String username,String orgCode); + + /** + * 根据手机号获取用户名和密码 + */ + public SysUser getUserByPhone(String phone); + + + /** + * 根据邮箱获取用户 + */ + public SysUser getUserByEmail(String email); + + + /** + * 添加用户和用户部门关系 + * @param user + * @param selectedParts + */ + void addUserWithDepart(SysUser user, String selectedParts); + + /** + * 编辑用户和用户部门关系 + * @param user + * @param departs + */ + void editUserWithDepart(SysUser user, String departs); + + /** + * 校验用户是否有效 + * @param sysUser + * @return + */ + Result checkUserIsEffective(SysUser sysUser); + + /** + * 查询被逻辑删除的用户 + */ + List queryLogicDeleted(); + + /** + * 查询被逻辑删除的用户(可拼装查询条件) + */ + List queryLogicDeleted(LambdaQueryWrapper wrapper); + + /** + * 还原被逻辑删除的用户 + */ + boolean revertLogicDeleted(List userIds, SysUser updateEntity); + + /** + * 彻底删除被逻辑删除的用户 + */ + boolean removeLogicDeleted(List userIds); + + /** + * 更新手机号、邮箱空字符串为 null + */ + @Transactional(rollbackFor = Exception.class) + boolean updateNullPhoneEmail(); + + /** + * 保存第三方用户信息 + * @param sysUser + */ + void saveThirdUser(SysUser sysUser); + + /** + * 根据部门Ids查询 + * @param + * @return + */ + List queryByDepIds(List departIds, String username); +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/ImportFileServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/ImportFileServiceImpl.java new file mode 100644 index 00000000..b4e6e1eb --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/ImportFileServiceImpl.java @@ -0,0 +1,26 @@ +package com.jero.modules.system.service.impl; + +import lombok.extern.slf4j.Slf4j; +import com.jero.common.util.CommonUtils; +import org.jeecgframework.poi.excel.imports.base.ImportFileServiceI; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * excel导入 实现类 + */ +@Slf4j +@Service +public class ImportFileServiceImpl implements ImportFileServiceI { + + @Value("${jero.path.upload}") + private String upLoadPath; + + @Value(value="${jero.uploadType}") + private String uploadType; + + @Override + public String doUpload(byte[] data) { + return CommonUtils.uploadOnlineImage(data, upLoadPath, "import", uploadType); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementSendServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementSendServiceImpl.java new file mode 100644 index 00000000..52a65b6a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementSendServiceImpl.java @@ -0,0 +1,39 @@ +package com.jero.modules.system.service.impl; + +import java.util.List; + +import javax.annotation.Resource; + +import com.jero.modules.system.entity.SysAnnouncementSend; +import com.jero.modules.system.mapper.SysAnnouncementSendMapper; +import com.jero.modules.system.model.AnnouncementSendModel; +import com.jero.modules.system.service.ISysAnnouncementSendService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 用户通告阅读标记表 + * @Author: jero-boot + * @Date: 2019-02-21 + * @Version: V1.0 + */ +@Service +public class SysAnnouncementSendServiceImpl extends ServiceImpl implements ISysAnnouncementSendService { + + @Resource + private SysAnnouncementSendMapper sysAnnouncementSendMapper; + + @Override + public List queryByUserId(String userId) { + return sysAnnouncementSendMapper.queryByUserId(userId); + } + + @Override + public Page getMyAnnouncementSendPage(Page page, + AnnouncementSendModel announcementSendModel) { + return page.setRecords(sysAnnouncementSendMapper.getMyAnnouncementSendList(page, announcementSendModel)); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementServiceImpl.java new file mode 100644 index 00000000..65e36eb8 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysAnnouncementServiceImpl.java @@ -0,0 +1,121 @@ +package com.jero.modules.system.service.impl; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import javax.annotation.Resource; + +import com.jero.common.constant.CommonConstant; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysAnnouncement; +import com.jero.modules.system.entity.SysAnnouncementSend; +import com.jero.modules.system.mapper.SysAnnouncementMapper; +import com.jero.modules.system.mapper.SysAnnouncementSendMapper; +import com.jero.modules.system.service.ISysAnnouncementService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 系统通告表 + * @Author: jero-boot + * @Date: 2019-01-02 + * @Version: V1.0 + */ +@Service +public class SysAnnouncementServiceImpl extends ServiceImpl implements ISysAnnouncementService { + + @Resource + private SysAnnouncementMapper sysAnnouncementMapper; + + @Resource + private SysAnnouncementSendMapper sysAnnouncementSendMapper; + + @Transactional + @Override + public void saveAnnouncement(SysAnnouncement sysAnnouncement) { + if(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) { + sysAnnouncementMapper.insert(sysAnnouncement); + }else { + // 1.插入通告表记录 + sysAnnouncementMapper.insert(sysAnnouncement); + // 2.插入用户通告阅读标记表记录 + String userId = sysAnnouncement.getUserIds(); + String[] userIds = userId.substring(0, (userId.length()-1)).split(","); + String anntId = sysAnnouncement.getId(); + Date refDate = new Date(); + for(int i=0;i queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(SysAnnouncementSend::getAnntId, anntId); + queryWrapper.eq(SysAnnouncementSend::getUserId, userIds[i]); + List announcementSends=sysAnnouncementSendMapper.selectList(queryWrapper); + if(announcementSends.size()<=0) { + SysAnnouncementSend announcementSend = new SysAnnouncementSend(); + announcementSend.setAnntId(anntId); + announcementSend.setUserId(userIds[i]); + announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG); + announcementSend.setReadTime(refDate); + sysAnnouncementSendMapper.insert(announcementSend); + } + } + // 3. 删除多余通知用户数据 + Collection delUserIds = Arrays.asList(userIds); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.notIn(SysAnnouncementSend::getUserId, delUserIds); + queryWrapper.eq(SysAnnouncementSend::getAnntId, anntId); + sysAnnouncementSendMapper.delete(queryWrapper); + } + return true; + } + + // @功能:流程执行完成保存消息通知 + @Override + public void saveSysAnnouncement(String title, String msgContent) { + SysAnnouncement announcement = new SysAnnouncement(); + announcement.setTitile(title); + announcement.setMsgContent(msgContent); + announcement.setSender("JERO BOOT"); + announcement.setPriority(CommonConstant.PRIORITY_L); + announcement.setMsgType(CommonConstant.MSG_TYPE_ALL); + announcement.setSendStatus(CommonConstant.HAS_SEND); + announcement.setSendTime(new Date()); + announcement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + sysAnnouncementMapper.insert(announcement); + } + + @Override + public Page querySysCementPageByUserId(Page page, String userId,String msgCategory) { + return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(page, userId, msgCategory)); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java new file mode 100644 index 00000000..1fee9b4a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java @@ -0,0 +1,1018 @@ +package com.jero.modules.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.base.Joiner; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import com.jero.common.api.dto.OnlineAuthDTO; +import com.jero.common.api.dto.message.*; +import com.jero.common.aspect.UrlMatchEnum; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.DataBaseConstant; +import com.jero.common.constant.WebsocketConst; +import com.jero.common.exception.JeroBootException; +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.*; +import com.jero.common.util.SysAnnmentTypeEnum; +import com.jero.common.util.YouBianCodeUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.message.entity.SysMessageTemplate; +import com.jero.modules.message.handle.impl.EmailSendMsgHandle; +import com.jero.modules.message.service.ISysMessageTemplateService; +import com.jero.modules.message.websocket.WebSocket; +import com.jero.modules.system.entity.*; +import com.jero.modules.system.mapper.*; +import com.jero.modules.system.service.*; +import com.jero.modules.system.util.SecurityUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.util.*; + +/** + * @Description: 底层共通业务API,提供其他独立模块调用 + * @Author: scott + * @Date:2019-4-20 + * @Version:V1.0 + */ +@Slf4j +@Service +public class SysBaseApiImpl implements ISysBaseAPI { + /** 当前系统数据库类型 */ + private static String DB_TYPE = ""; + @Autowired + private ISysMessageTemplateService sysMessageTemplateService; + @Resource + private SysLogMapper sysLogMapper; + @Resource + private SysUserMapper userMapper; + @Resource + private SysUserRoleMapper sysUserRoleMapper; + @Autowired + private ISysDepartService sysDepartService; + @Autowired + private ISysDictService sysDictService; + @Resource + private SysAnnouncementMapper sysAnnouncementMapper; + @Resource + private SysAnnouncementSendMapper sysAnnouncementSendMapper; + @Resource + private WebSocket webSocket; + @Resource + private SysRoleMapper roleMapper; + @Resource + private SysDepartMapper departMapper; + @Resource + private SysCategoryMapper categoryMapper; + + @Autowired + private ISysDataSourceService dataSourceService; + @Autowired + private ISysUserDepartService sysUserDepartService; + @Resource + private SysPermissionMapper sysPermissionMapper; + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + + @Override + @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username") + public LoginUser getUserByName(String username) { + if(oConvertUtils.isEmpty(username)) { + return null; + } + LoginUser loginUser = new LoginUser(); + SysUser sysUser = userMapper.getUserByName(username); + if(sysUser==null) { + return null; + } + BeanUtils.copyProperties(sysUser, loginUser); + return loginUser; + } + + @Override + public String translateDictFromTable(String table, String text, String code, String key) { + return sysDictService.queryTableDictTextByKey(table, text, code, key); + } + + @Override + public String translateDict(String code, String key) { + return sysDictService.queryDictTextByKey(code, key); + } + + @Override + public List queryPermissionDataRule(String component, String requestPath, String username) { + List currentSyspermission = null; + if(oConvertUtils.isNotEmpty(component)) { + //1.通过注解属性pageComponent 获取菜单 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag,0); + query.eq(SysPermission::getComponent, component); + currentSyspermission = sysPermissionMapper.selectList(query); + }else { + //1.直接通过前端请求地址查询菜单 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getMenuType,2); + query.eq(SysPermission::getDelFlag,0); + query.eq(SysPermission::getUrl, requestPath); + currentSyspermission = sysPermissionMapper.selectList(query); + //2.未找到 再通过自定义匹配URL 获取菜单 + if(currentSyspermission==null || currentSyspermission.size()==0) { + //通过自定义URL匹配规则 获取菜单(实现通过菜单配置数据权限规则,实际上针对获取数据接口进行数据规则控制) + String userMatchUrl = UrlMatchEnum.getMatchResultByUrl(requestPath); + LambdaQueryWrapper queryQserMatch = new LambdaQueryWrapper(); + queryQserMatch.eq(SysPermission::getMenuType, 1); + queryQserMatch.eq(SysPermission::getDelFlag, 0); + queryQserMatch.eq(SysPermission::getUrl, userMatchUrl); + if(oConvertUtils.isNotEmpty(userMatchUrl)){ + currentSyspermission = sysPermissionMapper.selectList(queryQserMatch); + } + } + //3.未找到 再通过正则匹配获取菜单 + if(currentSyspermission==null || currentSyspermission.size()==0) { + //通过正则匹配权限配置 + String regUrl = getRegexpUrl(requestPath); + if(regUrl!=null) { + currentSyspermission = sysPermissionMapper.selectList(new LambdaQueryWrapper().eq(SysPermission::getMenuType,2).eq(SysPermission::getUrl, regUrl).eq(SysPermission::getDelFlag,0)); + } + } + } + if(currentSyspermission!=null && currentSyspermission.size()>0){ + List dataRules = new ArrayList(); + for (SysPermission sysPermission : currentSyspermission) { + // update-begin--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722 + List temp = sysPermissionDataRuleService.queryPermissionDataRules(username, sysPermission.getId()); + if(temp!=null && temp.size()>0) { + //dataRules.addAll(temp); + dataRules = oConvertUtils.entityListToModelList(temp,SysPermissionDataRuleModel.class); + } + // update-end--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722 + } + return dataRules; + } + return null; + } + + /** + * 匹配前端传过来的地址 匹配成功返回正则地址 + * AntPathMatcher匹配地址 + *()* 匹配0个或多个字符 + *()**匹配0个或多个目录 + */ + private String getRegexpUrl(String url) { + List list = sysPermissionMapper.queryPermissionUrlWithStar(); + if(list!=null && list.size()>0) { + for (String p : list) { + PathMatcher matcher = new AntPathMatcher(); + if(matcher.match(p, url)) { + return p; + } + } + } + return null; + } + + @Override + public SysUserCacheInfo getCacheUser(String username) { + SysUserCacheInfo info = new SysUserCacheInfo(); + info.setOneDepart(true); + LoginUser user = this.getUserByName(username); + if(user!=null) { + info.setSysUserCode(user.getUsername()); + info.setSysUserName(user.getRealname()); + info.setSysOrgCode(user.getOrgCode()); + } + //多部门支持in查询 + List list = departMapper.queryUserDeparts(user.getId()); + List sysMultiOrgCode = new ArrayList(); + if(list==null || list.size()==0) { + //当前用户无部门 + //sysMultiOrgCode.add("0"); + }else if(list.size()==1) { + sysMultiOrgCode.add(list.get(0).getOrgCode()); + }else { + info.setOneDepart(false); + for (SysDepart dpt : list) { + sysMultiOrgCode.add(dpt.getOrgCode()); + } + } + info.setSysMultiOrgCode(sysMultiOrgCode); + return info; + } + + @Override + public LoginUser getUserById(String id) { + if(oConvertUtils.isEmpty(id)) { + return null; + } + LoginUser loginUser = new LoginUser(); + SysUser sysUser = userMapper.selectById(id); + if(sysUser==null) { + return null; + } + BeanUtils.copyProperties(sysUser, loginUser); + return loginUser; + } + + @Override + public List getRolesByUsername(String username) { + return sysUserRoleMapper.getRoleByUserName(username); + } + + @Override + public List getDepartIdsByUsername(String username) { + List list = sysDepartService.queryDepartsByUsername(username); + List result = new ArrayList<>(list.size()); + for (SysDepart depart : list) { + result.add(depart.getId()); + } + return result; + } + + @Override + public List getDepartNamesByUsername(String username) { + List list = sysDepartService.queryDepartsByUsername(username); + List result = new ArrayList<>(list.size()); + for (SysDepart depart : list) { + result.add(depart.getDepartName()); + } + return result; + } + + @Override + public DictModel getParentDepartId(String departId) { + SysDepart depart = departMapper.getParentDepartId(departId); + DictModel model = new DictModel(depart.getId(),depart.getParentId()); + return model; + } + + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code") + public List queryDictItemsByCode(String code) { + return sysDictService.queryDictItemsByCode(code); + } + + @Override + public List queryTableDictItemsByCode(String table, String text, String code) { + //update-begin-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799 + if(table.indexOf("#{")>=0){ + table = QueryGenerator.getSqlRuleValue(table); + } + //update-end-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799 + return sysDictService.queryTableDictItemsByCode(table, text, code); + } + + @Override + public List queryAllDepartBackDictModel() { + return sysDictService.queryAllDepartBackDictModel(); + } + + @Override + public void sendSysAnnouncement(MessageDTO message) { + this.sendSysAnnouncement(message.getFromUser(), + message.getToUser(), + message.getTitle(), + message.getContent(), + message.getCategory()); + } + + @Override + public void sendBusAnnouncement(BusMessageDTO message) { + sendBusAnnouncement(message.getFromUser(), + message.getToUser(), + message.getTitle(), + message.getContent(), + message.getCategory(), + message.getBusType(), + message.getBusId()); + } + + @Override + public void sendTemplateAnnouncement(TemplateMessageDTO message) { + String templateCode = message.getTemplateCode(); + String title = message.getTitle(); + Map map = message.getTemplateParam(); + String fromUser = message.getFromUser(); + String toUser = message.getToUser(); + + List sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode); + if(sysSmsTemplates==null||sysSmsTemplates.size()==0){ + throw new JeroBootException("消息模板不存在,模板编码:"+templateCode); + } + SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0); + //模板标题 + title = title==null?sysSmsTemplate.getTemplateName():title; + //模板内容 + String content = sysSmsTemplate.getTemplateContent(); + if(map!=null) { + for (Map.Entry entry : map.entrySet()) { + String str = "${" + entry.getKey() + "}"; + if(oConvertUtils.isNotEmpty(title)){ + title = title.replace(str, entry.getValue()); + } + content = content.replace(str, entry.getValue()); + } + } + + SysAnnouncement announcement = new SysAnnouncement(); + announcement.setTitile(title); + announcement.setMsgContent(content); + announcement.setSender(fromUser); + announcement.setPriority(CommonConstant.PRIORITY_M); + announcement.setMsgType(CommonConstant.MSG_TYPE_UESR); + announcement.setSendStatus(CommonConstant.HAS_SEND); + announcement.setSendTime(new Date()); + announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2); + announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0)); + sysAnnouncementMapper.insert(announcement); + // 2.插入用户通告阅读标记表记录 + String userId = toUser; + String[] userIds = userId.split(","); + String anntId = announcement.getId(); + for(int i=0;i map = message.getTemplateParam(); + String fromUser = message.getFromUser(); + String toUser = message.getToUser(); + String busId = message.getBusId(); + String busType = message.getBusType(); + + List sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode); + if(sysSmsTemplates==null||sysSmsTemplates.size()==0){ + throw new JeroBootException("消息模板不存在,模板编码:"+templateCode); + } + SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0); + //模板标题 + title = title==null?sysSmsTemplate.getTemplateName():title; + //模板内容 + String content = sysSmsTemplate.getTemplateContent(); + if(map!=null) { + for (Map.Entry entry : map.entrySet()) { + String str = "${" + entry.getKey() + "}"; + title = title.replace(str, entry.getValue()); + content = content.replace(str, entry.getValue()); + } + } + SysAnnouncement announcement = new SysAnnouncement(); + announcement.setTitile(title); + announcement.setMsgContent(content); + announcement.setSender(fromUser); + announcement.setPriority(CommonConstant.PRIORITY_M); + announcement.setMsgType(CommonConstant.MSG_TYPE_UESR); + announcement.setSendStatus(CommonConstant.HAS_SEND); + announcement.setSendTime(new Date()); + announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2); + announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0)); + announcement.setBusId(busId); + announcement.setBusType(busType); + announcement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType()); + announcement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage()); + sysAnnouncementMapper.insert(announcement); + // 2.插入用户通告阅读标记表记录 + String userId = toUser; + String[] userIds = userId.split(","); + String anntId = announcement.getId(); + for(int i=0;i map = templateDTO.getTemplateParam(); + List sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode); + if(sysSmsTemplates==null||sysSmsTemplates.size()==0){ + throw new JeroBootException("消息模板不存在,模板编码:"+templateCode); + } + SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0); + //模板内容 + String content = sysSmsTemplate.getTemplateContent(); + if(map!=null) { + for (Map.Entry entry : map.entrySet()) { + String str = "${" + entry.getKey() + "}"; + content = content.replace(str, entry.getValue()); + } + } + return content; + } + + @Override + public void updateSysAnnounReadFlag(String busType, String busId) { + SysAnnouncement announcement = sysAnnouncementMapper.selectOne(new QueryWrapper().eq("bus_type",busType).eq("bus_id",busId)); + if(announcement != null){ + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda(); + updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG); + updateWrapper.set(SysAnnouncementSend::getReadTime, new Date()); + updateWrapper.last("where annt_id ='"+announcement.getId()+"' and user_id ='"+userId+"'"); + SysAnnouncementSend announcementSend = new SysAnnouncementSend(); + sysAnnouncementSendMapper.update(announcementSend, updateWrapper); + } + } + + /** + * 获取数据库类型 + * @param dataSource + * @return + * @throws SQLException + */ + private String getDatabaseTypeByDataSource(DataSource dataSource) throws SQLException{ + if("".equals(DB_TYPE)) { + Connection connection = dataSource.getConnection(); + try { + DatabaseMetaData md = connection.getMetaData(); + String dbType = md.getDatabaseProductName().toLowerCase(); + if(dbType.indexOf("mysql")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL; + }else if(dbType.indexOf("oracle")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE; + }else if(dbType.indexOf("sqlserver")>=0||dbType.indexOf("sql server")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER; + }else if(dbType.indexOf("postgresql")>=0) { + DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL; + }else { + throw new JeroBootException("数据库类型:["+dbType+"]不识别!"); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally { + connection.close(); + } + } + return DB_TYPE; + + } + + @Override + public List queryAllDict() { + // 查询并排序 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.orderByAsc("create_time"); + List dicts = sysDictService.list(queryWrapper); + // 封装成 model + List list = new ArrayList(); + for (SysDict dict : dicts) { + list.add(new DictModel(dict.getDictCode(), dict.getDictName())); + } + + return list; + } + + @Override + public List queryAllDSysCategory() { + List ls = categoryMapper.selectList(null); + List res = oConvertUtils.entityListToModelList(ls,SysCategoryModel.class); + return res; + } + + @Override + public List queryFilterTableDictInfo(String table, String text, String code, String filterSql) { + return sysDictService.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql); + } + + @Override + public List queryTableDictByKeys(String table, String text, String code, String[] keyArray) { + return sysDictService.queryTableDictByKeys(table,text,code,Joiner.on(",").join(keyArray)); + } + + @Override + public List queryAllUserBackCombo() { + List list = new ArrayList(); + List userList = userMapper.selectList(new QueryWrapper().eq("status",1).eq("del_flag",0)); + for(SysUser user : userList){ + ComboModel model = new ComboModel(); + model.setTitle(user.getRealname()); + model.setId(user.getId()); + model.setUsername(user.getUsername()); + list.add(model); + } + return list; + } + + @Override + public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize) { + JSONObject json = new JSONObject(); + QueryWrapper queryWrapper = new QueryWrapper().eq("status",1).eq("del_flag",0); + List list = new ArrayList(); + Page page = new Page(pageNo, pageSize); + IPage pageList = userMapper.selectPage(page, queryWrapper); + for(SysUser user : pageList.getRecords()){ + ComboModel model = new ComboModel(); + model.setUsername(user.getUsername()); + model.setTitle(user.getRealname()); + model.setId(user.getId()); + model.setEmail(user.getEmail()); + if(oConvertUtils.isNotEmpty(userIds)){ + String[] temp = userIds.split(","); + for(int i = 0; i queryAllRole() { + List list = new ArrayList(); + List roleList = roleMapper.selectList(new QueryWrapper()); + for(SysRole role : roleList){ + ComboModel model = new ComboModel(); + model.setTitle(role.getRoleName()); + model.setId(role.getId()); + list.add(model); + } + return list; + } + + @Override + public List queryAllRole(String[] roleIds) { + List list = new ArrayList(); + List roleList = roleMapper.selectList(new QueryWrapper()); + for(SysRole role : roleList){ + ComboModel model = new ComboModel(); + model.setTitle(role.getRoleName()); + model.setId(role.getId()); + model.setRoleCode(role.getRoleCode()); + if(oConvertUtils.isNotEmpty(roleIds)) { + for (int i = 0; i < roleIds.length; i++) { + if (roleIds[i].equals(role.getId())) { + model.setChecked(true); + } + } + } + list.add(model); + } + return list; + } + + @Override + public List getRoleIdsByUsername(String username) { + return sysUserRoleMapper.getRoleIdByUserName(username); + } + + @Override + public String getDepartIdsByOrgCode(String orgCode) { + return departMapper.queryDepartIdByOrgCode(orgCode); + } + + @Override + public List getAllSysDepart() { + List departModelList = new ArrayList(); + List departList = departMapper.selectList(new QueryWrapper().eq("del_flag","0")); + for(SysDepart depart : departList){ + SysDepartModel model = new SysDepartModel(); + BeanUtils.copyProperties(depart,model); + departModelList.add(model); + } + return departModelList; + } + + @Override + public DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId) { + SysDataSource dbSource = dataSourceService.getById(dbSourceId); + if(dbSource!=null && StringUtils.isNotBlank(dbSource.getDbPassword())){ + String dbPassword = dbSource.getDbPassword(); + String decodedStr = SecurityUtil.jiemi(dbPassword); + dbSource.setDbPassword(decodedStr); + } + return new DynamicDataSourceModel(dbSource); + } + + @Override + public DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode) { + SysDataSource dbSource = dataSourceService.getOne(new LambdaQueryWrapper().eq(SysDataSource::getCode, dbSourceCode)); + if(dbSource!=null && StringUtils.isNotBlank(dbSource.getDbPassword())){ + String dbPassword = dbSource.getDbPassword(); + String decodedStr = SecurityUtil.jiemi(dbPassword); + dbSource.setDbPassword(decodedStr); + } + return new DynamicDataSourceModel(dbSource); + } + + @Override + public List getDeptHeadByDepId(String deptId) { + List userList = userMapper.selectList(new QueryWrapper().like("depart_ids",deptId).eq("status",1).eq("del_flag",0)); + List list = new ArrayList<>(); + for(SysUser user : userList){ + list.add(user.getUsername()); + } + return list; + } + + @Override + public void sendWebSocketMsg(String[] userIds, String cmd) { + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, cmd); + webSocket.sendMessage(userIds, obj.toJSONString()); + } + + @Override + public List queryAllUserByIds(String[] userIds) { + QueryWrapper queryWrapper = new QueryWrapper().eq("status",1).eq("del_flag",0); + queryWrapper.in("id",userIds); + List loginUsers = new ArrayList<>(); + List sysUsers = userMapper.selectList(queryWrapper); + for (SysUser user:sysUsers) { + LoginUser loginUser=new LoginUser(); + BeanUtils.copyProperties(user, loginUser); + loginUsers.add(loginUser); + } + return loginUsers; + } + + /** + * 推送签到人员信息 + * @param userId + */ + @Override + public void meetingSignWebsocket(String userId) { + JSONObject obj = new JSONObject(); + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_SIGN); + obj.put(WebsocketConst.MSG_USER_ID,userId); + //TODO 目前全部推送,后面修改 + webSocket.sendMessage(obj.toJSONString()); + } + + @Override + public List queryUserByNames(String[] userNames) { + QueryWrapper queryWrapper = new QueryWrapper().eq("status",1).eq("del_flag",0); + queryWrapper.in("username",userNames); + List loginUsers = new ArrayList<>(); + List sysUsers = userMapper.selectList(queryWrapper); + for (SysUser user:sysUsers) { + LoginUser loginUser=new LoginUser(); + BeanUtils.copyProperties(user, loginUser); + loginUsers.add(loginUser); + } + return loginUsers; + } + + @Override + public SysDepartModel selectAllById(String id) { + SysDepart sysDepart = sysDepartService.getById(id); + SysDepartModel sysDepartModel = new SysDepartModel(); + BeanUtils.copyProperties(sysDepart,sysDepartModel); + return sysDepartModel; + } + + @Override + public List queryDeptUsersByUserId(String userId) { + List userIds = new ArrayList<>(); + List userDepartList = sysUserDepartService.list(new QueryWrapper().eq("user_id",userId)); + if(userDepartList != null){ + //查找所属公司 + String orgCodes = ""; + for(SysUserDepart userDepart : userDepartList){ + //查询所属公司编码 + SysDepart depart = sysDepartService.getById(userDepart.getDepId()); + int length = YouBianCodeUtil.zhanweiLength; + String compyOrgCode = ""; + if(depart != null && depart.getOrgCode() != null){ + compyOrgCode = depart.getOrgCode().substring(0,length); + if(orgCodes.indexOf(compyOrgCode) == -1){ + orgCodes = orgCodes + "," + compyOrgCode; + } + } + } + if(oConvertUtils.isNotEmpty(orgCodes)){ + orgCodes = orgCodes.substring(1); + List listIds = departMapper.getSubDepIdsByOrgCodes(orgCodes.split(",")); + List userList = sysUserDepartService.list(new QueryWrapper().in("dep_id",listIds)); + for(SysUserDepart userDepart : userList){ + if(!userIds.contains(userDepart.getUserId())){ + userIds.add(userDepart.getUserId()); + } + } + } + } + return userIds; + } + + /** + * 查询用户拥有的角色集合 + * @param username + * @return + */ + @Override + public Set getUserRoleSet(String username) { + // 查询用户拥有的角色集合 + List roles = sysUserRoleMapper.getRoleByUserName(username); + log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size())); + return new HashSet<>(roles); + } + + /** + * 查询用户拥有的权限集合 + * @param username + * @return + */ + @Override + public Set getUserPermissionSet(String username) { + Set permissionSet = new HashSet<>(); + List permissionList = sysPermissionMapper.queryByUser(username); + for (SysPermission po : permissionList) { +// // TODO URL规则有问题? +// if (oConvertUtils.isNotEmpty(po.getUrl())) { +// permissionSet.add(po.getUrl()); +// } + if (oConvertUtils.isNotEmpty(po.getPerms())) { + permissionSet.add(po.getPerms()); + } + } + log.info("-------通过数据库读取用户拥有的权限Perms------username: "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) ); + return permissionSet; + } + + /** + * 判断online菜单是否有权限 + * @param onlineAuthDTO + * @return + */ + @Override + public boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO) { + String username = onlineAuthDTO.getUsername(); + List possibleUrl = onlineAuthDTO.getPossibleUrl(); + String onlineFormUrl = onlineAuthDTO.getOnlineFormUrl(); + //查询菜单 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermission::getDelFlag, 0); + query.in(SysPermission::getUrl, possibleUrl); + List permissionList = sysPermissionMapper.selectList(query); + if (permissionList == null || permissionList.size() == 0) { + //没有配置菜单 找online表单菜单地址 + SysPermission sysPermission = new SysPermission(); + sysPermission.setUrl(onlineFormUrl); + int count = sysPermissionMapper.queryCountByUsername(username, sysPermission); + if(count<=0){ + return false; + } + } else { + //找到菜单了 + boolean has = false; + for (SysPermission p : permissionList) { + int count = sysPermissionMapper.queryCountByUsername(username, p); + has = has || (count>0); + } + return has; + } + return true; + } + + /** + * 查询用户拥有的角色集合 common api 里面的接口实现 + * @param username + * @return + */ + @Override + public Set queryUserRoles(String username) { + return getUserRoleSet(username); + } + + /** + * 查询用户拥有的权限集合 common api 里面的接口实现 + * @param username + * @return + */ + @Override + public Set queryUserAuths(String username) { + return getUserPermissionSet(username); + } + + /** + * 36根据多个用户账号(逗号分隔),查询返回多个用户信息 + * @param usernames + * @return + */ + @Override + public List queryUsersByUsernames(String usernames) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysUser::getUsername,usernames.split(",")); + return JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class); + } + + @Override + public List queryUsersByIds(String ids) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysUser::getId,ids.split(",")); + return JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class); + } + + /** + * 37根据多个部门编码(逗号分隔),查询返回多个部门信息 + * @param orgCodes + * @return + */ + @Override + public List queryDepartsByOrgcodes(String orgCodes) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysDepart::getOrgCode,orgCodes.split(",")); + return JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class); + } + + @Override + public List queryDepartsByIds(String ids) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysDepart::getId,ids.split(",")); + return JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class); + } + + /** + * 发消息 + * @param fromUser + * @param toUser + * @param title + * @param msgContent + * @param setMsgCategory + */ + private void sendSysAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory) { + SysAnnouncement announcement = new SysAnnouncement(); + announcement.setTitile(title); + announcement.setMsgContent(msgContent); + announcement.setSender(fromUser); + announcement.setPriority(CommonConstant.PRIORITY_M); + announcement.setMsgType(CommonConstant.MSG_TYPE_UESR); + announcement.setSendStatus(CommonConstant.HAS_SEND); + announcement.setSendTime(new Date()); + announcement.setMsgCategory(setMsgCategory); + announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0)); + sysAnnouncementMapper.insert(announcement); + // 2.插入用户通告阅读标记表记录 + String userId = toUser; + String[] userIds = userId.split(","); + String anntId = announcement.getId(); + for(int i=0;i listParentDepartsByDepId(String departId) { + return sysDepartService.listParentDepartsByDepId(departId); + } + + + /** + * 42根据部门id查询部门所有的子级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 8:54 + * @param departId 部门id + * @return JSONObject + */ + @Override + public List listSonDepartsByDepId(String departId) { + return sysDepartService.listSonDepartsByDepId(departId); + } +} \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCategoryServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCategoryServiceImpl.java new file mode 100644 index 00000000..f216f32a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCategoryServiceImpl.java @@ -0,0 +1,207 @@ +package com.jero.modules.system.service.impl; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.jero.common.constant.FillRuleConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.FillRuleUtil; +import com.jero.common.util.YouBianCodeUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysCategory; +import com.jero.modules.system.mapper.SysCategoryMapper; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysCategoryService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Description: 分类字典 + * @Author: jero-boot + * @Date: 2019-05-29 + * @Version: V1.0 + */ +@Service +public class SysCategoryServiceImpl extends ServiceImpl implements ISysCategoryService { + + @Override + public void addSysCategory(SysCategory sysCategory) { + String categoryCode = ""; + String categoryPid = ISysCategoryService.ROOT_PID_VALUE; + String parentCode = null; + if(oConvertUtils.isNotEmpty(sysCategory.getPid())){ + categoryPid = sysCategory.getPid(); + + //PID 不是根节点 说明需要设置父节点 hasChild 为1 + if(!ISysCategoryService.ROOT_PID_VALUE.equals(categoryPid)){ + SysCategory parent = baseMapper.selectById(categoryPid); + parentCode = parent.getCode(); + if(parent!=null && !"1".equals(parent.getHasChild())){ + parent.setHasChild("1"); + baseMapper.updateById(parent); + } + } + } + //update-begin--Author:baihailong Date:20191209 for:分类字典编码规则生成器做成公用配置 + JSONObject formData = new JSONObject(); + formData.put("pid",categoryPid); + categoryCode = (String) FillRuleUtil.executeRule(FillRuleConstant.CATEGORY,formData); + //update-end--Author:baihailong Date:20191209 for:分类字典编码规则生成器做成公用配置 + sysCategory.setCode(categoryCode); + sysCategory.setPid(categoryPid); + baseMapper.insert(sysCategory); + } + + @Override + public void updateSysCategory(SysCategory sysCategory) { + if(oConvertUtils.isEmpty(sysCategory.getPid())){ + sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE); + }else{ + //如果当前节点父ID不为空 则设置父节点的hasChild 为1 + SysCategory parent = baseMapper.selectById(sysCategory.getPid()); + if(parent!=null && !"1".equals(parent.getHasChild())){ + parent.setHasChild("1"); + baseMapper.updateById(parent); + } + } + baseMapper.updateById(sysCategory); + } + + @Override + public List queryListByCode(String pcode) throws JeroBootException{ + String pid = ROOT_PID_VALUE; + if(oConvertUtils.isNotEmpty(pcode)) { + List list = baseMapper.selectList(new LambdaQueryWrapper().eq(SysCategory::getCode, pcode)); + if(list==null || list.size() ==0) { + throw new JeroBootException("该编码【"+pcode+"】不存在,请核实!"); + } + if(list.size()>1) { + throw new JeroBootException("该编码【"+pcode+"】存在多个,请核实!"); + } + pid = list.get(0).getId(); + } + return baseMapper.queryListByPid(pid,null); + } + + @Override + public List queryListByPid(String pid) { + if(oConvertUtils.isEmpty(pid)) { + pid = ROOT_PID_VALUE; + } + return baseMapper.queryListByPid(pid,null); + } + + @Override + public List queryListByPid(String pid, Map condition) { + if(oConvertUtils.isEmpty(pid)) { + pid = ROOT_PID_VALUE; + } + return baseMapper.queryListByPid(pid,condition); + } + + @Override + public String queryIdByCode(String code) { + return baseMapper.queryIdByCode(code); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSysCategory(String ids) { + String allIds = this.queryTreeChildIds(ids); + String pids = this.queryTreePids(ids); + //1.删除时将节点下所有子节点一并删除 + this.baseMapper.deleteBatchIds(Arrays.asList(allIds.split(","))); + //2.将父节点中已经没有下级的节点,修改为没有子节点 + if(oConvertUtils.isNotEmpty(pids)){ + LambdaUpdateWrapper updateWrapper = new UpdateWrapper() + .lambda() + .in(SysCategory::getId,Arrays.asList(pids.split(","))) + .set(SysCategory::getHasChild,"0"); + this.update(updateWrapper); + } + } + + /** + * 查询节点下所有子节点 + * @param ids + * @return + */ + private String queryTreeChildIds(String ids) { + //获取id数组 + String[] idArr = ids.split(","); + StringBuffer sb = new StringBuffer(); + for (String pidVal : idArr) { + if(pidVal != null){ + if(!sb.toString().contains(pidVal)){ + if(sb.toString().length() > 0){ + sb.append(","); + } + sb.append(pidVal); + this.getTreeChildIds(pidVal,sb); + } + } + } + return sb.toString(); + } + + /** + * 查询需修改标识的父节点ids + * @param ids + * @return + */ + private String queryTreePids(String ids) { + StringBuffer sb = new StringBuffer(); + //获取id数组 + String[] idArr = ids.split(","); + for (String id : idArr) { + if(id != null){ + SysCategory category = this.baseMapper.selectById(id); + //根据id查询pid值 + String metaPid = category.getPid(); + //查询此节点上一级是否还有其他子节点 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCategory::getPid,metaPid); + queryWrapper.notIn(SysCategory::getId,Arrays.asList(idArr)); + List dataList = this.baseMapper.selectList(queryWrapper); + if((dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid) + && !sb.toString().contains(metaPid)){ + //如果当前节点原本有子节点 现在木有了,更新状态 + sb.append(metaPid).append(","); + } + } + } + if(sb.toString().endsWith(",")){ + sb = sb.deleteCharAt(sb.length() - 1); + } + return sb.toString(); + } + + /** + * 递归 根据父id获取子节点id + * @param pidVal + * @param sb + * @return + */ + private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCategory::getPid,pidVal); + List dataList = baseMapper.selectList(queryWrapper); + if(dataList != null && dataList.size()>0){ + for(SysCategory category : dataList) { + if(!sb.toString().contains(category.getId())){ + sb.append(",").append(category.getId()); + } + this.getTreeChildIds(category.getId(), sb); + } + } + return sb; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCheckRuleServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCheckRuleServiceImpl.java new file mode 100644 index 00000000..eb2b5fff --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysCheckRuleServiceImpl.java @@ -0,0 +1,98 @@ +package com.jero.modules.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang.StringUtils; +import com.jero.modules.system.entity.SysCheckRule; +import com.jero.modules.system.mapper.SysCheckRuleMapper; +import com.jero.modules.system.service.ISysCheckRuleService; +import org.springframework.stereotype.Service; + +import java.util.regex.Pattern; + +/** + * @Description: 编码校验规则 + * @Author: jero-boot + * @Date: 2020-02-04 + * @Version: V1.0 + */ +@Service +public class SysCheckRuleServiceImpl extends ServiceImpl implements ISysCheckRuleService { + + /** + * 位数特殊符号,用于检查整个值,而不是裁剪某一段 + */ + private final String CHECK_ALL_SYMBOL = "*"; + + @Override + public SysCheckRule getByCode(String ruleCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCheckRule::getRuleCode, ruleCode); + return super.getOne(queryWrapper); + } + + /** + * 通过用户设定的自定义校验规则校验传入的值 + * + * @param checkRule + * @param value + * @return 返回 null代表通过校验,否则就是返回的错误提示文本 + */ + @Override + public JSONObject checkValue(SysCheckRule checkRule, String value) { + if (checkRule != null && StringUtils.isNotBlank(value)) { + String ruleJson = checkRule.getRuleJson(); + if (StringUtils.isNotBlank(ruleJson)) { + // 开始截取的下标,根据规则的顺序递增,但是 * 号不计入递增范围 + int beginIndex = 0; + JSONArray rules = JSON.parseArray(ruleJson); + for (int i = 0; i < rules.size(); i++) { + JSONObject result = new JSONObject(); + JSONObject rule = rules.getJSONObject(i); + // 位数 + String digits = rule.getString("digits"); + result.put("digits", digits); + // 验证规则 + String pattern = rule.getString("pattern"); + result.put("pattern", pattern); + // 未通过时的提示文本 + String message = rule.getString("message"); + result.put("message", message); + + // 根据用户设定的区间,截取字符串进行验证 + String checkValue; + // 是否检查整个值而不截取 + if (CHECK_ALL_SYMBOL.equals(digits)) { + checkValue = value; + } else { + int num = Integer.parseInt(digits); + int endIndex = beginIndex + num; + // 如果结束下标大于给定的值的长度,则取到最后一位 + endIndex = endIndex > value.length() ? value.length() : endIndex; + // 如果开始下标大于结束下标,则说明用户还尚未输入到该位置,直接赋空值 + if (beginIndex > endIndex) { + checkValue = ""; + } else { + checkValue = value.substring(beginIndex, endIndex); + } + result.put("beginIndex", beginIndex); + result.put("endIndex", endIndex); + beginIndex += num; + } + result.put("checkValue", checkValue); + boolean passed = Pattern.matches(pattern, checkValue); + result.put("passed", passed); + // 如果没有通过校验就返回错误信息 + if (!passed) { + return result; + } + } + } + } + return null; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysConfusionServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysConfusionServiceImpl.java new file mode 100644 index 00000000..e8e3a900 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysConfusionServiceImpl.java @@ -0,0 +1,89 @@ +package com.jero.modules.system.service.impl; + +import com.jero.modules.system.entity.SysConfusion; +import com.jero.modules.system.mapper.SysConfusionMapper; +import com.jero.modules.system.service.ISysConfusionService; +import org.springframework.stereotype.Service; +import java.util.List; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 混淆表 + * @Author: jero-boot + * @Date: 2021-08-05 + * @Version: V1.0 + */ +@Service +public class SysConfusionServiceImpl extends ServiceImpl implements ISysConfusionService { + + /** + * 保存 + * + * @param sysConfusion + * @return + */ + @Override + public void add(SysConfusion sysConfusion) { + LocalDateTime now = LocalDateTime.now(); + sysConfusion.setCreateTime(now); + sysConfusion.setUpdateTime(now); + save(sysConfusion); + } + + /** + * 更新 + * + * @param sysConfusion + * @return + */ + @Override + public void editById(SysConfusion sysConfusion) { + LocalDateTime now = LocalDateTime.now(); + sysConfusion.setUpdateTime(now); + saveOrUpdate(sysConfusion); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @Override + public void deleteById(String id) { + removeById(id); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @Override + public void deleteByIds(List ids) { + removeByIds(ids); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @Override + public SysConfusion queryById(String id) { + return getById(id); + } + + /** + * 列表查询 + * + * @return + */ + @Override + public List queryList() { + return list(); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataLogServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataLogServiceImpl.java new file mode 100644 index 00000000..b9c8fbcc --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataLogServiceImpl.java @@ -0,0 +1,33 @@ +package com.jero.modules.system.service.impl; + +import com.jero.modules.system.entity.SysDataLog; +import com.jero.modules.system.mapper.SysDataLogMapper; +import com.jero.modules.system.service.ISysDataLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +@Service +public class SysDataLogServiceImpl extends ServiceImpl implements ISysDataLogService { + @Autowired + private SysDataLogMapper logMapper; + + /** + * 添加数据日志 + */ + @Override + public void addDataLog(String tableName, String dataId, String dataContent) { + String versionNumber = "0"; + String dataVersion = logMapper.queryMaxDataVer(tableName, dataId); + if(dataVersion != null ) { + versionNumber = String.valueOf(Integer.parseInt(dataVersion)+1); + } + SysDataLog log = new SysDataLog(); + log.setDataTable(tableName); + log.setDataId(dataId); + log.setDataContent(dataContent); + log.setDataVersion(versionNumber); + this.save(log); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataSourceServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataSourceServiceImpl.java new file mode 100644 index 00000000..8e36a73c --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDataSourceServiceImpl.java @@ -0,0 +1,18 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jero.modules.system.entity.SysDataSource; +import com.jero.modules.system.mapper.SysDataSourceMapper; +import com.jero.modules.system.service.ISysDataSourceService; +import org.springframework.stereotype.Service; + +/** + * @Description: 多数据源管理 + * @Author: jero-boot + * @Date: 2019-12-25 + * @Version: V1.0 + */ +@Service +public class SysDataSourceServiceImpl extends ServiceImpl implements ISysDataSourceService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartPermissionServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartPermissionServiceImpl.java new file mode 100644 index 00000000..032b0697 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartPermissionServiceImpl.java @@ -0,0 +1,111 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepartPermission; +import com.jero.modules.system.entity.SysDepartRole; +import com.jero.modules.system.entity.SysDepartRolePermission; +import com.jero.modules.system.entity.SysPermissionDataRule; +import com.jero.modules.system.mapper.SysDepartPermissionMapper; +import com.jero.modules.system.mapper.SysDepartRoleMapper; +import com.jero.modules.system.mapper.SysDepartRolePermissionMapper; +import com.jero.modules.system.mapper.SysPermissionDataRuleMapper; +import com.jero.modules.system.service.ISysDepartPermissionService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 部门权限表 + * @Author: jero-boot + * @Date: 2020-02-11 + * @Version: V1.0 + */ +@Service +public class SysDepartPermissionServiceImpl extends ServiceImpl implements ISysDepartPermissionService { + @Resource + private SysPermissionDataRuleMapper ruleMapper; + + @Resource + private SysDepartRoleMapper sysDepartRoleMapper; + + @Resource + private SysDepartRolePermissionMapper departRolePermissionMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveDepartPermission(String departId, String permissionIds, String lastPermissionIds) { + List add = getDiff(lastPermissionIds,permissionIds); + if(add!=null && add.size()>0) { + List list = new ArrayList(); + for (String p : add) { + if(oConvertUtils.isNotEmpty(p)) { + SysDepartPermission rolepms = new SysDepartPermission(departId, p); + list.add(rolepms); + } + } + this.saveBatch(list); + } + List delete = getDiff(permissionIds,lastPermissionIds); + if(delete!=null && delete.size()>0) { + for (String permissionId : delete) { + this.remove(new QueryWrapper().lambda().eq(SysDepartPermission::getDepartId, departId).eq(SysDepartPermission::getPermissionId, permissionId)); + //删除部门权限时,删除部门角色中已授权的权限 + List sysDepartRoleList = sysDepartRoleMapper.selectList(new LambdaQueryWrapper().eq(SysDepartRole::getDepartId,departId)); + List roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList()); + if(roleIds != null && roleIds.size()>0){ + departRolePermissionMapper.delete(new LambdaQueryWrapper().eq(SysDepartRolePermission::getPermissionId,permissionId)); + } + } + } + } + + @Override + public List getPermRuleListByDeptIdAndPermId(String departId, String permissionId) { + SysDepartPermission departPermission = this.getOne(new QueryWrapper().lambda().eq(SysDepartPermission::getDepartId, departId).eq(SysDepartPermission::getPermissionId, permissionId)); + if(departPermission != null){ + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.in(SysPermissionDataRule::getId, Arrays.asList(departPermission.getDataRuleIds().split(","))); + query.orderByDesc(SysPermissionDataRule::getCreateTime); + List permRuleList = this.ruleMapper.selectList(query); + return permRuleList; + }else{ + return null; + } + } + + /** + * 从diff中找出main中没有的元素 + * @param main + * @param diff + * @return + */ + private List getDiff(String main,String diff){ + if(oConvertUtils.isEmpty(diff)) { + return null; + } + if(oConvertUtils.isEmpty(main)) { + return Arrays.asList(diff.split(",")); + } + + String[] mainArr = main.split(","); + String[] diffArr = diff.split(","); + Map map = new HashMap<>(); + for (String string : mainArr) { + map.put(string, 1); + } + List res = new ArrayList(); + for (String key : diffArr) { + if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) { + res.add(key); + } + } + return res; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java new file mode 100644 index 00000000..3bf3d7ef --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java @@ -0,0 +1,87 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.jero.common.util.IPUtils; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepartRolePermission; +import com.jero.modules.system.mapper.SysDepartRolePermissionMapper; +import com.jero.modules.system.service.ISysDepartRolePermissionService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import javax.servlet.http.HttpServletRequest; +import java.util.*; + +/** + * @Description: 部门角色权限 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +@Service +public class SysDepartRolePermissionServiceImpl extends ServiceImpl implements ISysDepartRolePermissionService { + + @Override + public void saveDeptRolePermission(String roleId, String permissionIds, String lastPermissionIds) { + String ip = ""; + try { + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //获取IP地址 + ip = IPUtils.getIpAddr(request); + } catch (Exception e) { + ip = "127.0.0.1"; + } + List add = getDiff(lastPermissionIds,permissionIds); + if(add!=null && add.size()>0) { + List list = new ArrayList(); + for (String p : add) { + if(oConvertUtils.isNotEmpty(p)) { + SysDepartRolePermission rolepms = new SysDepartRolePermission(roleId, p); + rolepms.setOperateDate(new Date()); + rolepms.setOperateIp(ip); + list.add(rolepms); + } + } + this.saveBatch(list); + } + + List delete = getDiff(permissionIds,lastPermissionIds); + if(delete!=null && delete.size()>0) { + for (String permissionId : delete) { + this.remove(new QueryWrapper().lambda().eq(SysDepartRolePermission::getRoleId, roleId).eq(SysDepartRolePermission::getPermissionId, permissionId)); + } + } + } + + /** + * 从diff中找出main中没有的元素 + * @param main + * @param diff + * @return + */ + private List getDiff(String main, String diff){ + if(oConvertUtils.isEmpty(diff)) { + return null; + } + if(oConvertUtils.isEmpty(main)) { + return Arrays.asList(diff.split(",")); + } + + String[] mainArr = main.split(","); + String[] diffArr = diff.split(","); + Map map = new HashMap<>(); + for (String string : mainArr) { + map.put(string, 1); + } + List res = new ArrayList(); + for (String key : diffArr) { + if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) { + res.add(key); + } + } + return res; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleServiceImpl.java new file mode 100644 index 00000000..a3f859a2 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleServiceImpl.java @@ -0,0 +1,25 @@ +package com.jero.modules.system.service.impl; + +import com.jero.modules.system.entity.SysDepartRole; +import com.jero.modules.system.mapper.SysDepartRoleMapper; +import com.jero.modules.system.service.ISysDepartRoleService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.List; + +/** + * @Description: 部门角色 + * @Author: jero-boot + * @Date: 2020-02-12 + * @Version: V1.0 + */ +@Service +public class SysDepartRoleServiceImpl extends ServiceImpl implements ISysDepartRoleService { + + @Override + public List queryDeptRoleByDeptAndUser(String orgCode, String userId) { + return this.baseMapper.queryDeptRoleByDeptAndUser(orgCode,userId); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleUserServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleUserServiceImpl.java new file mode 100644 index 00000000..900a850d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartRoleUserServiceImpl.java @@ -0,0 +1,93 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepartRole; +import com.jero.modules.system.entity.SysDepartRoleUser; +import com.jero.modules.system.mapper.SysDepartRoleMapper; +import com.jero.modules.system.mapper.SysDepartRoleUserMapper; +import com.jero.modules.system.service.ISysDepartRoleUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 部门角色人员信息 + * @Author: jero-boot + * @Date: 2020-02-13 + * @Version: V1.0 + */ +@Service +public class SysDepartRoleUserServiceImpl extends ServiceImpl implements ISysDepartRoleUserService { + @Autowired + private SysDepartRoleMapper sysDepartRoleMapper; + + @Override + public void deptRoleUserAdd(String userId, String newRoleId, String oldRoleId) { + List add = getDiff(oldRoleId,newRoleId); + if(add!=null && add.size()>0) { + List list = new ArrayList<>(); + for (String roleId : add) { + if(oConvertUtils.isNotEmpty(roleId)) { + SysDepartRoleUser rolepms = new SysDepartRoleUser(userId, roleId); + list.add(rolepms); + } + } + this.saveBatch(list); + } + List remove = getDiff(newRoleId,oldRoleId); + if(remove!=null && remove.size()>0) { + for (String roleId : remove) { + this.remove(new QueryWrapper().lambda().eq(SysDepartRoleUser::getUserId, userId).eq(SysDepartRoleUser::getDroleId, roleId)); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeDeptRoleUser(List userIds, String depId) { + for(String userId : userIds){ + List sysDepartRoleList = sysDepartRoleMapper.selectList(new QueryWrapper().eq("depart_id",depId)); + List roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList()); + if(roleIds != null && roleIds.size()>0){ + QueryWrapper query = new QueryWrapper<>(); + query.eq("user_id",userId).in("drole_id",roleIds); + this.remove(query); + } + } + } + + /** + * 从diff中找出main中没有的元素 + * @param main + * @param diff + * @return + */ + private List getDiff(String main, String diff){ + if(oConvertUtils.isEmpty(diff)) { + return null; + } + if(oConvertUtils.isEmpty(main)) { + return Arrays.asList(diff.split(",")); + } + + String[] mainArr = main.split(","); + String[] diffArr = diff.split(","); + Map map = new HashMap<>(); + for (String string : mainArr) { + map.put(string, 1); + } + List res = new ArrayList(); + for (String key : diffArr) { + if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) { + res.add(key); + } + } + return res; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java new file mode 100644 index 00000000..be8394be --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java @@ -0,0 +1,530 @@ +package com.jero.modules.system.service.impl; + +import java.util.*; + +import com.alibaba.fastjson.JSONObject; +import com.jero.common.system.vo.SysDepartTreeModel; +import org.apache.commons.lang.StringUtils; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.constant.FillRuleConstant; +import com.jero.common.util.FillRuleUtil; +import com.jero.common.util.YouBianCodeUtil; +import com.jero.modules.system.entity.*; +import com.jero.modules.system.mapper.*; +import com.jero.modules.system.model.DepartIdModel; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.util.FindsDepartsChildrenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import io.netty.util.internal.StringUtil; + +/** + *

+ * 部门表 服务实现类 + *

+ * + * @Author Steve + * @Since 2019-01-22 + */ +@Service +public class SysDepartServiceImpl extends ServiceImpl implements ISysDepartService { + + @Autowired + private SysUserDepartMapper userDepartMapper; + @Autowired + private SysDepartRoleMapper sysDepartRoleMapper; + @Autowired + private SysDepartPermissionMapper departPermissionMapper; + @Autowired + private SysDepartRolePermissionMapper departRolePermissionMapper; + @Autowired + private SysDepartRoleUserMapper departRoleUserMapper; + @Autowired + private SysUserMapper sysUserMapper; + + @Override + public List queryMyDeptTreeList(String departIds) { + //根据部门id获取所负责部门 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + String[] codeArr = this.getMyDeptParentOrgCode(departIds); + for(int i=0;i listDepts = this.list(query); + for(int i=0;i listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(listDepts); + return listResult; + } + + /** + * queryTreeList 对应 queryTreeList 查询所有的部门数据,以树结构形式响应给前端 + */ + @Cacheable(value = CacheConstant.SYS_DEPARTS_CACHE) + @Override + public List queryTreeList() { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); + query.orderByAsc(SysDepart::getDepartOrder); + List list = this.list(query); + // 调用wrapTreeDataToTreeList方法生成树状数据 + List listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); + return listResult; + } + + @Cacheable(value = CacheConstant.SYS_DEPART_IDS_CACHE) + @Override + public List queryDepartIdTreeList() { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); + query.orderByAsc(SysDepart::getDepartOrder); + List list = this.list(query); + // 调用wrapTreeDataToTreeList方法生成树状数据 + List listResult = FindsDepartsChildrenUtil.wrapTreeDataToDepartIdTreeList(list); + return listResult; + } + + /** + * saveDepartData 对应 add 保存用户在页面添加的新的部门对象数据 + */ + @Override + @Transactional + public void saveDepartData(SysDepart sysDepart, String username) { + if (sysDepart != null && username != null) { + if (sysDepart.getParentId() == null) { + sysDepart.setParentId(""); + } + String s = UUID.randomUUID().toString().replace("-", ""); + sysDepart.setId(s); + // 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级 + // 获取父级ID + String parentId = sysDepart.getParentId(); + //update-begin--Author:baihailong Date:20191209 for:部门编码规则生成器做成公用配置 + JSONObject formData = new JSONObject(); + formData.put("parentId",parentId); + String[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART,formData); + //update-end--Author:baihailong Date:20191209 for:部门编码规则生成器做成公用配置 + sysDepart.setOrgCode(codeArray[0]); + String orgType = codeArray[1]; + sysDepart.setOrgType(String.valueOf(orgType)); + sysDepart.setCreateTime(new Date()); + sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + this.save(sysDepart); + } + + } + + /** + * saveDepartData 的调用方法,生成部门编码和部门类型(作废逻辑) + * @deprecated + * @param parentId + * @return + */ + private String[] generateOrgCode(String parentId) { + //update-begin--Author:Steve Date:20190201 for:组织机构添加数据代码调整 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + LambdaQueryWrapper query1 = new LambdaQueryWrapper(); + String[] strArray = new String[2]; + // 创建一个List集合,存储查询返回的所有SysDepart对象 + List departList = new ArrayList<>(); + // 定义新编码字符串 + String newOrgCode = ""; + // 定义旧编码字符串 + String oldOrgCode = ""; + // 定义部门类型 + String orgType = ""; + // 如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回 + if (StringUtil.isNullOrEmpty(parentId)) { + // 线判断数据库中的表是否为空,空则直接返回初始编码 + query1.eq(SysDepart::getParentId, "").or().isNull(SysDepart::getParentId); + query1.orderByDesc(SysDepart::getOrgCode); + departList = this.list(query1); + if(departList == null || departList.size() == 0) { + strArray[0] = YouBianCodeUtil.getNextYouBianCode(null); + strArray[1] = "1"; + return strArray; + }else { + SysDepart depart = departList.get(0); + oldOrgCode = depart.getOrgCode(); + orgType = depart.getOrgType(); + newOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode); + } + } else { // 反之则查询出所有同级的部门,获取结果后有两种情况,有同级和没有同级 + // 封装查询同级的条件 + query.eq(SysDepart::getParentId, parentId); + // 降序排序 + query.orderByDesc(SysDepart::getOrgCode); + // 查询出同级部门的集合 + List parentList = this.list(query); + // 查询出父级部门 + SysDepart depart = this.getById(parentId); + // 获取父级部门的Code + String parentCode = depart.getOrgCode(); + // 根据父级部门类型算出当前部门的类型 + orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1); + // 处理同级部门为null的情况 + if (parentList == null || parentList.size() == 0) { + // 直接生成当前的部门编码并返回 + newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null); + } else { //处理有同级部门的情况 + // 获取同级部门的编码,利用工具类 + String subCode = parentList.get(0).getOrgCode(); + // 返回生成的当前部门编码 + newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode); + } + } + // 返回最终封装了部门编码和部门类型的数组 + strArray[0] = newOrgCode; + strArray[1] = orgType; + return strArray; + //update-end--Author:Steve Date:20190201 for:组织机构添加数据代码调整 + } + + + /** + * removeDepartDataById 对应 delete方法 根据ID删除相关部门数据 + * + */ + /* + * @Override + * + * @Transactional public boolean removeDepartDataById(String id) { + * System.out.println("要删除的ID 为=============================>>>>>"+id); boolean + * flag = this.removeById(id); return flag; } + */ + + /** + * updateDepartDataById 对应 edit 根据部门主键来更新对应的部门数据 + */ + @Override + @Transactional + public Boolean updateDepartDataById(SysDepart sysDepart, String username) { + if (sysDepart != null && username != null) { + sysDepart.setUpdateTime(new Date()); + sysDepart.setUpdateBy(username); + this.updateById(sysDepart); + return true; + } else { + return false; + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteBatchWithChildren(List ids) { + List idList = new ArrayList(); + for(String id: ids) { + idList.add(id); + this.checkChildrenExists(id, idList); + } + this.removeByIds(idList); + //根据部门id获取部门角色id + List roleIdList = new ArrayList<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.select(SysDepartRole::getId).in(SysDepartRole::getDepartId, idList); + List depRoleList = sysDepartRoleMapper.selectList(query); + for(SysDepartRole deptRole : depRoleList){ + roleIdList.add(deptRole.getId()); + } + //根据部门id删除用户与部门关系 + userDepartMapper.delete(new LambdaQueryWrapper().in(SysUserDepart::getDepId,idList)); + //根据部门id删除部门授权 + departPermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartPermission::getDepartId,idList)); + //根据部门id删除部门角色 + sysDepartRoleMapper.delete(new LambdaQueryWrapper().in(SysDepartRole::getDepartId,idList)); + if(roleIdList != null && roleIdList.size()>0){ + //根据角色id删除部门角色授权 + departRolePermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartRolePermission::getRoleId,roleIdList)); + //根据角色id删除部门角色用户信息 + departRoleUserMapper.delete(new LambdaQueryWrapper().in(SysDepartRoleUser::getDroleId,roleIdList)); + } + } + + @Override + public List getSubDepIdsByDepId(String departId) { + return this.baseMapper.getSubDepIdsByDepId(departId); + } + + @Override + public List getMySubDepIdsByDepId(String departIds) { + //根据部门id获取所负责部门 + String[] codeArr = this.getMyDeptParentOrgCode(departIds); + return this.baseMapper.getSubDepIdsByOrgCodes(codeArr); + } + + /** + *

+ * 根据关键字搜索相关的部门数据 + *

+ */ + @Override + public List searhBy(String keyWord,String myDeptSearch,String departIds) { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + List newList = new ArrayList<>(); + //myDeptSearch不为空时为我的部门搜索,只搜索所负责部门 + if(!StringUtil.isNullOrEmpty(myDeptSearch)){ + //departIds 为空普通用户或没有管理部门 + if(StringUtil.isNullOrEmpty(departIds)){ + return newList; + } + //根据部门id获取所负责部门 + String[] codeArr = this.getMyDeptParentOrgCode(departIds); + for(int i=0;i departList = this.list(query); + if(departList.size() > 0) { + for(SysDepart depart : departList) { + SysDepartTreeModel sysDepartTreeModel = new SysDepartTreeModel(); + // 将sysDepart转换为sysDepartTreeModel + FindsDepartsChildrenUtil.convertSysDepartToSysDepartTreeModel(depart, sysDepartTreeModel); + model = sysDepartTreeModel; + model.setChildren(null); + //update-end--Author:huangzhilin Date:20140417 for:[bugfree号]组织机构搜索功回显优化---------------------- + newList.add(model); + } + return newList; + } + return null; + } + + /** + * 根据部门id删除并且删除其可能存在的子级任何部门 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(String id) { + List idList = new ArrayList<>(); + idList.add(id); + this.checkChildrenExists(id, idList); + //清空部门树内存 + //FindsDepartsChildrenUtil.clearDepartIdModel(); + boolean ok = this.removeByIds(idList); + //根据部门id获取部门角色id + List roleIdList = new ArrayList<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.select(SysDepartRole::getId).in(SysDepartRole::getDepartId, idList); + List depRoleList = sysDepartRoleMapper.selectList(query); + for(SysDepartRole deptRole : depRoleList){ + roleIdList.add(deptRole.getId()); + } + //根据部门id删除用户与部门关系 + userDepartMapper.delete(new LambdaQueryWrapper().in(SysUserDepart::getDepId,idList)); + //根据部门id删除部门授权 + departPermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartPermission::getDepartId,idList)); + //根据部门id删除部门角色 + sysDepartRoleMapper.delete(new LambdaQueryWrapper().in(SysDepartRole::getDepartId,idList)); + if(roleIdList != null && roleIdList.size()>0){ + //根据角色id删除部门角色授权 + departRolePermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartRolePermission::getRoleId,roleIdList)); + //根据角色id删除部门角色用户信息 + departRoleUserMapper.delete(new LambdaQueryWrapper().in(SysDepartRoleUser::getDroleId,roleIdList)); + } + return ok; + } + + /** + * delete 方法调用 + * @param id + * @param idList + */ + private void checkChildrenExists(String id, List idList) { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysDepart::getParentId,id); + List departList = this.list(query); + if(departList != null && departList.size() > 0) { + for(SysDepart depart : departList) { + idList.add(depart.getId()); + this.checkChildrenExists(depart.getId(), idList); + } + } + } + + @Override + public List queryUserDeparts(String userId) { + return baseMapper.queryUserDeparts(userId); + } + + @Override + public List queryDepartsByUsername(String username) { + return baseMapper.queryDepartsByUsername(username); + } + + /** + * 根据用户所负责部门ids获取父级部门编码 + * @param departIds + * @return + */ + private String[] getMyDeptParentOrgCode(String departIds){ + //根据部门id查询所负责部门 + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); + query.in(SysDepart::getId, Arrays.asList(departIds.split(","))); + query.orderByAsc(SysDepart::getOrgCode); + List list = this.list(query); + //查找根部门 + if(list == null || list.size()==0){ + return null; + } + String orgCode = this.getMyDeptParentNode(list); + String[] codeArr = orgCode.split(","); + return codeArr; + } + + /** + * 获取负责部门父节点 + * @param list + * @return + */ + private String getMyDeptParentNode(List list){ + Map map = new HashMap<>(); + //1.先将同一公司归类 + for(SysDepart dept : list){ + String code = dept.getOrgCode().substring(0,3); + if(map.containsKey(code)){ + String mapCode = map.get(code)+","+dept.getOrgCode(); + map.put(code,mapCode); + }else{ + map.put(code,dept.getOrgCode()); + } + } + StringBuffer parentOrgCode = new StringBuffer(); + //2.获取同一公司的根节点 + for(String str : map.values()){ + String[] arrStr = str.split(","); + parentOrgCode.append(",").append(this.getMinLengthNode(arrStr)); + } + return parentOrgCode.substring(1); + } + + /** + * 获取同一公司中部门编码长度最小的部门 + * @param str + * @return + */ + private String getMinLengthNode(String[] str){ + int min =str[0].length(); + String orgCode = str[0]; + for(int i =1;i queryTreeByKeyWord(String keyWord) { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); + query.orderByAsc(SysDepart::getDepartOrder); + List list = this.list(query); + // 调用wrapTreeDataToTreeList方法生成树状数据 + List listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); + List treelist =new ArrayList<>(); + if(StringUtils.isNotBlank(keyWord)){ + this.getTreeByKeyWord(keyWord,listResult,treelist); + }else{ + return listResult; + } + return treelist; + } + + /** + * 根据关键字筛选部门信息 + * @param keyWord + * @return + */ + public void getTreeByKeyWord(String keyWord,List allResult,List newResult){ + for (SysDepartTreeModel model:allResult) { + if (model.getDepartName().contains(keyWord)){ + newResult.add(model); + continue; + }else if(model.getChildren()!=null){ + getTreeByKeyWord(keyWord,model.getChildren(),newResult); + } + } + } + /** + * 根据部门id查询部门所有的父级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 9:10 + * @param departId 部门id + * @return java.util.List + */ + @Override + public List listParentDepartsByDepId(String departId) { + List list = new ArrayList<>(); + SysDepart depart = this.getById(departId); + String parentId = depart.getParentId(); + // 查询父部门 + SysDepart parentDepart = this.getById(parentId); + while (parentDepart != null){ + list.add(parentDepart); + parentId = parentDepart.getParentId(); + parentDepart = this.getById(parentId); + } + Collections.reverse(list); + // 调用wrapTreeDataToTreeList方法生成树状数据 + return FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); + } + + /** + * 根据部门id查询部门所有的子级(不包含自己) + * @author 马志朝 + * @date 2021/3/24 9:11 + * @param departId 部门id + * @return java.util.List + */ + @Override + public List listSonDepartsByDepId(String departId) { + List realResult = new ArrayList<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + //获取直接子节点 + List sonDepartList = this.list(queryWrapper.eq(SysDepart::getParentId, departId)); + for(SysDepart depart : sonDepartList){ + String tempId = depart.getId(); + List listResult = new ArrayList<>(); + // 将每个直接子节点的parentId设为空来构成树的头节点 + depart.setParentId(null); + listResult.add(depart); + List idListTemp = new ArrayList<>(); + this.checkChildrenExists(tempId, idListTemp); + idListTemp.forEach(id -> { + SysDepart sysDepartTemp = this.getById(id); + listResult.add(sysDepartTemp); + }); + List sysDepartTreeModels = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(listResult); + realResult.addAll(sysDepartTreeModels); + } + + return realResult; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictItemServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictItemServiceImpl.java new file mode 100644 index 00000000..11922993 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictItemServiceImpl.java @@ -0,0 +1,30 @@ +package com.jero.modules.system.service.impl; + +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.mapper.SysDictItemMapper; +import com.jero.modules.system.service.ISysDictItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@Service +public class SysDictItemServiceImpl extends ServiceImpl implements ISysDictItemService { + + @Autowired + private SysDictItemMapper sysDictItemMapper; + + @Override + public List selectItemsByMainId(String mainId) { + return sysDictItemMapper.selectItemsByMainId(mainId); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java new file mode 100644 index 00000000..5b7c7eb5 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java @@ -0,0 +1,313 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDict; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.mapper.SysDictItemMapper; +import com.jero.modules.system.mapper.SysDictMapper; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysDictService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 字典表 服务实现类 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@Service +@Slf4j +public class SysDictServiceImpl extends ServiceImpl implements ISysDictService { + + @Autowired + private SysDictMapper sysDictMapper; + @Autowired + private SysDictItemMapper sysDictItemMapper; + @Resource + private RedisTemplate redisTemplate; + + /** + * 通过查询指定code 获取字典 + * @param code + * @return + */ + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code") + public List queryDictItemsByCode(String code) { + log.debug("无缓存dictCache的时候调用这里!"); + return sysDictMapper.queryDictItemsByCode(code); + } + + @Override + public Map> queryAllDictItems() { + Map> res = new HashMap>(); + List ls = sysDictMapper.selectList(null); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(SysDictItem::getStatus, 1); + queryWrapper.orderByAsc(SysDictItem::getSortOrder); + List sysDictItemList = sysDictItemMapper.selectList(queryWrapper); + + for (SysDict d : ls) { + List dictModelList = sysDictItemList.stream().filter(s -> d.getId().equals(s.getDictId())).map(item -> { + DictModel dictModel = new DictModel(); + dictModel.setText(item.getItemText()); + dictModel.setValue(item.getItemValue()); + return dictModel; + }).collect(Collectors.toList()); + res.put(d.getDictCode(), dictModelList); + } + log.debug("-------登录加载系统字典-----" + res.toString()); + return res; + } + + /** + * 通过查询指定code 获取字典值text + * @param code + * @param key + * @return + */ + + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code+':'+#key") + public String queryDictTextByKey(String code, String key) { + log.debug("无缓存dictText的时候调用这里!"); + return sysDictMapper.queryDictTextByKey(code, key); + } + + /** + * 通过查询指定table的 text code 获取字典 + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @return + */ + @Override + //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE) + public List queryTableDictItemsByCode(String table, String text, String code) { + log.debug("无缓存dictTableList的时候调用这里!"); + return sysDictMapper.queryTableDictItemsByCode(table,text,code); + } + + @Override + public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) { + log.debug("无缓存dictTableList的时候调用这里!"); + return sysDictMapper.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql); + } + + /** + * 通过查询指定table的 text code 获取字典值text + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @param key + * @return + */ + @Override + @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE) + public String queryTableDictTextByKey(String table,String text,String code, String key) { + log.debug("无缓存dictTable的时候调用这里!"); + return sysDictMapper.queryTableDictTextByKey(table,text,code,key); + } + + /** + * 通过查询指定table的 text code 获取字典,包含text和value + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @param keys (逗号分隔) + * @return + */ + @Override + //update-begin--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存 + //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_BY_KEYS_CACHE) + //update-end--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存 + public List queryTableDictByKeys(String table, String text, String code, String keys) { + if(oConvertUtils.isEmpty(keys)){ + return null; + } + String[] keyArray = keys.split(","); + List dicts = sysDictMapper.queryTableDictByKeys(table, text, code, keyArray); + List texts = new ArrayList<>(dicts.size()); + // 查询出来的顺序可能是乱的,需要排个序 + for (String key : keyArray) { + for (DictModel dict : dicts) { + if (key.equals(dict.getValue())) { + texts.add(dict.getText()); + break; + } + } + } + return texts; + } + + /** + * 根据字典类型id删除关联表中其对应的数据 + */ + @Override + public boolean deleteByDictId(SysDict sysDict) { + sysDict.setDelFlag(CommonConstant.DEL_FLAG_1); + return this.updateById(sysDict); + } + + @Override + @Transactional + public Integer saveMain(SysDict sysDict, List sysDictItemList) { + int insert=0; + try{ + insert = sysDictMapper.insert(sysDict); + if (sysDictItemList != null) { + for (SysDictItem entity : sysDictItemList) { + entity.setDictId(sysDict.getId()); + entity.setStatus(1); + sysDictItemMapper.insert(entity); + } + } + }catch(Exception e){ + return insert; + } + return insert; + } + + @Override + public List queryAllDepartBackDictModel() { + return baseMapper.queryAllDepartBackDictModel(); + } + + @Override + public List queryAllUserBackDictModel() { + return baseMapper.queryAllUserBackDictModel(); + } + + @Override + public List queryTableDictItems(String table, String text, String code, String keyword) { + return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%"); + } + + @Override + public List queryLittleTableDictItems(String table, String text, String code, String keyword, int pageSize) { + Page page = new Page(1, pageSize); + IPage pageList = baseMapper.queryTableDictItems(page, table, text, code, "%"+keyword+"%"); + return pageList.getRecords(); + } + + @Override + public List queryTreeList(String query,String table, String text, String code, String pidField, String pid, String hasChildField) { + return baseMapper.queryTreeList(query, table, text, code, pidField, pid,hasChildField); + } + + @Override + public List queryAllTreeData(String table, String text, String code, String pidField) { + // 先查出要查询的数据 + List serachTreeNode = this.baseMapper.queryTreeDataByKeyword(table, text, code, pidField); + + // 构建一个HashMap,按ID为key存储全部查询出的数据结构 + HashMap resultMap = new HashMap<>(); + for (TreeSelectModel treeSelectModel : serachTreeNode){ + resultMap.put(treeSelectModel.getKey(), treeSelectModel); + + TreeSelectModel copyTreeSelectModel = treeSelectModel; + // 叠加的查询父节点 + while (StringUtils.isNotEmpty(copyTreeSelectModel.getParentId())){ + if (resultMap.get(copyTreeSelectModel.getParentId()) != null){ + break; + } + + TreeSelectModel newTreeSelectModel = this.baseMapper.queryTreeDataItemById(copyTreeSelectModel.getParentId(), table, text, code, pidField); + if(newTreeSelectModel == null){ + break; + } + + resultMap.put(newTreeSelectModel.getKey(), newTreeSelectModel); + + copyTreeSelectModel = newTreeSelectModel; + } + } + System.out.println("aaa"); + + // 遍历map里全部的节点,取出父节点放入list,并循环添加他的子节点 + List treeNodeList = new ArrayList<>(); + for (String key : resultMap.keySet()){ + TreeSelectModel curTreeSelectModel = resultMap.get(key); + if (StringUtils.isEmpty(curTreeSelectModel.getParentId())){ + treeNodeList.add(curTreeSelectModel); + } else { + // 如果有父节点,则找出自己的父节点,把自己添加进父节点的children属性里 + TreeSelectModel existParentNode = resultMap.get(curTreeSelectModel.getParentId()); + if (existParentNode != null){ + existParentNode.getChildren().add(curTreeSelectModel); + } + } + } + + return treeNodeList; + } + + @Override + public void deleteOneDictPhysically(String id) { + this.baseMapper.deleteOneById(id); + this.sysDictItemMapper.delete(new LambdaQueryWrapper().eq(SysDictItem::getDictId,id)); + } + + @Override + public void updateDictDelFlag(int delFlag, String id) { + baseMapper.updateDictDelFlag(delFlag,id); + } + + @Override + public List queryDeleteList() { + return baseMapper.queryDeleteList(); + } + + @Override + public List queryDictTablePageList(DictQuery query, int pageSize, int pageNo) { + Page page = new Page(pageNo,pageSize,false); + Page pageList = baseMapper.queryDictTablePageList(page, query); + return pageList.getRecords(); + } + /** + * 刷新dict缓存 + * @date 2021/4/8 9:07 + * @param + * @return void + */ + @Override + public void refreshCache() { + //清空字典缓存 + Set keys = redisTemplate.keys(CacheConstant.SYS_DICT_CACHE + "*"); + Set keys2 = redisTemplate.keys(CacheConstant.SYS_DICT_TABLE_CACHE + "*"); + Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*"); + Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*"); + Set keys5 = redisTemplate.keys( "jmreport:cache:dict*"); + Set keys6 = redisTemplate.keys( "jmreport:cache:dictTable*"); + redisTemplate.delete(keys); + redisTemplate.delete(keys2); + redisTemplate.delete(keys3); + redisTemplate.delete(keys4); + redisTemplate.delete(keys5); + redisTemplate.delete(keys6); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysFillRuleServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysFillRuleServiceImpl.java new file mode 100644 index 00000000..2684a7c1 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysFillRuleServiceImpl.java @@ -0,0 +1,18 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jero.modules.system.entity.SysFillRule; +import com.jero.modules.system.mapper.SysFillRuleMapper; +import com.jero.modules.system.service.ISysFillRuleService; +import org.springframework.stereotype.Service; + +/** + * @Description: 填值规则 + * @Author: jero-boot + * @Date: 2019-11-07 + * @Version: V1.0 + */ +@Service("sysFillRuleServiceImpl") +public class SysFillRuleServiceImpl extends ServiceImpl implements ISysFillRuleService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysGatewayRouteServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysGatewayRouteServiceImpl.java new file mode 100644 index 00000000..a436d3a2 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysGatewayRouteServiceImpl.java @@ -0,0 +1,102 @@ +package com.jero.modules.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.base.BaseMap; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.GlobalConstants; +import com.jero.modules.system.entity.SysGatewayRoute; +import com.jero.modules.system.mapper.SysGatewayRouteMapper; +import com.jero.modules.system.service.ISysGatewayRouteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Description: gateway路由管理 + * @Author: jero-boot + * @Date: 2020-05-26 + * @Version: V1.0 + */ +@Service +@Slf4j +public class SysGatewayRouteServiceImpl extends ServiceImpl implements ISysGatewayRouteService { + + @Autowired + private RedisTemplate redisTemplate; + + + @Override + public void addRoute2Redis(String key) { + List ls = this.list(new LambdaQueryWrapper().eq(SysGatewayRoute::getStatus, 1)); + redisTemplate.opsForValue().set(key, JSON.toJSONString(ls)); + } + + @Override + public void deleteById(String id) { + this.removeById(id); + this.resreshRouter(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAll(JSONObject json) { + log.info("--gateway 路由配置修改--"); + try { + json = json.getJSONObject("router"); + String id = json.getString("id"); + SysGatewayRoute route = getById(id); + if (ObjectUtil.isEmpty(route)) { + route = new SysGatewayRoute(); + } + route.setRouterId(json.getString("routerId")); + route.setName(json.getString("name")); + route.setPredicates(json.getString("predicates")); + String filters = json.getString("filters"); + if (ObjectUtil.isEmpty(filters)) { + filters = "[]"; + } + route.setFilters(filters); + route.setUri(json.getString("uri")); + if (json.get("status") == null) { + route.setStatus(1); + } else { + route.setStatus(json.getInteger("status")); + } + this.saveOrUpdate(route); + resreshRouter(); + } catch (Exception e) { + log.error("路由配置解析失败", e); + resreshRouter(); + e.printStackTrace(); + } + } + + /** + * 更新redis路由缓存 + */ + private void resreshRouter() { + //更新redis路由缓存 + addRoute2Redis(CacheConstant.GATEWAY_ROUTES); + BaseMap params = new BaseMap(); + params.put(GlobalConstants.HANDLER_NAME, "loderRouderHandler"); + //刷新网关 + redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params); + } + + @Override + public void clearRedis() { + redisTemplate.opsForValue().set(CacheConstant.GATEWAY_ROUTES, null); + } + + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysLogServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysLogServiceImpl.java new file mode 100644 index 00000000..fc25d3d9 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysLogServiceImpl.java @@ -0,0 +1,66 @@ +package com.jero.modules.system.service.impl; + +import java.sql.SQLException; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.common.util.CommonUtils; +import com.jero.modules.system.entity.SysLog; +import com.jero.modules.system.mapper.SysLogMapper; +import com.jero.modules.system.service.ISysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + *

+ * 系统日志表 服务实现类 + *

+ * + * @Author zhangweijian + * @since 2018-12-26 + */ +@Service +public class SysLogServiceImpl extends ServiceImpl implements ISysLogService { + + @Resource + private SysLogMapper sysLogMapper; + @Autowired + private ISysBaseAPI sysBaseAPI; + + /** + * @功能:清空所有日志记录 + */ + @Override + public void removeAll() { + sysLogMapper.removeAll(); + } + + @Override + public Long findTotalVisitCount() { + return sysLogMapper.findTotalVisitCount(); + } + + //update-begin--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + @Override + public Long findTodayVisitCount(Date dayStart, Date dayEnd) { + return sysLogMapper.findTodayVisitCount(dayStart,dayEnd); + } + + @Override + public Long findTodayIp(Date dayStart, Date dayEnd) { + return sysLogMapper.findTodayIp(dayStart,dayEnd); + } + //update-end--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 + + @Override + public List> findVisitCount(Date dayStart, Date dayEnd) { + String dbType = CommonUtils.getDatabaseType(); + return sysLogMapper.findVisitCount(dayStart, dayEnd,dbType); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionDataRuleImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionDataRuleImpl.java new file mode 100644 index 00000000..43e9cb42 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionDataRuleImpl.java @@ -0,0 +1,116 @@ +package com.jero.modules.system.service.impl; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.annotation.Resource; + +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.entity.SysPermissionDataRule; +import com.jero.modules.system.mapper.SysPermissionDataRuleMapper; +import com.jero.modules.system.mapper.SysPermissionMapper; +import com.jero.modules.system.service.ISysPermissionDataRuleService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + *

+ * 菜单权限规则 服务实现类 + *

+ * + * @Author huangzhilin + * @since 2019-04-01 + */ +@Service +public class SysPermissionDataRuleImpl extends ServiceImpl + implements ISysPermissionDataRuleService { + + @Resource + private SysPermissionMapper sysPermissionMapper; + + /** + * 根据菜单id查询其对应的权限数据 + */ + @Override + public List getPermRuleListByPermId(String permissionId) { + LambdaQueryWrapper query = new LambdaQueryWrapper(); + query.eq(SysPermissionDataRule::getPermissionId, permissionId); + query.orderByDesc(SysPermissionDataRule::getCreateTime); + List permRuleList = this.list(query); + return permRuleList; + } + + /** + * 根据前端传递的权限名称和权限值参数来查询权限数据 + */ + @Override + public List queryPermissionRule(SysPermissionDataRule permRule) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(permRule, null); + return this.list(queryWrapper); + } + + @Override + public List queryPermissionDataRules(String username,String permissionId) { + List idsList = this.baseMapper.queryDataRuleIds(username, permissionId); + //update-begin--Author:scott Date:20191119 for:数据权限失效问题处理-------------------- + if(idsList==null || idsList.size()==0) { + return null; + } + //update-end--Author:scott Date:20191119 for:数据权限失效问题处理-------------------- + Set set = new HashSet(); + for (String ids : idsList) { + if(oConvertUtils.isEmpty(ids)) { + continue; + } + String[] arr = ids.split(","); + for (String id : arr) { + if(oConvertUtils.isNotEmpty(id) && !set.contains(id)) { + set.add(id); + } + } + } + if(set.size()==0) { + return null; + } + return this.baseMapper.selectList(new QueryWrapper().in("id", set).eq("status",CommonConstant.STATUS_1)); + } + + @Override + @Transactional + public void savePermissionDataRule(SysPermissionDataRule sysPermissionDataRule) { + this.save(sysPermissionDataRule); + SysPermission permission = sysPermissionMapper.selectById(sysPermissionDataRule.getPermissionId()); + if(permission!=null && (permission.getRuleFlag()==null || permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_0))) { + permission.setRuleFlag(CommonConstant.RULE_FLAG_1); + sysPermissionMapper.updateById(permission); + } + } + + @Override + @Transactional + public void deletePermissionDataRule(String dataRuleId) { + SysPermissionDataRule dataRule = this.baseMapper.selectById(dataRuleId); + if(dataRule!=null) { + this.removeById(dataRuleId); + Integer count = this.baseMapper.selectCount(new LambdaQueryWrapper().eq(SysPermissionDataRule::getPermissionId, dataRule.getPermissionId())); + //注:同一个事务中删除后再查询是会认为数据已被删除的 若事务回滚上述删除无效 + if(count==null || count==0) { + SysPermission permission = sysPermissionMapper.selectById(dataRule.getPermissionId()); + if(permission!=null && permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_1)) { + permission.setRuleFlag(CommonConstant.RULE_FLAG_0); + sysPermissionMapper.updateById(permission); + } + } + } + + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 00000000..042ce05d --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,266 @@ +package com.jero.modules.system.service.impl; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysPermission; +import com.jero.modules.system.entity.SysPermissionDataRule; +import com.jero.modules.system.mapper.SysDepartPermissionMapper; +import com.jero.modules.system.mapper.SysDepartRolePermissionMapper; +import com.jero.modules.system.mapper.SysPermissionMapper; +import com.jero.modules.system.mapper.SysRolePermissionMapper; +import com.jero.modules.system.model.TreeModel; +import com.jero.modules.system.service.ISysPermissionDataRuleService; +import com.jero.modules.system.service.ISysPermissionService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + *

+ * 菜单权限表 服务实现类 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Service +public class SysPermissionServiceImpl extends ServiceImpl implements ISysPermissionService { + + @Resource + private SysPermissionMapper sysPermissionMapper; + + @Resource + private ISysPermissionDataRuleService permissionDataRuleService; + + @Resource + private SysRolePermissionMapper sysRolePermissionMapper; + + @Resource + private SysDepartPermissionMapper sysDepartPermissionMapper; + + @Resource + private SysDepartRolePermissionMapper sysDepartRolePermissionMapper; + + @Override + public List queryListByParentId(String parentId) { + return sysPermissionMapper.queryListByParentId(parentId); + } + + /** + * 真实删除 + */ + @Override + @Transactional + @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) + public void deletePermission(String id) throws JeroBootException { + SysPermission sysPermission = this.getById(id); + if(sysPermission==null) { + throw new JeroBootException("未找到菜单信息"); + } + String pid = sysPermission.getParentId(); + if(oConvertUtils.isNotEmpty(pid)) { + int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); + if(count==1) { + //若父节点无其他子节点,则该父节点是叶子节点 + this.sysPermissionMapper.setMenuLeaf(pid, 1); + } + } + sysPermissionMapper.deleteById(id); + // 该节点可能是子节点但也可能是其它节点的父节点,所以需要级联删除 + this.removeChildrenBy(sysPermission.getId()); + //关联删除 + Map map = new HashMap<>(); + map.put("permission_id",id); + //删除数据规则 + this.deletePermRuleByPermId(id); + //删除角色授权表 + sysRolePermissionMapper.deleteByMap(map); + //删除部门权限表 + sysDepartPermissionMapper.deleteByMap(map); + //删除部门角色授权 + sysDepartRolePermissionMapper.deleteByMap(map); + } + + /** + * 根据父id删除其关联的子节点数据 + * + * @return + */ + public void removeChildrenBy(String parentId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + // 封装查询条件parentId为主键, + query.eq(SysPermission::getParentId, parentId); + // 查出该主键下的所有子级 + List permissionList = this.list(query); + if (permissionList != null && permissionList.size() > 0) { + String id = ""; // id + int num = 0; // 查出的子级数量 + // 如果查出的集合不为空, 则先删除所有 + this.remove(query); + // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级 + for (int i = 0, len = permissionList.size(); i < len; i++) { + id = permissionList.get(i).getId(); + Map map = new HashMap<>(); + map.put("permission_id",id); + //删除数据规则 + this.deletePermRuleByPermId(id); + //删除角色授权表 + sysRolePermissionMapper.deleteByMap(map); + //删除部门权限表 + sysDepartPermissionMapper.deleteByMap(map); + //删除部门角色授权 + sysDepartRolePermissionMapper.deleteByMap(map); + num = this.count(new LambdaQueryWrapper().eq(SysPermission::getParentId, id)); + // 如果有, 则递归 + if (num > 0) { + this.removeChildrenBy(id); + } + } + } + } + + /** + * 逻辑删除 + */ + @Override + @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) + //@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true,condition="#sysPermission.menuType==2") + public void deletePermissionLogical(String id) throws JeroBootException { + SysPermission sysPermission = this.getById(id); + if(sysPermission==null) { + throw new JeroBootException("未找到菜单信息"); + } + String pid = sysPermission.getParentId(); + int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); + if(count==1) { + //若父节点无其他子节点,则该父节点是叶子节点 + this.sysPermissionMapper.setMenuLeaf(pid, 1); + } + sysPermission.setDelFlag(1); + this.updateById(sysPermission); + } + + @Override + @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) + public void addPermission(SysPermission sysPermission) throws JeroBootException { + //---------------------------------------------------------------------- + //判断是否是一级菜单,是的话清空父菜单 + if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { + sysPermission.setParentId(null); + } + //---------------------------------------------------------------------- + String pid = sysPermission.getParentId(); + if(oConvertUtils.isNotEmpty(pid)) { + //设置父节点不为叶子节点 + this.sysPermissionMapper.setMenuLeaf(pid, 0); + } + sysPermission.setCreateTime(new Date()); + sysPermission.setDelFlag(0); + sysPermission.setLeaf(true); + this.save(sysPermission); + } + + @Override + @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) + public void editPermission(SysPermission sysPermission) throws JeroBootException { + SysPermission p = this.getById(sysPermission.getId()); + //TODO 该节点判断是否还有子节点 + if(p==null) { + throw new JeroBootException("未找到菜单信息"); + }else { + sysPermission.setUpdateTime(new Date()); + //---------------------------------------------------------------------- + //Step1.判断是否是一级菜单,是的话清空父菜单ID + if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { + sysPermission.setParentId(""); + } + //Step2.判断菜单下级是否有菜单,无则设置为叶子节点 + int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, sysPermission.getId())); + if(count==0) { + sysPermission.setLeaf(true); + } + //---------------------------------------------------------------------- + this.updateById(sysPermission); + + //如果当前菜单的父菜单变了,则需要修改新父菜单和老父菜单的,叶子节点状态 + String pid = sysPermission.getParentId(); + if((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId())) { + //a.设置新的父菜单不为叶子节点 + this.sysPermissionMapper.setMenuLeaf(pid, 0); + //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点 + int cc = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, p.getParentId())); + if(cc==0) { + if(oConvertUtils.isNotEmpty(p.getParentId())) { + this.sysPermissionMapper.setMenuLeaf(p.getParentId(), 1); + } + } + + } + } + + } + + @Override + public List queryByUser(String username) { + return this.sysPermissionMapper.queryByUser(username); + } + + /** + * 根据permissionId删除其关联的SysPermissionDataRule表中的数据 + */ + @Override + public void deletePermRuleByPermId(String id) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysPermissionDataRule::getPermissionId, id); + int countValue = this.permissionDataRuleService.count(query); + if(countValue > 0) { + this.permissionDataRuleService.remove(query); + } + } + + /** + * 获取模糊匹配规则的数据权限URL + */ + @Override + @Cacheable(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE) + public List queryPermissionUrlWithStar() { + return this.baseMapper.queryPermissionUrlWithStar(); + } + + @Override + public boolean hasPermission(String username, SysPermission sysPermission) { + int count = baseMapper.queryCountByUsername(username,sysPermission); + if(count>0){ + return true; + }else{ + return false; + } + } + + @Override + public boolean hasPermission(String username, String url) { + SysPermission sysPermission = new SysPermission(); + sysPermission.setUrl(url); + int count = baseMapper.queryCountByUsername(username,sysPermission); + if(count>0){ + return true; + }else{ + return false; + } + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRolePermissionServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRolePermissionServiceImpl.java new file mode 100644 index 00000000..5e85be41 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRolePermissionServiceImpl.java @@ -0,0 +1,121 @@ +package com.jero.modules.system.service.impl; + +import java.util.*; + +import com.jero.common.constant.CacheConstant; +import com.jero.common.util.IPUtils; +import com.jero.common.util.SpringContextUtils; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysRolePermission; +import com.jero.modules.system.mapper.SysRolePermissionMapper; +import com.jero.modules.system.service.ISysRolePermissionService; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; + +/** + *

+ * 角色权限表 服务实现类 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Service +public class SysRolePermissionServiceImpl extends ServiceImpl implements ISysRolePermissionService { + + @Override + public void saveRolePermission(String roleId, String permissionIds) { + String ip = ""; + try { + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //获取IP地址 + ip = IPUtils.getIpAddr(request); + } catch (Exception e) { + ip = "127.0.0.1"; + } + LambdaQueryWrapper query = new QueryWrapper().lambda().eq(SysRolePermission::getRoleId, roleId); + this.remove(query); + List list = new ArrayList(); + String[] arr = permissionIds.split(","); + for (String p : arr) { + if(oConvertUtils.isNotEmpty(p)) { + SysRolePermission rolepms = new SysRolePermission(roleId, p); + rolepms.setOperateDate(new Date()); + rolepms.setOperateIp(ip); + list.add(rolepms); + } + } + this.saveBatch(list); + } + + @Override + public void saveRolePermission(String roleId, String permissionIds, String lastPermissionIds) { + String ip = ""; + try { + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //获取IP地址 + ip = IPUtils.getIpAddr(request); + } catch (Exception e) { + ip = "127.0.0.1"; + } + List add = getDiff(lastPermissionIds,permissionIds); + if(add!=null && add.size()>0) { + List list = new ArrayList(); + for (String p : add) { + if(oConvertUtils.isNotEmpty(p)) { + SysRolePermission rolepms = new SysRolePermission(roleId, p); + rolepms.setOperateDate(new Date()); + rolepms.setOperateIp(ip); + list.add(rolepms); + } + } + this.saveBatch(list); + } + + List delete = getDiff(permissionIds,lastPermissionIds); + if(delete!=null && delete.size()>0) { + for (String permissionId : delete) { + this.remove(new QueryWrapper().lambda().eq(SysRolePermission::getRoleId, roleId).eq(SysRolePermission::getPermissionId, permissionId)); + } + } + } + + /** + * 从diff中找出main中没有的元素 + * @param main + * @param diff + * @return + */ + private List getDiff(String main,String diff){ + if(oConvertUtils.isEmpty(diff)) { + return null; + } + if(oConvertUtils.isEmpty(main)) { + return Arrays.asList(diff.split(",")); + } + + String[] mainArr = main.split(","); + String[] diffArr = diff.split(","); + Map map = new HashMap<>(); + for (String string : mainArr) { + map.put(string, 1); + } + List res = new ArrayList(); + for (String key : diffArr) { + if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) { + res.add(key); + } + } + return res; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 00000000..a0fd63aa --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,93 @@ +package com.jero.modules.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.poi.ss.formula.functions.T; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CommonConstant; +import com.jero.common.util.ImportExcelUtil; +import com.jero.common.util.PmsUtil; +import com.jero.modules.quartz.service.IQuartzJobService; +import com.jero.modules.system.entity.SysRole; +import com.jero.modules.system.mapper.SysRoleMapper; +import com.jero.modules.system.mapper.SysUserMapper; +import com.jero.modules.system.service.ISysRoleService; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + *

+ * 角色表 服务实现类 + *

+ * + * @Author scott + * @since 2018-12-19 + */ +@Service +public class SysRoleServiceImpl extends ServiceImpl implements ISysRoleService { + @Autowired + SysRoleMapper sysRoleMapper; + @Autowired + SysUserMapper sysUserMapper; + + @Override + public Result importExcelCheckRoleCode(MultipartFile file, ImportParams params) throws Exception { + List listSysRoles = ExcelImportUtil.importExcel(file.getInputStream(), SysRole.class, params); + int totalCount = listSysRoles.size(); + List errorStrs = new ArrayList<>(); + + // 去除 listSysRoles 中重复的数据 + for (int i = 0; i < listSysRoles.size(); i++) { + String roleCodeI =((SysRole)listSysRoles.get(i)).getRoleCode(); + for (int j = i + 1; j < listSysRoles.size(); j++) { + String roleCodeJ =((SysRole)listSysRoles.get(j)).getRoleCode(); + // 发现重复数据 + if (roleCodeI.equals(roleCodeJ)) { + errorStrs.add("第 " + (j + 1) + " 行的 roleCode 值:" + roleCodeI + " 已存在,忽略导入"); + listSysRoles.remove(j); + break; + } + } + } + // 去掉 sql 中的重复数据 + Integer errorLines=0; + Integer successLines=0; + List list = ImportExcelUtil.importDateSave(listSysRoles, ISysRoleService.class, errorStrs, CommonConstant.SQL_INDEX_UNIQ_SYS_ROLE_CODE); + errorLines+=list.size(); + successLines+=(listSysRoles.size()-errorLines); + return ImportExcelUtil.imporReturnRes(errorLines,successLines,list); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteRole(String roleid) { + //1.删除角色和用户关系 + sysRoleMapper.deleteRoleUserRelation(roleid); + //2.删除角色和权限关系 + sysRoleMapper.deleteRolePermissionRelation(roleid); + //3.删除角色 + this.removeById(roleid); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteBatchRole(String[] roleIds) { + //1.删除角色和用户关系 + sysUserMapper.deleteBathRoleUserRelation(roleIds); + //2.删除角色和权限关系 + sysUserMapper.deleteBathRolePermissionRelation(roleIds); + //3.删除角色 + this.removeByIds(Arrays.asList(roleIds)); + return true; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysThirdAccountServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysThirdAccountServiceImpl.java new file mode 100644 index 00000000..446596cf --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysThirdAccountServiceImpl.java @@ -0,0 +1,106 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.constant.CommonConstant; +import com.jero.common.util.PasswordUtil; +import com.jero.common.util.UUIDGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysRole; +import com.jero.modules.system.entity.SysThirdAccount; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.entity.SysUserRole; +import com.jero.modules.system.mapper.SysRoleMapper; +import com.jero.modules.system.mapper.SysThirdAccountMapper; +import com.jero.modules.system.mapper.SysUserMapper; +import com.jero.modules.system.mapper.SysUserRoleMapper; +import com.jero.modules.system.service.ISysThirdAccountService; +import com.jero.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.List; + +/** + * @Description: 第三方登录账号表 + * @Author: jero-boot + * @Date: 2020-11-17 + * @Version: V1.0 + */ +@Service +public class SysThirdAccountServiceImpl extends ServiceImpl implements ISysThirdAccountService { + + @Autowired + private SysThirdAccountMapper sysThirdAccountMapper; + + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Override + public void updateThirdUserId(SysUser sysUser,String thirdUserUuid) { + //修改第三方登录账户表使其进行添加用户id + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid); + SysThirdAccount account = sysThirdAccountMapper.selectOne(query); + SysThirdAccount sysThirdAccount = new SysThirdAccount(); + sysThirdAccount.setSysUserId(sysUser.getId()); + //根据当前用户id和登录方式查询第三方登录表 + LambdaQueryWrapper thirdQuery = new LambdaQueryWrapper<>(); + thirdQuery.eq(SysThirdAccount::getSysUserId,sysUser.getId()); + thirdQuery.eq(SysThirdAccount::getThirdType,account.getThirdType()); + SysThirdAccount sysThirdAccounts = sysThirdAccountMapper.selectOne(thirdQuery); + if(sysThirdAccounts!=null){ + sysThirdAccountMapper.deleteById(sysThirdAccounts.getId()); + } + //更新用户账户表sys_user_id + sysThirdAccountMapper.update(sysThirdAccount,query); + } + + @Override + public SysUser createUser(String phone, String thirdUserUuid) { + //先查询第三方,获取登录方式 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid); + SysThirdAccount account = sysThirdAccountMapper.selectOne(query); + //添加用户 + SysUser user = new SysUser(); + user.setActivitiSync(CommonConstant.ACT_SYNC_0); + user.setDelFlag(CommonConstant.DEL_FLAG_0); + user.setStatus(1); + user.setUsername(thirdUserUuid); + user.setPhone(phone); + //设置初始密码 + String salt = oConvertUtils.randomGen(8); + user.setSalt(salt); + String passwordEncode = PasswordUtil.encrypt(user.getUsername(), "123456", salt); + user.setPassword(passwordEncode); + user.setRealname(account.getRealname()); + user.setAvatar(account.getAvatar()); + String s = this.saveThirdUser(user); + //更新用户第三方账户表的userId + SysThirdAccount sysThirdAccount = new SysThirdAccount(); + sysThirdAccount.setSysUserId(s); + sysThirdAccountMapper.update(sysThirdAccount,query); + return user; + } + + public String saveThirdUser(SysUser sysUser) { + //保存用户 + String userid = UUIDGenerator.generate(); + sysUser.setId(userid); + sysUserMapper.insert(sysUser); + //获取第三方角色 + SysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper().eq(SysRole::getRoleCode, "third_role")); + //保存用户角色 + SysUserRole userRole = new SysUserRole(); + userRole.setRoleId(sysRole.getId()); + userRole.setUserId(userid); + sysUserRoleMapper.insert(userRole); + return userid; + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserAgentServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserAgentServiceImpl.java new file mode 100644 index 00000000..172ec90e --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserAgentServiceImpl.java @@ -0,0 +1,19 @@ +package com.jero.modules.system.service.impl; + +import com.jero.modules.system.entity.SysUserAgent; +import com.jero.modules.system.mapper.SysUserAgentMapper; +import com.jero.modules.system.service.ISysUserAgentService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 用户代理人设置 + * @Author: jero-boot + * @Date: 2019-04-17 + * @Version: V1.0 + */ +@Service +public class SysUserAgentServiceImpl extends ServiceImpl implements ISysUserAgentService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserDepartServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserDepartServiceImpl.java new file mode 100644 index 00000000..0f5b77ab --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserDepartServiceImpl.java @@ -0,0 +1,133 @@ +package com.jero.modules.system.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.entity.SysUserDepart; +import com.jero.modules.system.mapper.SysUserDepartMapper; +import com.jero.modules.system.model.DepartIdModel; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.service.ISysUserDepartService; +import com.jero.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + *

+ * 用户部门表实现类 + *

+ * @Author ZhiLin + *@since 2019-02-22 + */ +@Service +public class SysUserDepartServiceImpl extends ServiceImpl implements ISysUserDepartService { + @Autowired + private ISysDepartService sysDepartService; + @Autowired + private ISysUserService sysUserService; + + + /** + * 根据用户id查询部门信息 + */ + @Override + public List queryDepartIdsOfUser(String userId) { + LambdaQueryWrapper queryUDep = new LambdaQueryWrapper(); + LambdaQueryWrapper queryDep = new LambdaQueryWrapper(); + try { + queryUDep.eq(SysUserDepart::getUserId, userId); + List depIdList = new ArrayList<>(); + List depIdModelList = new ArrayList<>(); + List userDepList = this.list(queryUDep); + if(userDepList != null && userDepList.size() > 0) { + for(SysUserDepart userDepart : userDepList) { + depIdList.add(userDepart.getDepId()); + } + queryDep.in(SysDepart::getId, depIdList); + List depList = sysDepartService.list(queryDep); + if(depList != null || depList.size() > 0) { + for(SysDepart depart : depList) { + depIdModelList.add(new DepartIdModel().convertByUserDepart(depart)); + } + } + return depIdModelList; + } + }catch(Exception e) { + e.fillInStackTrace(); + } + return null; + + + } + + + /** + * 根据部门id查询用户信息 + */ + @Override + public List queryUserByDepId(String depId) { + LambdaQueryWrapper queryUDep = new LambdaQueryWrapper(); + queryUDep.eq(SysUserDepart::getDepId, depId); + List userIdList = new ArrayList<>(); + List uDepList = this.list(queryUDep); + if(uDepList != null && uDepList.size() > 0) { + for(SysUserDepart uDep : uDepList) { + userIdList.add(uDep.getUserId()); + } + List userList = (List) sysUserService.listByIds(userIdList); + //update-begin-author:taoyan date:201905047 for:接口调用查询返回结果不能返回密码相关信息 + for (SysUser sysUser : userList) { + sysUser.setSalt(""); + sysUser.setPassword(""); + } + //update-end-author:taoyan date:201905047 for:接口调用查询返回结果不能返回密码相关信息 + return userList; + } + return new ArrayList(); + } + + /** + * 根据部门code,查询当前部门和下级部门的 用户信息 + */ + @Override + public List queryUserByDepCode(String depCode,String realname) { + LambdaQueryWrapper queryByDepCode = new LambdaQueryWrapper(); + queryByDepCode.likeRight(SysDepart::getOrgCode,depCode); + List sysDepartList = sysDepartService.list(queryByDepCode); + List depIds = sysDepartList.stream().map(SysDepart::getId).collect(Collectors.toList()); + + LambdaQueryWrapper queryUDep = new LambdaQueryWrapper(); + queryUDep.in(SysUserDepart::getDepId, depIds); + List userIdList = new ArrayList<>(); + List uDepList = this.list(queryUDep); + if(uDepList != null && uDepList.size() > 0) { + for(SysUserDepart uDep : uDepList) { + userIdList.add(uDep.getUserId()); + } + LambdaQueryWrapper queryUser = new LambdaQueryWrapper(); + queryUser.in(SysUser::getId,userIdList); + if(oConvertUtils.isNotEmpty(realname)){ + queryUser.like(SysUser::getRealname,realname.trim()); + } + List userList = (List) sysUserService.list(queryUser); + //update-begin-author:taoyan date:201905047 for:接口调用查询返回结果不能返回密码相关信息 + for (SysUser sysUser : userList) { + sysUser.setSalt(""); + sysUser.setPassword(""); + } + //update-end-author:taoyan date:201905047 for:接口调用查询返回结果不能返回密码相关信息 + return userList; + } + return new ArrayList(); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserRoleServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserRoleServiceImpl.java new file mode 100644 index 00000000..2959316b --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserRoleServiceImpl.java @@ -0,0 +1,30 @@ +package com.jero.modules.system.service.impl; + +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import com.jero.modules.system.entity.SysRole; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.entity.SysUserRole; +import com.jero.modules.system.mapper.SysUserRoleMapper; +import com.jero.modules.system.service.ISysRoleService; +import com.jero.modules.system.service.ISysUserRoleService; +import com.jero.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + *

+ * 用户角色表 服务实现类 + *

+ * + * @Author scott + * @since 2018-12-21 + */ +@Service +public class SysUserRoleServiceImpl extends ServiceImpl implements ISysUserRoleService { + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 00000000..f5973989 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,442 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.api.ISysBaseAPI; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.common.util.PasswordUtil; +import com.jero.common.util.UUIDGenerator; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.*; +import com.jero.modules.system.mapper.*; +import com.jero.modules.system.model.SysUserSysDepartModel; +import com.jero.modules.system.service.ISysUserService; +import com.jero.modules.system.vo.SysUserDepVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 用户表 服务实现类 + *

+ * + * @Author: scott + * @Date: 2018-12-20 + */ +@Service +@Slf4j +public class SysUserServiceImpl extends ServiceImpl implements ISysUserService { + + @Autowired + private SysUserMapper userMapper; + @Autowired + private SysPermissionMapper sysPermissionMapper; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + @Autowired + private SysUserDepartMapper sysUserDepartMapper; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private SysDepartMapper sysDepartMapper; + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysDepartRoleUserMapper departRoleUserMapper; + @Autowired + private SysDepartRoleMapper sysDepartRoleMapper; + @Resource + private BaseCommonService baseCommonService; + + @Override + @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true) + public Result resetPassword(String username, String oldPassword, String newPassword, String confirmPassword) { + SysUser user = userMapper.getUserByName(username); + String passwordEncode = PasswordUtil.encrypt(username, oldPassword, user.getSalt()); + if (!user.getPassword().equals(passwordEncode)) { + return Result.error("旧密码输入错误!"); + } + if (oConvertUtils.isEmpty(newPassword)) { + return Result.error("新密码不允许为空!"); + } + if (!newPassword.equals(confirmPassword)) { + return Result.error("两次输入密码不一致!"); + } + String password = PasswordUtil.encrypt(username, newPassword, user.getSalt()); + this.userMapper.update(new SysUser().setPassword(password), new LambdaQueryWrapper().eq(SysUser::getId, user.getId())); + return Result.OK("密码修改成功!"); + } + + @Override + @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true) + public Result changePassword(SysUser sysUser) { + String salt = oConvertUtils.randomGen(8); + sysUser.setSalt(salt); + String password = sysUser.getPassword(); + String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); + sysUser.setPassword(passwordEncode); + this.userMapper.updateById(sysUser); + return Result.OK("密码修改成功!"); + } + + @Override + @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) + @Transactional(rollbackFor = Exception.class) + public boolean deleteUser(String userId) { + //1.删除用户 + this.removeById(userId); + return false; + } + + @Override + @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) + @Transactional(rollbackFor = Exception.class) + public boolean deleteBatchUsers(String userIds) { + //1.删除用户 + this.removeByIds(Arrays.asList(userIds.split(","))); + return false; + } + + @Override + public SysUser getUserByName(String username) { + return userMapper.getUserByName(username); + } + + + @Override + @Transactional + public void addUserWithRole(SysUser user, String roles) { + this.save(user); + if(oConvertUtils.isNotEmpty(roles)) { + String[] arr = roles.split(","); + for (String roleId : arr) { + SysUserRole userRole = new SysUserRole(user.getId(), roleId); + sysUserRoleMapper.insert(userRole); + } + } + } + + @Override + @CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, allEntries=true) + @Transactional + public void editUserWithRole(SysUser user, String roles) { + this.updateById(user); + //先删后加 + sysUserRoleMapper.delete(new QueryWrapper().lambda().eq(SysUserRole::getUserId, user.getId())); + if(oConvertUtils.isNotEmpty(roles)) { + String[] arr = roles.split(","); + for (String roleId : arr) { + SysUserRole userRole = new SysUserRole(user.getId(), roleId); + sysUserRoleMapper.insert(userRole); + } + } + } + + + @Override + public List getRole(String username) { + return sysUserRoleMapper.getRoleByUserName(username); + } + + /** + * 通过用户名获取用户角色集合 + * @param username 用户名 + * @return 角色集合 + */ + @Override + public Set getUserRolesSet(String username) { + // 查询用户拥有的角色集合 + List roles = sysUserRoleMapper.getRoleByUserName(username); + log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size())); + return new HashSet<>(roles); + } + + /** + * 通过用户名获取用户权限集合 + * + * @param username 用户名 + * @return 权限集合 + */ + @Override + public Set getUserPermissionsSet(String username) { + Set permissionSet = new HashSet<>(); + List permissionList = sysPermissionMapper.queryByUser(username); + for (SysPermission po : permissionList) { +// // TODO URL规则有问题? +// if (oConvertUtils.isNotEmpty(po.getUrl())) { +// permissionSet.add(po.getUrl()); +// } + if (oConvertUtils.isNotEmpty(po.getPerms())) { + permissionSet.add(po.getPerms()); + } + } + log.info("-------通过数据库读取用户拥有的权限Perms------username: "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) ); + return permissionSet; + } + + @Override + public SysUserCacheInfo getCacheUser(String username) { + SysUserCacheInfo info = new SysUserCacheInfo(); + info.setOneDepart(true); +// SysUser user = userMapper.getUserByName(username); +// info.setSysUserCode(user.getUsername()); +// info.setSysUserName(user.getRealname()); + + + LoginUser user = sysBaseAPI.getUserByName(username); + if(user!=null) { + info.setSysUserCode(user.getUsername()); + info.setSysUserName(user.getRealname()); + info.setSysOrgCode(user.getOrgCode()); + } + + //多部门支持in查询 + List list = sysDepartMapper.queryUserDeparts(user.getId()); + List sysMultiOrgCode = new ArrayList(); + if(list==null || list.size()==0) { + //当前用户无部门 + //sysMultiOrgCode.add("0"); + }else if(list.size()==1) { + sysMultiOrgCode.add(list.get(0).getOrgCode()); + }else { + info.setOneDepart(false); + for (SysDepart dpt : list) { + sysMultiOrgCode.add(dpt.getOrgCode()); + } + } + info.setSysMultiOrgCode(sysMultiOrgCode); + + return info; + } + + // 根据部门Id查询 + @Override + public IPage getUserByDepId(Page page, String departId,String username) { + return userMapper.getUserByDepId(page, departId,username); + } + + @Override + public IPage getUserByDepIds(Page page, List departIds, String username) { + return userMapper.getUserByDepIds(page, departIds,username); + } + + @Override + public Map getDepNamesByUserIds(List userIds) { + List list = this.baseMapper.getDepNamesByUserIds(userIds); + + Map res = new HashMap(); + list.forEach(item -> { + if (res.get(item.getUserId()) == null) { + res.put(item.getUserId(), item.getDepartName()); + } else { + res.put(item.getUserId(), res.get(item.getUserId()) + "," + item.getDepartName()); + } + } + ); + return res; + } + + @Override + public IPage getUserByDepartIdAndQueryWrapper(Page page, String departId, QueryWrapper queryWrapper) { + LambdaQueryWrapper lambdaQueryWrapper = queryWrapper.lambda(); + + lambdaQueryWrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0); + lambdaQueryWrapper.inSql(SysUser::getId, "SELECT user_id FROM sys_user_depart WHERE dep_id = '" + departId + "'"); + + return userMapper.selectPage(page, lambdaQueryWrapper); + } + + @Override + public IPage queryUserByOrgCode(String orgCode, SysUser userParams, IPage page) { + List list = baseMapper.getUserByOrgCode(page, orgCode, userParams); + Integer total = baseMapper.getUserByOrgCodeTotal(orgCode, userParams); + + IPage result = new Page<>(page.getCurrent(), page.getSize(), total); + result.setRecords(list); + + return result; + } + + // 根据角色Id查询 + @Override + public IPage getUserByRoleId(Page page, String roleId, String username) { + return userMapper.getUserByRoleId(page,roleId,username); + } + + + @Override + @CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, key="#username") + public void updateUserDepart(String username,String orgCode) { + baseMapper.updateUserDepart(username, orgCode); + } + + + @Override + public SysUser getUserByPhone(String phone) { + return userMapper.getUserByPhone(phone); + } + + + @Override + public SysUser getUserByEmail(String email) { + return userMapper.getUserByEmail(email); + } + + @Override + @Transactional + public void addUserWithDepart(SysUser user, String selectedParts) { +// this.save(user); //保存角色的时候已经添加过一次了 + if(oConvertUtils.isNotEmpty(selectedParts)) { + String[] arr = selectedParts.split(","); + for (String deaprtId : arr) { + SysUserDepart userDeaprt = new SysUserDepart(user.getId(), deaprtId); + sysUserDepartMapper.insert(userDeaprt); + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) + public void editUserWithDepart(SysUser user, String departs) { + this.updateById(user); //更新角色的时候已经更新了一次了,可以再跟新一次 + String[] arr = {}; + if(oConvertUtils.isNotEmpty(departs)){ + arr = departs.split(","); + } + //查询已关联部门 + List userDepartList = sysUserDepartMapper.selectList(new QueryWrapper().lambda().eq(SysUserDepart::getUserId, user.getId())); + if(userDepartList != null && userDepartList.size()>0){ + for(SysUserDepart depart : userDepartList ){ + //修改已关联部门删除部门用户角色关系 + if(!Arrays.asList(arr).contains(depart.getDepId())){ + List sysDepartRoleList = sysDepartRoleMapper.selectList( + new QueryWrapper().lambda().eq(SysDepartRole::getDepartId,depart.getDepId())); + List roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList()); + if(roleIds != null && roleIds.size()>0){ + departRoleUserMapper.delete(new QueryWrapper().lambda().eq(SysDepartRoleUser::getUserId, user.getId()) + .in(SysDepartRoleUser::getDroleId,roleIds)); + } + } + } + } + //先删后加 + sysUserDepartMapper.delete(new QueryWrapper().lambda().eq(SysUserDepart::getUserId, user.getId())); + if(oConvertUtils.isNotEmpty(departs)) { + for (String departId : arr) { + SysUserDepart userDepart = new SysUserDepart(user.getId(), departId); + sysUserDepartMapper.insert(userDepart); + } + } + } + + + /** + * 校验用户是否有效 + * @param sysUser + * @return + */ + @Override + public Result checkUserIsEffective(SysUser sysUser) { + Result result = new Result(); + //情况1:根据用户信息查询,该用户不存在 + if (sysUser == null) { + result.error500("登录失败,用户名或密码错误!"); + baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); + return result; + } + //情况2:根据用户信息查询,该用户已注销 + //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) { + //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); + result.error500("该用户已注销"); + return result; + } + //情况3:根据用户信息查询,该用户已冻结 + if (CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) { + baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); + result.error500("该用户已冻结"); + return result; + } + return result; + } + + @Override + public List queryLogicDeleted() { + return this.queryLogicDeleted(null); + } + + @Override + public List queryLogicDeleted(LambdaQueryWrapper wrapper) { + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); + } + wrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_1); + return userMapper.selectLogicDeleted(wrapper); + } + + @Override + public boolean revertLogicDeleted(List userIds, SysUser updateEntity) { + String ids = String.format("'%s'", String.join("','", userIds)); + return userMapper.revertLogicDeleted(ids, updateEntity) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeLogicDeleted(List userIds) { + String ids = String.format("'%s'", String.join("','", userIds)); + // 1. 删除用户 + int line = userMapper.deleteLogicDeleted(ids); + // 2. 删除用户部门关系 + line += sysUserDepartMapper.delete(new LambdaQueryWrapper().in(SysUserDepart::getUserId, userIds)); + //3. 删除用户角色关系 + line += sysUserRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, userIds)); + return line != 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateNullPhoneEmail() { + userMapper.updateNullByEmptyString("email"); + userMapper.updateNullByEmptyString("phone"); + return true; + } + + @Override + public void saveThirdUser(SysUser sysUser) { + //保存用户 + String userid = UUIDGenerator.generate(); + sysUser.setId(userid); + baseMapper.insert(sysUser); + //获取第三方角色 + SysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper().eq(SysRole::getRoleCode, "third_role")); + //保存用户角色 + SysUserRole userRole = new SysUserRole(); + userRole.setRoleId(sysRole.getId()); + userRole.setUserId(userid); + sysUserRoleMapper.insert(userRole); + } + + @Override + public List queryByDepIds(List departIds, String username) { + return userMapper.queryByDepIds(departIds,username); + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/util/FindsDepartsChildrenUtil.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/FindsDepartsChildrenUtil.java new file mode 100644 index 00000000..ce47aa0a --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/FindsDepartsChildrenUtil.java @@ -0,0 +1,172 @@ +package com.jero.modules.system.util; + +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.vo.SysDepartTreeModel; +import com.jero.common.util.RedisUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.model.DepartIdModel; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 对应部门的表,处理并查找树级数据 + *

+ * + * @Author: Steve + * @Date: 2019-01-22 + */ +public class FindsDepartsChildrenUtil { + + //部门树信息-树结构 + //private static List sysDepartTreeList = new ArrayList(); + + //部门树id-树结构 + //private static List idList = new ArrayList<>(); + + + /** + * queryTreeList的子方法 ====1===== + * 该方法是s将SysDepart类型的list集合转换成SysDepartTreeModel类型的集合 + */ + public static List wrapTreeDataToTreeList(List recordList) { + // 在该方法每请求一次,都要对全局list集合进行一次清理 + //idList.clear(); + List idList = new ArrayList(); + List records = new ArrayList<>(); + for (int i = 0; i < recordList.size(); i++) { + SysDepart depart = recordList.get(i); + SysDepartTreeModel sysDepartTreeModel = new SysDepartTreeModel(); + // 将sysDepart转换为sysDepartTreeModel + convertSysDepartToSysDepartTreeModel(depart, sysDepartTreeModel); + records.add(sysDepartTreeModel); + } + List tree = findChildren(records, idList); + setEmptyChildrenAsNull(tree); + return tree; + } + + /** + * 获取 DepartIdModel + * @param recordList + * @return + */ + public static List wrapTreeDataToDepartIdTreeList(List recordList) { + // 在该方法每请求一次,都要对全局list集合进行一次清理 + //idList.clear(); + List idList = new ArrayList(); + List records = new ArrayList<>(); + for (int i = 0; i < recordList.size(); i++) { + SysDepart depart = recordList.get(i); + SysDepartTreeModel sysDepartTreeModel = new SysDepartTreeModel(); + // 将sysDepart转换为sysDepartTreeModel + convertSysDepartToSysDepartTreeModel(depart, sysDepartTreeModel); + records.add(sysDepartTreeModel); + } + findChildren(records, idList); + return idList; + } + + /** + * queryTreeList的子方法 ====2===== + * 该方法是找到并封装顶级父类的节点到TreeList集合 + */ + private static List findChildren(List recordList, + List departIdList) { + + List treeList = new ArrayList<>(); + for (int i = 0; i < recordList.size(); i++) { + SysDepartTreeModel branch = recordList.get(i); + if (oConvertUtils.isEmpty(branch.getParentId())) { + treeList.add(branch); + DepartIdModel departIdModel = new DepartIdModel().convert(branch); + + departIdList.add(departIdModel); + } + } + getGrandChildren(treeList,recordList,departIdList); + + //idList = departIdList; + return treeList; + } + + /** + * queryTreeList的子方法====3==== + *该方法是找到顶级父类下的所有子节点集合并封装到TreeList集合 + */ + private static void getGrandChildren(List treeList,List recordList,List idList) { + + for (int i = 0; i < treeList.size(); i++) { + SysDepartTreeModel model = treeList.get(i); + DepartIdModel idModel = idList.get(i); + for (int i1 = 0; i1 < recordList.size(); i1++) { + SysDepartTreeModel m = recordList.get(i1); + if (m.getParentId()!=null && m.getParentId().equals(model.getId())) { + model.getChildren().add(m); + DepartIdModel dim = new DepartIdModel().convert(m); + + idModel.getChildren().add(dim); + } + } + getGrandChildren(treeList.get(i).getChildren(), recordList, idList.get(i).getChildren()); + } + + } + + + /** + * queryTreeList的子方法 ====4==== + * 该方法是将子节点为空的List集合设置为Null值 + */ + private static void setEmptyChildrenAsNull(List treeList) { + + for (int i = 0; i < treeList.size(); i++) { + SysDepartTreeModel model = treeList.get(i); + if (model.getChildren().size() == 0) { + model.setChildren(null); + model.setIsLeaf(true); + }else{ + setEmptyChildrenAsNull(model.getChildren()); + model.setIsLeaf(false); + } + } + // sysDepartTreeList = treeList; + } + + /** + * 将SysDepart对象转换成SysDepartTreeModel对象 + * @author 马志朝 + * @date 2021/3/25 13:15 + * @param sysDepart 待转换的对象 + * @param sysDepartTreeModel 转换的结果对象 + * @return + */ + public static void convertSysDepartToSysDepartTreeModel(SysDepart sysDepart, SysDepartTreeModel sysDepartTreeModel){ + sysDepartTreeModel.setKey( sysDepart.getId()); + sysDepartTreeModel.setValue( sysDepart.getId()); + sysDepartTreeModel.setTitle(sysDepart.getDepartName()); + sysDepartTreeModel.setId(sysDepart.getId()); + sysDepartTreeModel.setParentId(sysDepart.getParentId()); + sysDepartTreeModel.setDepartName(sysDepart.getDepartName()); + sysDepartTreeModel.setDepartNameEn(sysDepart.getDepartNameEn()); + sysDepartTreeModel.setDepartNameAbbr(sysDepart.getDepartNameAbbr()); + sysDepartTreeModel.setDepartOrder(sysDepart.getDepartOrder()); + sysDepartTreeModel.setDescription(sysDepart.getDescription()); + sysDepartTreeModel.setOrgCategory(sysDepart.getOrgCategory()); + sysDepartTreeModel.setOrgType(sysDepart.getOrgType()); + sysDepartTreeModel.setOrgCode(sysDepart.getOrgCode()); + sysDepartTreeModel.setMobile(sysDepart.getMobile()); + sysDepartTreeModel.setFax(sysDepart.getFax()); + sysDepartTreeModel.setAddress(sysDepart.getAddress()); + sysDepartTreeModel.setMemo(sysDepart.getMemo()); + sysDepartTreeModel.setStatus(sysDepart.getStatus()); + sysDepartTreeModel.setDelFlag(sysDepart.getDelFlag()); + sysDepartTreeModel.setCreateBy(sysDepart.getCreateBy()); + sysDepartTreeModel.setCreateTime(sysDepart.getCreateTime()); + sysDepartTreeModel.setUpdateBy(sysDepart.getUpdateBy()); + sysDepartTreeModel.setUpdateTime(sysDepart.getUpdateTime()); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/util/PermissionDataUtil.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/PermissionDataUtil.java new file mode 100644 index 00000000..3db51012 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/PermissionDataUtil.java @@ -0,0 +1,95 @@ +package com.jero.modules.system.util; + +import java.util.List; + +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysPermission; + +/** + * @Author: scott + * @Date: 2019-04-03 + */ +public class PermissionDataUtil { + + /** + * 智能处理错误数据,简化用户失误操作 + * + * @param permission + */ + public static SysPermission intelligentProcessData(SysPermission permission) { + if (permission == null) { + return null; + } + + // 组件 + if (oConvertUtils.isNotEmpty(permission.getComponent())) { + String component = permission.getComponent(); + if (component.startsWith("/")) { + component = component.substring(1); + } + if (component.startsWith("views/")) { + component = component.replaceFirst("views/", ""); + } + if (component.startsWith("src/views/")) { + component = component.replaceFirst("src/views/", ""); + } + if (component.endsWith(".vue")) { + component = component.replace(".vue", ""); + } + permission.setComponent(component); + } + + // 请求URL + if (oConvertUtils.isNotEmpty(permission.getUrl())) { + String url = permission.getUrl(); + if (url.endsWith(".vue")) { + url = url.replace(".vue", ""); + } + if (!url.startsWith("http") && !url.startsWith("/")&&!url.trim().startsWith("{{")) { + url = "/" + url; + } + permission.setUrl(url); + } + + // 一级菜单默认组件 + if (0 == permission.getMenuType() && oConvertUtils.isEmpty(permission.getComponent())) { + // 一级菜单默认组件 + permission.setComponent("layouts/RouteView"); + } + return permission; + } + + /** + * 如果没有index页面 需要new 一个放到list中 + * @param metaList + */ + public static void addIndexPage(List metaList) { + boolean hasIndexMenu = false; + for (SysPermission sysPermission : metaList) { + if("首页".equals(sysPermission.getName())) { + hasIndexMenu = true; + break; + } + } + if(!hasIndexMenu) { + metaList.add(0,new SysPermission(true)); + } + } + + /** + * 判断是否授权首页 + * @param metaList + * @return + */ + public static boolean hasIndexPage(List metaList){ + boolean hasIndexMenu = false; + for (SysPermission sysPermission : metaList) { + if("首页".equals(sysPermission.getName())) { + hasIndexMenu = true; + break; + } + } + return hasIndexMenu; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/util/RandImageUtil.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/RandImageUtil.java new file mode 100644 index 00000000..9c20aa54 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/RandImageUtil.java @@ -0,0 +1,144 @@ +package com.jero.modules.system.util; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.Random; + +/** + * 登录验证码工具类 + */ +public class RandImageUtil { + + public static final String key = "JERO_LOGIN_KEY"; + + /** + * 定义图形大小 + */ + private static final int width = 105; + /** + * 定义图形大小 + */ + private static final int height = 35; + + /** + * 定义干扰线数量 + */ + private static final int count = 200; + + /** + * 干扰线的长度=1.414*lineWidth + */ + private static final int lineWidth = 2; + + /** + * 图片格式 + */ + private static final String IMG_FORMAT = "JPEG"; + + /** + * base64 图片前缀 + */ + private static final String BASE64_PRE = "data:image/jpg;base64,"; + + /** + * 直接通过response 返回图片 + * @param response + * @param resultCode + * @throws IOException + */ + public static void generate(HttpServletResponse response, String resultCode) throws IOException { + BufferedImage image = getImageBuffer(resultCode); + // 输出图象到页面 + ImageIO.write(image, IMG_FORMAT, response.getOutputStream()); + } + + /** + * 生成base64字符串 + * @param resultCode + * @return + * @throws IOException + */ + public static String generate(String resultCode) throws IOException { + BufferedImage image = getImageBuffer(resultCode); + + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + //写入流中 + ImageIO.write(image, IMG_FORMAT, byteStream); + //转换成字节 + byte[] bytes = byteStream.toByteArray(); + //转换成base64串 + String base64 = Base64.getEncoder().encodeToString(bytes).trim(); + base64 = base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n + + //写到指定位置 + //ImageIO.write(bufferedImage, "png", new File("")); + + return BASE64_PRE+base64; + } + + private static BufferedImage getImageBuffer(String resultCode){ + // 在内存中创建图象 + final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + // 获取图形上下文 + final Graphics2D graphics = (Graphics2D) image.getGraphics(); + // 设定背景颜色 + graphics.setColor(Color.WHITE); // ---1 + graphics.fillRect(0, 0, width, height); + // 设定边框颜色 +// graphics.setColor(getRandColor(100, 200)); // ---2 + graphics.drawRect(0, 0, width - 1, height - 1); + + final Random random = new Random(); + // 随机产生干扰线,使图象中的认证码不易被其它程序探测到 + for (int i = 0; i < count; i++) { + graphics.setColor(getRandColor(150, 200)); // ---3 + + final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内 + final int y = random.nextInt(height - lineWidth - 1) + 1; + final int xl = random.nextInt(lineWidth); + final int yl = random.nextInt(lineWidth); + graphics.drawLine(x, y, x + xl, y + yl); + } + // 取随机产生的认证码 + for (int i = 0; i < resultCode.length(); i++) { + // 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 + // graphics.setColor(new Color(20 + random.nextInt(130), 20 + random + // .nextInt(130), 20 + random.nextInt(130))); + // 设置字体颜色 + graphics.setColor(Color.BLACK); + // 设置字体样式 +// graphics.setFont(new Font("Arial Black", Font.ITALIC, 18)); + graphics.setFont(new Font("Times New Roman", Font.BOLD, 24)); + // 设置字符,字符间距,上边距 + graphics.drawString(String.valueOf(resultCode.charAt(i)), (23 * i) + 8, 26); + } + for(int i = 0; i < 4; i++){ + graphics.setColor(getRandColor(0, 256)); + graphics.drawLine(0, random.nextInt(height), width, random.nextInt(height)); + } + // 图象生效 + graphics.dispose(); + return image; + } + + private static Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色 + final Random random = new Random(); + if (fc > 255) { + fc = 255; + } + if (bc > 255) { + bc = 255; + } + + final int r = fc + random.nextInt(bc - fc); + final int g = fc + random.nextInt(bc - fc); + final int b = fc + random.nextInt(bc - fc); + + return new Color(r, g, b); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/util/SecurityUtil.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/SecurityUtil.java new file mode 100644 index 00000000..366ee1e8 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/SecurityUtil.java @@ -0,0 +1,51 @@ +package com.jero.modules.system.util; + + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.crypto.symmetric.SymmetricAlgorithm; +import cn.hutool.crypto.symmetric.SymmetricCrypto; + +/** + * @Description: 密码加密解密 + * @author: lsq + * @date: 2020年09月07日 14:26 + */ +public class SecurityUtil { + /**加密key*/ + private static String key = "JERO-BOOT1423670"; + + //---AES加密---------begin--------- + /**加密 + * @param content + * @return + */ + public static String jiami(String content) { + SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes()); + String encryptResultStr = aes.encryptHex(content); + return encryptResultStr; + } + + /**解密 + * @param encryptResultStr + * @return + */ + public static String jiemi(String encryptResultStr){ + SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes()); + //解密为字符串 + String decryptResult = aes.decryptStr(encryptResultStr, CharsetUtil.CHARSET_UTF_8); + return decryptResult; + } + //---AES加密---------end--------- + /** + * 主函数 + */ + public static void main(String[] args) { + String content="test1111"; + String encrypt = jiami(content); + System.out.println(encrypt); + //构建 + String decrypt = jiemi(encrypt); + //解密为字符串 + System.out.println(decrypt); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/util/TenantContext.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/TenantContext.java new file mode 100644 index 00000000..7b9abaae --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/util/TenantContext.java @@ -0,0 +1,25 @@ +package com.jero.modules.system.util; + +import lombok.extern.slf4j.Slf4j; + +/** + * 多租户 tenant_id存储器 + */ +@Slf4j +public class TenantContext { + + private static ThreadLocal currentTenant = new ThreadLocal<>(); + + public static void setTenant(String tenant) { + log.debug(" setting tenant to " + tenant); + currentTenant.set(tenant); + } + + public static String getTenant() { + return currentTenant.get(); + } + + public static void clear(){ + currentTenant.remove(); + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDepartUsersVO.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDepartUsersVO.java new file mode 100644 index 00000000..3f432ab0 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDepartUsersVO.java @@ -0,0 +1,28 @@ +package com.jero.modules.system.vo; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class SysDepartUsersVO implements Serializable{ + private static final long serialVersionUID = 1L; + + /**部门id*/ + private String depId; + /**对应的用户id集合*/ + private List userIdList; + public SysDepartUsersVO(String depId, List userIdList) { + super(); + this.depId = depId; + this.userIdList = userIdList; + } + //update-begin--Author:kangxiaolin Date:20190908 for:[512][部门管理]点击添加已有用户失败修复-------------------- + + public SysDepartUsersVO(){ + + } + //update-begin--Author:kangxiaolin Date:20190908 for:[512][部门管理]点击添加已有用户失败修复-------------------- + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDictPage.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDictPage.java new file mode 100644 index 00000000..2647ebfa --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysDictPage.java @@ -0,0 +1,41 @@ +package com.jero.modules.system.vo; + +import lombok.Data; +import com.jero.modules.system.entity.SysDictItem; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; + +import java.util.List; + +@Data +public class SysDictPage { + + /** + * 主键 + */ + private String id; + /** + * 字典名称 + */ + @Excel(name = "字典名称", width = 20) + private String dictName; + + /** + * 字典编码 + */ + @Excel(name = "字典编码", width = 30) + private String dictCode; + /** + * 删除状态 + */ + private Integer delFlag; + /** + * 描述 + */ + @Excel(name = "描述", width = 30) + private String description; + + @ExcelCollection(name = "字典列表") + private List sysDictItemList; + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserDepVo.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserDepVo.java new file mode 100644 index 00000000..312e56a4 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserDepVo.java @@ -0,0 +1,15 @@ +package com.jero.modules.system.vo; + +import lombok.Data; + +/** + * @Author qinfeng + * @Date 2020/1/2 21:58 + * @Description: + * @Version 1.0 + */ +@Data +public class SysUserDepVo { + private String userId; + private String departName; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserRoleVO.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserRoleVO.java new file mode 100644 index 00000000..9ac1ebe8 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/vo/SysUserRoleVO.java @@ -0,0 +1,27 @@ +package com.jero.modules.system.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class SysUserRoleVO implements Serializable{ + private static final long serialVersionUID = 1L; + + /**部门id*/ + private String roleId; + /**对应的用户id集合*/ + private List userIdList; + + public SysUserRoleVO() { + super(); + } + + public SysUserRoleVO(String roleId, List userIdList) { + super(); + this.roleId = roleId; + this.userIdList = userIdList; + } + +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/CreateGroup.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/CreateGroup.java new file mode 100644 index 00000000..27588249 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/CreateGroup.java @@ -0,0 +1,8 @@ +package com.jero.modules.system.volid.group; + +/** + * @author liJiaRao + * @date 2021-08-05 16:08 + */ +public interface CreateGroup { +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/UpdateGroup.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/UpdateGroup.java new file mode 100644 index 00000000..92bb2ed3 --- /dev/null +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/volid/group/UpdateGroup.java @@ -0,0 +1,8 @@ +package com.jero.modules.system.volid.group; + +/** + * @author liJiaRao + * @date 2021-08-05 16:07 + */ +public interface UpdateGroup { +} diff --git a/jero-boot-single-startup/pom.xml b/jero-boot-single-startup/pom.xml new file mode 100644 index 00000000..863248a0 --- /dev/null +++ b/jero-boot-single-startup/pom.xml @@ -0,0 +1,44 @@ + + + + jero-boot + com.jero.boot + 2.4.2 + + 4.0.0 + + jero-boot-single-startup + + + + com.jero.boot + jero-boot-module-system + ${jero.version} + + + com.jero.boot + jero-boot-module-demo + ${jero.version} + + + p6spy + p6spy + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + false + + + + + + \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/java/com/jero/JeroSystemSingleApplication.java b/jero-boot-single-startup/src/main/java/com/jero/JeroSystemSingleApplication.java new file mode 100644 index 00000000..078a88a1 --- /dev/null +++ b/jero-boot-single-startup/src/main/java/com/jero/JeroSystemSingleApplication.java @@ -0,0 +1,43 @@ +package com.jero; + +import com.jero.common.util.oConvertUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * @Description 单体应用启动类 + * @Author zero + * @Date 2021/3/15 + **/ +@Slf4j +@SpringBootApplication +public class JeroSystemSingleApplication extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(JeroSystemSingleApplication.class); + } + + public static void main(String[] args) throws UnknownHostException { + ConfigurableApplicationContext application = SpringApplication.run(JeroSystemSingleApplication.class, args); + Environment env = application.getEnvironment(); + String ip = InetAddress.getLocalHost().getHostAddress(); + String port = env.getProperty("server.port"); + String path = oConvertUtils.getString(env.getProperty("server.servlet.context-path")); + log.info("\n----------------------------------------------------------\n\t" + + "Application jero-boot is running! Access URLs:\n\t" + + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + + "External: \thttp://" + ip + ":" + port + path + "/\n\t" + + "Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" + + "----------------------------------------------------------"); + } + +} diff --git a/jero-boot-single-startup/src/main/resources/application-dev.yml b/jero-boot-single-startup/src/main/resources/application-dev.yml new file mode 100644 index 00000000..993fcaea --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/application-dev.yml @@ -0,0 +1,296 @@ +server: + port: 8080 + tomcat: + max-swallow-size: -1 + error: + include-exception: true + include-stacktrace: ALWAYS + include-message: ALWAYS + servlet: + context-path: /jero-boot + compression: + enabled: true + min-response-size: 1024 + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* + +management: + endpoints: + web: + exposure: + include: metrics,httptrace + +spring: + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB + mail: + host: smtp.163.com + username: test@163.com + password: ?? + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + ## quartz定时任务,采用数据库方式 + quartz: + job-store-type: jdbc + initialize-schema: embedded + #设置自动启动,默认为 true + auto-startup: true + #启动时更新己存在的Job + overwrite-existing-jobs: true + properties: + org: + quartz: + scheduler: + instanceName: MyScheduler + instanceId: AUTO + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ + isClustered: true + misfireThreshold: 60000 + clusterCheckinInterval: 10000 + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 10 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + #json 时间戳统一转换 + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + jpa: + open-in-view: false + activiti: + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + aop: + proxy-target-class: true + #配置freemarker + freemarker: + # 设置模板后缀名 + suffix: .ftl + # 设置文档类型 + content-type: text/html + # 设置页面编码格式 + charset: UTF-8 + # 设置页面缓存 + cache: false + prefer-file-system-access: false + # 设置ftl文件路径 + template-loader-path: + - classpath:/templates + # 设置静态文件路径,js,css等 + mvc: + static-path-pattern: /** + resource: + static-locations: classpath:/static/,classpath:/public/ + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + datasource: + druid: + stat-view-servlet: + enabled: true + loginUsername: admin + loginPassword: 123456 + allow: + web-stat-filter: + enabled: true + dynamic: + druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置) + # 连接池的配置信息 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 + datasource: + master: + url: jdbc:p6spy:mysql://10.0.3.44:3306/jero-boot-base?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: 123456 + driver-class-name: com.p6spy.engine.spy.P6SpyDriver + # 多数据源配置 + #multi-datasource1: + #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + #username: root + #password: root + #driver-class-name: com.mysql.cj.jdbc.Driver + #redis 配置 + redis: + database: 14 + host: 121.36.69.172 + lettuce: + pool: + max-active: 8 #最大连接数据库连接数,设 0 为没有限制 + max-idle: 8 #最大等待连接中的数量,设 0 为没有限制 + max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 + min-idle: 0 #最小等待连接中的数量,设 0 为没有限制 + shutdown-timeout: 100ms + password: hzwlsoft.com + port: 4780 +#mybatis plus 设置 +mybatis-plus: + mapper-locations: classpath*:com/jero/**/xml/*Mapper.xml + global-config: + # 关闭MP3.0自带的banner + banner: false + db-config: + #主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)"; + id-type: ASSIGN_ID + # 默认数据库表下划线命名 + table-underline: true +# configuration: + # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # 返回类型为Map,显示null对应的字段 +# call-setters-on-nulls: true +#jero专用配置 +jero: + # 本地:local\Minio:minio\阿里云:alioss + uploadType: local + path: + #文件上传根目录 设置 + upload: D://opt//upFiles + #webapp文件路径 + webapp: D://opt//webapp + shiro: + excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/** + #阿里云oss存储配置 + oss: + endpoint: oss-cn-beijing.aliyuncs.com + accessKey: ?? + secretKey: ?? + bucketName: jeroos + staticDomain: ?? + # ElasticSearch 6设置 + elasticsearch: + cluster-name: jero-ES + cluster-nodes: 127.0.0.1:9200 + check-enabled: false + # 表单设计器配置 + desform: + # 主题颜色(仅支持 16进制颜色代码) + theme-color: "#1890ff" + # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置) + upload-type: system + # 在线预览文件服务器地址配置 + file-view-domain: 127.0.0.1:8012 + # minio文件上传 + minio: + minio_url: http://minio.jero.com + minio_name: ?? + minio_pass: ?? + bucketName: otatest + #大屏报表参数设置 + jmreport: + mode: dev + #数据字典是否可以全局看到 + saas: false + #是否需要校验token + is_verify_token: false + #必须校验方法 + verify_methods: remove,delete,save,add,update + #Wps在线文档 + wps: + domain: https://wwo.wps.cn/office/ + appid: ?? + appsecret: ?? + #xxl-job配置 + xxljob: + enabled: false + adminAddresses: http://127.0.0.1:9080/xxl-job-admin + appname: ${spring.application.name} + accessToken: '' + address: 127.0.0.1:30007 + ip: 127.0.0.1 + port: 30007 + logPath: logs/jero/job/jobhandler/ + logRetentionDays: 30 + #自定义路由配置 yml nacos database + route: + config: + data-id: jero-gateway-router + group: DEFAULT_GROUP + data-type: yml + #分布式锁配置 + redisson: + address: 127.0.0.1:4780 + password: + type: STANDALONE + enabled: true + # 文件限制后缀黑名单 + fileSuffixLimits: 0x00,%00,\\00,.jsp,.exe,.php,.asp,.aspx,.jspx,.xml,.html,.js,.sh,.bin + # 跨站白名单 + whiteUrls: + # xss白名单 + xssExcludedPages: /login,/updatePassword,/associationIntroduction/edit,/tbIndustryNews/add,/tbIndustryNews/edit,/essaySelection/edit,/essaySelection/add,/standardsDay/edit,/standardsDay/add,/rightsObligations/edit,/dynamic/add,/dynamic/edit,/dynamicManagement/add,/dynamicManagement/edit,/evaluationManagement/add,/evaluationManagement/edit,/meetingNews/add,/meetingNews/edit,/stableCrossTraining/add,/stableCrossTraining/edit,/memberRights/add,/memberRights/edit,/compreResource/add,/compreResource/edit,/councilIntro/edit,/businesManagement/edit,/standardManagement/edit + # cors白名单 + notFilter: + # origin地址 + originIp: http://localhost:3000,http://localhost:3001,http://localhost:8080,127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:8080,10.0.1.70:3000,10.0.1.81:3000,10.0.1.81:8080,192.168.1.7:8080,192.168.1.7:3000,192.168.1.7:3001,121.36.69.172:4780 + +#cas单点登录 +cas: + prefixUrl: http://cas.example.org:8443/cas +#Mybatis输出sql日志 +logging: + level: + com.jero.modules.system.mapper: info +#swagger +knife4j: + production: false + basic: + enable: false + username: jero + password: jero.com +#第三方登录 +justauth: + enabled: true + type: + GITHUB: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/github/callback + WECHAT_ENTERPRISE: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/wechat_enterprise/callback + agent-id: 1000002 + DINGTALK: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/dingtalk/callback + WECHAT_OPEN: + client-id: ?? + client-secret: ?? + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/wechat_open/callback + cache: + type: default + prefix: 'demo::' + timeout: 1h diff --git a/jero-boot-single-startup/src/main/resources/application-prod.yml b/jero-boot-single-startup/src/main/resources/application-prod.yml new file mode 100644 index 00000000..b7112cfa --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/application-prod.yml @@ -0,0 +1,289 @@ +server: + port: 8080 + tomcat: + max-swallow-size: -1 + error: + include-exception: true + include-stacktrace: ALWAYS + include-message: ALWAYS + servlet: + context-path: /jero-boot + compression: + enabled: true + min-response-size: 1024 + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* + +management: + endpoints: + web: + exposure: + include: metrics,httptrace + +spring: + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB + mail: + host: smtp.163.com + username: test@163.com + password: ?? + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + ## quartz定时任务,采用数据库方式 + quartz: + job-store-type: jdbc + initialize-schema: embedded + #设置自动启动,默认为 true + auto-startup: true + #启动时更新己存在的Job + overwrite-existing-jobs: true + properties: + org: + quartz: + scheduler: + instanceName: MyScheduler + instanceId: AUTO + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ + isClustered: true + misfireThreshold: 60000 + clusterCheckinInterval: 10000 + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 10 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + #json 时间戳统一转换 + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + jpa: + open-in-view: false + activiti: + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + aop: + proxy-target-class: true + #配置freemarker + freemarker: + # 设置模板后缀名 + suffix: .ftl + # 设置文档类型 + content-type: text/html + # 设置页面编码格式 + charset: UTF-8 + # 设置页面缓存 + cache: false + prefer-file-system-access: false + # 设置ftl文件路径 + template-loader-path: + - classpath:/templates + # 设置静态文件路径,js,css等 + mvc: + static-path-pattern: /** + resource: + static-locations: classpath:/static/,classpath:/public/ + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + datasource: + druid: + stat-view-servlet: + enabled: true + loginUsername: admin + loginPassword: 123456 + allow: + web-stat-filter: + enabled: true + dynamic: + druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置) + # 连接池的配置信息 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 + datasource: + master: + url: jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + # 多数据源配置 + #multi-datasource1: + #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + #username: root + #password: root + #driver-class-name: com.mysql.cj.jdbc.Driver + #redis 配置 + redis: + database: 0 + host: 127.0.0.1 + lettuce: + pool: + max-active: 8 #最大连接数据库连接数,设 0 为没有限制 + max-idle: 8 #最大等待连接中的数量,设 0 为没有限制 + max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 + min-idle: 0 #最小等待连接中的数量,设 0 为没有限制 + shutdown-timeout: 100ms + password: '' + port: 4780 +#mybatis plus 设置 +mybatis-plus: + mapper-locations: classpath*:com/jero/**/xml/*Mapper.xml + global-config: + # 关闭MP3.0自带的banner + banner: false + db-config: + #主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)"; + id-type: ASSIGN_ID + # 默认数据库表下划线命名 + table-underline: true + configuration: + # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # 返回类型为Map,显示null对应的字段 + call-setters-on-nulls: true +#jero专用配置 +jero : + # 本地:local\Minio:minio\阿里云:alioss + uploadType: alioss + path : + #文件上传根目录 设置 + upload: /opt/jero-boot/upload + #webapp文件路径 + webapp: /opt/jero-boot/webapp + shiro: + excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/** + #阿里云oss存储配置 + oss: + endpoint: oss-cn-beijing.aliyuncs.com + accessKey: ?? + secretKey: ?? + bucketName: jeroos + staticDomain: https://static.jero.com + # ElasticSearch 设置 + elasticsearch: + cluster-name: jero-ES + cluster-nodes: 111.225.222.176:9200 + check-enabled: true + # 表单设计器配置 + desform: + # 主题颜色(仅支持 16进制颜色代码) + theme-color: "#1890ff" + # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置) + upload-type: system + # 在线预览文件服务器地址配置 + file-view-domain: http://fileview.jero.com + # minio文件上传 + minio: + minio_url: http://minio.jero.com + minio_name: ?? + minio_pass: ?? + bucketName: otatest + #大屏报表参数设置 + jmreport: + mode: prod + #数据字典是否可以全局看到 + saas: false + #是否需要校验token + is_verify_token: true + #必须校验方法 + verify_methods: remove,delete,save,add,update + #Wps在线文档 + wps: + domain: https://wwo.wps.cn/office/ + appid: true + appsecret: true + #xxl-job配置 + xxljob: + enabled: false + adminAddresses: http://127.0.0.1:9080/xxl-job-admin + appname: ${spring.application.name} + accessToken: '' + address: 127.0.0.1:30007 + ip: 127.0.0.1 + port: 30007 + logPath: logs/jero/job/jobhandler/ + logRetentionDays: 30 + #自定义路由配置 yml nacos database + route: + config: + data-id: jero-gateway-router + group: DEFAULT_GROUP + data-type: yml + #分布式锁配置 + redisson: + address: 127.0.0.1:4780 + password: + type: STANDALONE + enabled: true + # 文件限制后缀黑名单 + fileSuffixLimits : 0x00,%00,\\00,.jsp,.exe,.php,.asp,.aspx,.jspx,.xml,.html,.js,.sh,.bin + # 跨站白名单 + whiteUrls: +#cas单点登录 +cas: + prefixUrl: http://cas.example.org:8443/cas +#Mybatis输出sql日志 +logging: + level: + com.jero.modules.system.mapper : info +#swagger +knife4j: + production: false + basic: + enable: true + username: jero + password: jero.com +#第三方登录 +justauth: + enabled: true + type: + GITHUB: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/github/callback + WECHAT_ENTERPRISE: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/wechat_enterprise/callback + agent-id: 1000002 + DINGTALK: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/dingtalk/callback + WECHAT_OPEN: + client-id: true + client-secret: true + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/wechat_open/callback + cache: + type: default + prefix: 'demo::' + timeout: 1h \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/application-test.yml b/jero-boot-single-startup/src/main/resources/application-test.yml new file mode 100644 index 00000000..ac7de9c8 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/application-test.yml @@ -0,0 +1,289 @@ +server: + port: 8080 + tomcat: + max-swallow-size: -1 + error: + include-exception: true + include-stacktrace: ALWAYS + include-message: ALWAYS + servlet: + context-path: /jero-boot + compression: + enabled: true + min-response-size: 1024 + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* + +management: + endpoints: + web: + exposure: + include: metrics,httptrace + +spring: + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB + mail: + host: smtp.163.com + username: test@163.com + password: ?? + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + ## quartz定时任务,采用数据库方式 + quartz: + job-store-type: jdbc + initialize-schema: embedded + #设置自动启动,默认为 true + auto-startup: true + #启动时更新己存在的Job + overwrite-existing-jobs: true + properties: + org: + quartz: + scheduler: + instanceName: MyScheduler + instanceId: AUTO + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ + isClustered: true + misfireThreshold: 60000 + clusterCheckinInterval: 10000 + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 10 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + #json 时间戳统一转换 + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + aop: + proxy-target-class: true + activiti: + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + jpa: + open-in-view: false + #配置freemarker + freemarker: + # 设置模板后缀名 + suffix: .ftl + # 设置文档类型 + content-type: text/html + # 设置页面编码格式 + charset: UTF-8 + # 设置页面缓存 + cache: false + prefer-file-system-access: false + # 设置ftl文件路径 + template-loader-path: + - classpath:/templates + # 设置静态文件路径,js,css等 + mvc: + static-path-pattern: /** + resource: + static-locations: classpath:/static/,classpath:/public/ + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + datasource: + druid: + stat-view-servlet: + enabled: true + loginUsername: admin + loginPassword: 123456 + allow: + web-stat-filter: + enabled: true + dynamic: + druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置) + # 连接池的配置信息 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 + datasource: + master: + url: jdbc:mysql://127.0.0.1:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + # 多数据源配置 + #multi-datasource1: + #url: jdbc:mysql://localhost:3306/jero-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + #username: root + #password: root + #driver-class-name: com.mysql.cj.jdbc.Driver + #redis 配置 + redis: + database: 0 + host: 192.168.1.199 + lettuce: + pool: + max-active: 8 #最大连接数据库连接数,设 0 为没有限制 + max-idle: 8 #最大等待连接中的数量,设 0 为没有限制 + max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 + min-idle: 0 #最小等待连接中的数量,设 0 为没有限制 + shutdown-timeout: 100ms + password: '' + port: 4780 +#mybatis plus 设置 +mybatis-plus: + mapper-locations: classpath*:com/jero/**/xml/*Mapper.xml + global-config: + # 关闭MP3.0自带的banner + banner: false + db-config: + #主键类型 + id-type: ASSIGN_ID + # 默认数据库表下划线命名 + table-underline: true + configuration: + # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # 返回类型为Map,显示null对应的字段 + call-setters-on-nulls: true +#jero专用配置 +jero : + # 本地:local\Minio:minio\阿里云:alioss + uploadType: local + path : + #文件上传根目录 设置 + upload: D://opt//upFiles + #webapp文件路径 + webapp: D://opt//webapp + shiro: + excludeUrls: /test/jeroDemo/demo3,/test/jeroDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/** + #阿里云oss存储配置 + oss: + endpoint: oss-cn-beijing.aliyuncs.com + accessKey: ?? + secretKey: ?? + bucketName: jeroos + staticDomain: https://static.jero.com + # ElasticSearch 设置 + elasticsearch: + cluster-name: jero-ES + cluster-nodes: ?? + check-enabled: false + # 表单设计器配置 + desform: + # 主题颜色(仅支持 16进制颜色代码) + theme-color: "#1890ff" + # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置) + upload-type: system + # 在线预览文件服务器地址配置 + file-view-domain: http://127.0.0.1:8012 + # minio文件上传 + minio: + minio_url: http://minio.jero.com + minio_name: ?? + minio_pass: ?? + bucketName: otatest + #大屏报表参数设置 + jmreport: + mode: prod + #数据字典是否可以全局看到 + saas: false + #是否需要校验token + is_verify_token: false + #必须校验方法 + verify_methods: remove,delete,save,add,update + #Wps在线文档 + wps: + domain: https://wwo.wps.cn/office/ + appid: ?? + appsecret: ?? + #xxl-job配置 + xxljob: + enabled: false + adminAddresses: http://127.0.0.1:9080/xxl-job-admin + appname: ${spring.application.name} + accessToken: '' + address: 127.0.0.1:30007 + ip: 127.0.0.1 + port: 30007 + logPath: logs/jero/job/jobhandler/ + logRetentionDays: 30 + #自定义路由配置 yml nacos database + route: + config: + data-id: jero-gateway-router + group: DEFAULT_GROUP + data-type: yml + #分布式锁配置 + redisson: + address: 127.0.0.1:4780 + password: + type: STANDALONE + enabled: true + # 文件限制后缀黑名单 + fileSuffixLimits : 0x00,%00,\\00,.jsp,.exe,.php,.asp,.aspx,.jspx,.xml,.html,.js,.sh,.bin + # 跨站白名单 + whiteUrls: +#Mybatis输出sql日志 +logging: + level: + com.jero.modules.system.mapper : info +#cas单点登录 +cas: + prefixUrl: http://cas.example.org:8443/cas +#swagger +knife4j: + production: false + basic: + enable: false + username: jero + password: jero.com +#第三方登录 +justauth: + enabled: true + type: + GITHUB: + client-id: ?? + client-secret: ?? + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/github/callback + WECHAT_ENTERPRISE: + client-id: ?? + client-secret: ?? + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/wechat_enterprise/callback + agent-id: 1000002 + DINGTALK: + client-id: ?? + client-secret: ?? + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/dingtalk/callback + WECHAT_OPEN: + client-id: ?? + client-secret: ?? + redirect-uri: http://sso.test.com:8080/jero-boot/sys/thirdLogin/wechat_open/callback + cache: + type: default + prefix: 'demo::' + timeout: 1h diff --git a/jero-boot-single-startup/src/main/resources/application.yml b/jero-boot-single-startup/src/main/resources/application.yml new file mode 100644 index 00000000..2779e168 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: jero-system + profiles: + active: @profile.name@ \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/banner.txt b/jero-boot-single-startup/src/main/resources/banner.txt new file mode 100644 index 00000000..bdd2b539 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/banner.txt @@ -0,0 +1,14 @@ +${AnsiColor.BRIGHT_BLUE} + (_) | | | | + _ ___ ___ ___ __ _ ______| |__ ___ ___ | |_ + | |/ _ \/ _ \/ __/ _` |______| '_ \ / _ \ / _ \| __| + | | __/ __/ (_| (_| | | |_) | (_) | (_) | |_ + | |\___|\___|\___\__, | |_.__/ \___/ \___/ \__| + _/ | __/ | + |__/ |___/ + + +${AnsiColor.BRIGHT_GREEN} +jero Boot Version: 2.4.2 +Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version} +${AnsiColor.BLACK} diff --git a/jero-boot-single-startup/src/main/resources/logback-spring.xml b/jero-boot-single-startup/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..7fc0fa90 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/logback-spring.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n + + + + + + + + ${LOG_HOME}/jeroboot-%d{yyyy-MM-dd}.%i.log + + 30 + 10MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + + + + ERROR + + + + %p%d%msg%M%F{32}%L + + + ${LOG_HOME}/error-log.html + + + + + + + + ${LOG_HOME}/jeroboot-%d{yyyy-MM-dd}.%i.html + + 30 + 10MB + + + + %p%d%msg%M%F{32}%L + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/spy.properties b/jero-boot-single-startup/src/main/resources/spy.properties new file mode 100644 index 00000000..0eb3c57d --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/spy.properties @@ -0,0 +1,21 @@ +module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory +# 使用日志系统记录sql +appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 是否开启日志过滤 默认false, 这项配置是否生效前提是配置了 include/exclude/sqlexpression +filter=true +## 过滤 Log 时所排除的表名列表,以逗号分隔。 +exclude=QRTZ_SCHEDULER_STATE,QRTZ_TRIGGERS,QRTZ_LOCKS,QRTZ_FIRED_TRIGGERS,dual +## 配置记录Log例外 +excludecategories=info,debug,result,commit,resultset +# 设置使用p6spy driver来做代理 +deregisterdrivers=true +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# 实际驱动 +driverlist=com.mysql.cj.jdbc.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 秒 +outagedetectioninterval=2 +# mybatisplus自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/static/demo1.html b/jero-boot-single-startup/src/main/resources/static/demo1.html new file mode 100644 index 00000000..f9848691 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/demo1.html @@ -0,0 +1 @@ +demo1 \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/static/generic/LICENSE b/jero-boot-single-startup/src/main/resources/static/generic/LICENSE new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/LICENSE @@ -0,0 +1,177 @@ + + 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 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2655fc70ae706c7ba52a5d647cbfdfad6072c697 GIT binary patch literal 2404 zcmW+#SyWV47TvdAJ*r+6RRxF)G8F|XpkSd0DozL*KyfC)0pS@-L>YX5;1pdiNgJS` zL=Y%uFUFQ8f-Z~Eh|{myy!p1b$i=bHX> zys+`=ji%a~OD*o~?c2SXo4wxc?t%-A=Y8%IH=0{~_08^*hPNA=t~NHQExrp`wt~7k z_y6}dyPJH?zNXf1lP7#Wch;suC58JBpV$uq9mEuPwC72IzEbHXNYZPniTj*hqlSv? zy9b^WRK9;h_c*@u*1JTx7ix*U7ZnnF&#SLHey>!|EdL-u&xrn@*&5w$*NfflDK2+= zkrwuXqTL7MnA~22Pf9KA4fr?~%bt+->oAUIcL2r-sbdR_la`KcFv>|sf##T_){a6L zZz>&SFy1nCRKTb(b)1E9TI#5Vab|sosCYJ_)2Z3#X-H=>j7lt*z&MxFxdBF1Os5K? znsnZRp`!DS7QR5yc^Ag{L_fj2D*Kc1G--`L4aVDMe-VreA^uVrKH@))*=&=)9L7b- ze@e40Qn$YnMh&K$tX+cWC8^7XMR$0Y3r1~Bmq(SCsM3`${#?eYt^)$EU{}`}E&L@# zcPxy$knT7b^=rCQu(H|Gy$41^e0MR7M!EYUjH_~YJq!)qEijtU-Ks^sqNeUP7|r3` zf_Y15zzO4;B@hpz)f89@qm2a8VO%!{HsZCz64(smhCPrE<7P-e6ul({j>5RD%CBie zpj>cy2lha%z&qF(Xw_WHRJkwOeAjk=HyD)rrC=oHemQ0;UH2QoOmYvvB&o*&W;XYP zs+JX+-4iZyG9r441ct!gQz6g-rN^f!29ReQNEi0ZYj2)4&qthisov>87Kbo+0Qh$=>`~j8wQ^3-&*x>3Hw9>=- zcY6s*N`t`uwl zJ1hsAweX+N_@Hq1h-oMq>}c3f9AU@ILs^8KkcPH`l}kfA2z!$Z?FFl_4HaUk-ZFGV zbNrNAhJ^G}&Y^0s)A2)B!Ol2`g^y>kAUv%!4GW9Tg$<`_j-OG}u&7jJ9o`OBjbTAg z^$ZKU&W8@yg1sF++y-{RI%3npeois6iZGvTBnqqsQ~4MXj$I-nYr$%j5iuHDe6<}sNk|Fmn#UW714D_*&efd>yQ_i2~OPOauHUkuj&1aB|`CO7Re_m7mPE89T7)~S$Ht^iY1qXPZcOeCQn{%ODQ~p827A}Bq zPhV(7m(#MC48Fs;m;s(|S=^zLZ$3wVhU)l+Zdlw$)+{y>Wyvm9l2ziFj!tF)!oDx|dspKQGU!)^ENB-zje1rJn-dodCW^Ovqk+2Y7)PjD4}- zg_`Z3H071Z9I(Br0)NB&>I!&q+$#-%Z1586YnMv?MJr#&XtsY-`|DQlQpd7*1_xcs k5om7%Ka{$hiq3Rpxm1<^LpLp-6zwQO#)>TPFtC#SKLc+9MgRZ+ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f1ed8538287499647d923d7d8f517a00cdac4e3a GIT binary patch literal 173 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVQ!)88tSa;k;uAm5#wHeUdFwF voJ@OznOOFQu?X&sb`)LsaBps_Jp&^YN;1fUS!@iAMpy(B8JB)#+{Xj}Q4TH^ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..39e89d3339c74cbe06e7e4f76d60bf3556b0d4b6 GIT binary patch literal 2379 zcmW+#`CAjo7Cn_tlXOB7KxC0E6;J^M1G0!Hh@b)rDv093(r8qa#RddiM!%k!=Kz6- zAR+9oPaY$vEGl%>eDkNgKjqcDAL=`OZ&%$q=bl@p|JIdvKX}yBe&=qVJEy3~o0aSJ z7P-rAb+`H4^^bb{e4V}Ss;-;eJrBBj)IQ&>Y+G4Jhx`Bgd)+<0USCiDKgoKZ&z*hf zTvhq0+WJ$3P^#}Vsdh@6et)EU9RIrVD^XsATjF2DgvGz`>igTdVHlSz!$)8= zkl`}TkwdM+YY0@hN4GKOM$Rv%dnytuTKz3?K2= zVJ*kxZ-8-I@?X_#dDQK1f^i2cJ=Re{^sY2&!=^iO)CHqGZq%d7`BWJ#7Ju$x*XU`1 z_i=pmx)xbLF%}P_BWx@IM(3WfRP5wh#!6vyC5~0X=$6NB!+0Q%b;8gv)(4{pWBpo8 zAvKK+!03$}6U_U<15OwZErCQB{ieWP7y~4b0b|e{IEbGPOCT4ULyiuS9%D7Kcim5y<&RNNLKbV5?M_@Ml_!BUD z#Vf07Jx2Gvsu8;#zczp_tCci!d=JC81TT_)OJ7H<^R4ifpq^T6mSw`ilRIqex zcDbemt&GU2V_=zN>O9y1=TsfoLF-f-SXT5@hvqs-6M_UR+Zjv-JLCvvgL&oPaj+a) zumUXC9K1l-VL5mOEFZyU%~ek2U<+6Qg0~4PB*AvViX6dCu;QHHQ?O&w^dYe0@^l_p z37Ia|Top87TGT65rmumWz_bsnj7$saCoz2wtX!Jzz~5)(X$|l5J=23)!YPVS0$7C< zN&-72hdf}X!$KKgXDp!{uu4nlC|DHr(K(@ZSbg@~C1!Y-O;vI(n~X7a%rq?x0HT_!Upz#45c<=E=9 z%$(O8XQ*XHNWbcwX$8BMIP(DPx^q_ecmo^4(Qq!!c)MA}20&B&r zpr?9fgEM}u|Q=Y?I}N%O+r2j=-|&3Tq$UKp&&^B2K--1CiK zy-D+rv2)nG5D(TDwvd9q4&u!r^Fq4jI!6yIWPv@jEeKEg%?r1|2FOAO*x>GkZmbI# zkFaO~dyGY)@`+}zp%IIAu&0TO!joT2i^X8i%!{Si$#X0UiO-`KFR8X#nz7hUvX-Jv zrlkr!)wxtjq@_kemYPWXQmbB*xAYiT*pK~hyec_gfVBZtu00EmY{H4Y7hH0In=Rn7 zrd*^6ZyLeFtZyEITTE}BgIn=d0$03mWtG&?rnd!}Qcs=lqQPy}cWK~u&%11Jhy7h0 zxHIZqi%PBz!oOeLb%}c3^^oNEF~IZy;@=nOo`m-oNZR{OvggAt-GdL=2)xNT171=RQ}dVa*r7lYVOePdNhaj=@g8o(E3NgnKlljVh}#;AzFH6fe85 z+KkXeX|)x6uXEL>T5i(x)jojlgLN%g;C_MWfd3Lw)^auF7L8pKT~4>J-N(|6#5K`| z4C@zBFVpqKt(w|Bc=fOlez!{6v#}_vi9QS%Fz7{Bl|Mq@8>Ux`|+@q$AFw7>C4I6kt^o9ex(7TZee#E)apegrh#KtY~qKu7xj5;lw z6#S@jGZVbnvUyY`9W|KBR2?1kz~)J^XS16qTXwNxbkD&pH%Z*8CD`g9t}QVumaS(b z>br%+eNQ0!zUK>nzTZ%-9qr)9#LdU`tKcO`;H6?hPUuI$%fw)uj0Z2*Y!7Ja50N=- z`_Te^#{A|N;KN^GfuPhQ2Wn*@M_1lcm`)(+ff)A06&+uoraMN ZWxHCHd+DL=OQIb$$lQ?y)&e^@{{yR6zuEu* literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e4167cb51f66c60ef7d9500b450303b5da175574 GIT binary patch literal 2398 zcmW+%X4)d#tmFZT%e3CqAV65xJ4VEnS`dH zL7+EQ*O3^3$f82sn)^Iqy?t_}J*`zImsoz3p0` zy|l8@v3sw>QE9Ke(tX)&Z@Sal=kDya*LQu@-E*_MN9}W8DKXb}blCqN-)rx2_qu!f z|99EscH2w#d|vN5biC;h2nIpOpu(y_p41TXQQ54v6J!szwG#WK!8X-8s5t+0hZO($ zz+kTYO|+EuO)`HR#>Q_Njyu22B+1`iFr|FkYf2fiwA+XBVr)ZoByOlliyd0PkQ@3b zai|SHHAq8U_%RKexlu#6p*NO#0li7^mO(!)c@IE8L%g+`#jBXSF6d`v?=k4-4Blqw z%?9rU=wAxnR_Nz5yl&0v^_YhZ&@ZG7+n`^>W;%}}aVdOB!8^{_tuf_R1*&}zMcSMb* zL+{)+nuo2u(r69zu8h$m(7VOatI%(Xqn*$-jP^nA!Dzo0Golzq2cY-HjdK2d(SAPN zEy6>+>9)I`SnL1m2J0X193?}1vjKQ^h7-*f13i6Q!NKQT@i z4cQYGmprkH$P*Q$V4_wf{=Z?hP!;`u1-05hZ6cvDouF}M(0DCw%ww6jPH2KKahuR2 z+r$IVl;}wwmujBO08LArECAhRn&dO23zJ7cGtwrHsp7a|nr!35GqHP8!FR4O&Y=ocE^)T?cgup$`0XR19f&UY;AettCt<2&aSA3E@o8Lt;1=^l((T z5cD%CTnc(b3LgZmCt(+8gE4%V(4#{57?xV3aHEzs=@G)b&oNWD1&b$za64XC2;nZ! zkbJ_T@7*F;%=6J7L<~gogzj5v==m44HJ8?T{t{badoI9A8K<{Fn z4|z|MLrUzt1@wN#Joo2o!#p?lfpNYDTlFq9BR4uc6XU`7c{)Z~bg{-hZ! z%Jk$Gm}GeJ5X^+90+<~4R8-0I&j<~u@e$AcrztMmvqWNgmQQk@l@L5@B<5#Lr2JV6 z$$Fkl(w-{9}^>Jc)-K&c8SHRMYVB2!Q(s{>>N0nfit^7y#=&)+~s5oEWCwbpjk^SGdlB73j zM0(?J$!`u2;f>3%`%S${KK=(=<*M=H3$W}1VD=8M93x@5n*4W9!J7fF{HmoKjCEn@ z62hm1rB<-*wk5YJ{j3x$^#N=LOv_mucXBKMe5Zlsy_)>9r((GbtiZB-0}B^2mT!X< znpTp*iegsms^uR_%8G+$?E+TnITk}+Im&T2QdiCr*Ge}(mtg-7`&`Z+IyCD)J;K{v zV0(nO4lsxGwj8W9>#Y-PulV*7SlRx!Zm@mwYL+VfqF|Ntczg@y)goYCMA2#m=Vga+ z^|B`a;>lTU!*mu|GlNwmu5lyxJJz_R2W)F+RPk3OcI^u9U5UcAeqh7~vYw+^e)Wj! zJm#Qny$GzTZ2cetMcdZ9!K&pA3)m;}MzSjWrW9}3d9D+&8^<-vZyw7=3s?;{xTZ?V zMi*FZ{5!t9pQgS`2XpOsSFV!Z73aGPn)!Fnr|K!Rk#P zVpQ^n;{1@Rng8$8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TX>Oq#ygOX=*YO&pO=jMENuV) literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d7af99b5e2ae9a21d534f1965c35a2b572143322 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVs4@9k;tm3#JJa=mvL_(C)3_w qCYHTnEP{KZ9Yqxr_vW_RGcZD-B!fJd#m3NRgheosQMHtD9}@un{3-|l literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78ms-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78ms-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..37077d01e26f9ee2427592f6deebb145d628e731 GIT binary patch literal 2651 zcmW+&>su379)3?IlVlPI_nQO=7v(Aj5fH&R7(l=(3boRT!dN4sTpU0UwHkd20)c>B zl5n?bS84?+7Zv6VTibnh{|&dhz3ubte%bx9{j_KMVV?IlGv{}E-`~tRn)fx1_UpYJ z%}rOjtT}~+w!QmpwnA&krS^+XYi)05m$S9gTG{q#d&l+m4yns|Dce}m(qjF6eW$g< z+3D=){{O>Tr_-9f?}JK5*~!{65ZnhL_eHfB%z{z!J&v^D)zC+!d8NaVwML)61g zL)3t&**cIMWF9CbAp^Cit)DM$7idCtX2BdE5^wI&L^3mynek^WK^AjaN>oayL>`K9 z3MU6XY#>S^b}mCn!Oj&Zd$4nrC~4SfAxb88t`Q|0JMB6phk4w^J5ClJx;W(^c6yA; zVf5WXUoZNJPN_gYh*B*F4=iH93FS0D(1dTR^aE|!iNRKqZr~=Anw&vEspST9p?s(x zJP73s87z@agQ8*30p%lM@C1~zn!!3Kb(+C?D4%eHjZn^62Ay)?pvyRI+UAQPZr(=a-RKi;INDH zN1UAB{Ym1ze#9>dHgPDRKNsV7j2xdfX0MRq=D`-Ot2nexrqu; zOU%Rxi60XU6YS%mao9T{GmHm6X_d`mF3<%1WGbjNV$ueh7(aOoG%0Da2{c)lG7*}> zPel>Bhnq@}O^-x=Dj75l8*M>TnV{(*Q^lYeWU3l8(>zrJnk9!kav7#Bg6_3VwSZ=u zz44&?0=?OwHr{&}G{@*=Z0*;2PZ65Sd(VRA!Fxd##zo%S0Gbc)WkL&xx0%qwKridN zDA9XIju>|Z`BJp~pG@2`o40 z{WWsTgp2dDJSPnP1}vT8{LOfg&-vRxPbT?0L8~>>QJ|-Sr(+2{t)0#$w3eIB13kk{ zA0qT4GA)AE8K)iCY}HR!OZrJsKYf$x$ZQE{OWyL9sj*vZ1xOZj z@z$-KzYN+#=Gjc#jF@l78Y8C{3wqF7SYS=wmIa>}ykG*oV_9JOe5P4o;@;IR9KrSh z?LwJk^0^EPRm8sVA=$eauF))(mYNqU2)9^A$l`etv)Gt*VDT0(pNiDSHi`JpV5LXW z`36Dn9f68$qLOl`To6>P9x5*j(_-x7I;c9s;~P-*n#cE`8t?@NRS5Zlm&nWy@Ug9C z+I8oPD2Mq;I59j)AxTfN37*st#WuEQrKD3nS;A z*&OyS14!bR$H~WEwmIy7sE~x2YN$p5swo+2U?5a;KGdN5F;Ii|Kn<}#4ShhMhReoz z7t{#ja|6^!|G zF)ld>mY81tE8v$-lcuFQhy5#&O-m-ENYPw-H5^6@!s#P-mO^jN#F|SNuwUS{L zgw^8=_ab`rBjQ+XXLdFUzB%Bqf72od{@umB%7nU)du4-a)4$4tniK!Z4s}2O>H^f< zf>%zc2ZXhFN&lmWHCD%?8!)bA01G@a*78|hR%q8Q%EFJX#I+{O#FKR+)co*uCS-wa zok@DoynaUFe-eY&FR|Q(NMG*;hRq-wiL&V@7r(*Q95QcYKrPDMIE1N;T^sFCi-k=S z)WgDNq{RI!W^G!TuN}dgCuP&mF4JZM)FaqroQhGKZBR=>U$fyo8vQyJs$_%p#y8C4nD)&zs1>nqWO#C*RvO+0N#s}2{x(`R{_4tjdlqU{;1-+o z<3U@Y7+@NGkg}D6p>$!ZN+SRIFZ$Xg^3M&7R!Zi7i2JsfBI*eQZu7*l9medF&~E2| zd|TfaYk!wYa^GDh$G+R;uzz=vw0xha5&mc)nw>IP_)TP{phU5F>>kQdD2Lc#h@F0t c-la;q-(1!2s=%@!^LOuZa_4*AVfvHif0(Q+AOHXW literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78ms-RKSJ-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/78ms-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..acf23231aea22e1a95761f7eafd35f1d42ea6b84 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZElfUtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6ERIW@ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/83pv-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/83pv-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2359bc529d160857cce4c1d1bfca1322290205c1 GIT binary patch literal 905 zcmaiy;cpXl7{{OI+O^wmYtyl`HDmR3WD>!x+fX(zk2fF27#QYSGOjrry9(r-~(pVo1{Nw?mtLYJ4UUE`k0lkkCo*kO1UE(D(}Ha zIX$MVRMvM&ErC!&C=p47ic-|WsE3L1&Ed_Vp)Ij3En2goQt2?lasb+wwgN2;Lt;6| zwA_i2WgTGY5s;UQrFk$;02m7ZCI-O-t-D+~RMwf^W)!C+rc;Y3P7~9a-6+nSV0x#B z;@u~h&i0`=n`3$}i{kw*rgPg+oO_k&gBcVbb~2ssKyiMW>7z*$A19bDw4u20BGV`1 zC_arcUEGA?Vv6arQ52ttm@dgEF74;u%JB9>6;J2#3n;#bF|D?uSWPosc^1W&VWz81 zD6Sr0`f4AFuf2cP{3zC#>6(h-+M*UPR}ZZ3Otn{i7_C0k7_RpF0@Zzp)zK+0oTa^* zw4u^B0>!txwbtKNy55iCdXee70*deZm~JFd+{iNhFpJ{HZA>?}qPRK3^iu}K&mBy+ z6co26nSPl-@oO8??Kq0t<4kv+!-v;5Y52z#{B2@hzN>;4wmsUkBG4YIH)P39qY?Al z&-;u-#D2+V?9k-9C&B0ku;<`WW7q$+Vyxj_#Xjl|yL;UscaO{N)9#?F&dc}K;$|A` ze8QXqy8u=**sp^X2K#uO6#={Gx8h?Bj%vT*Jnrmp`kY>;$4NTfPM79$M&eedr~f9j zS?YYFb5gPx0b5+mtNTAx&)Lh;5 ZujiWNPKIm#2-aGseD|Rg2PkC##Gk&38VCRY literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90ms-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90ms-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..af8293829c90ce63cc4c5eda0318003785ffcba1 GIT binary patch literal 721 zcmW-eTTc^l5XJwq#gw8#R@%k}Gf`{k zMMO~)MNz7F#ryrXv0C+m@CEc;pImvE1P@4ZMh0a$e!5_#hJh!c`*BVy;Neh zTkWo5mpv{y40IUiYAY)$v->KYl_e^qm8H6=e}1|X^yMOVNa&R!*CX^Qk?RA!TI52Y zyG8CW=pK;^oAnw)aZ=<>{nqqplU^rs@wxhDkvt)i10n@xy-}nD=&hzZk)D1k^M|e31e5HzTtO9tf zi|}eE@HH3Vcq#Dse!}Z*z&9L(6AOSR{De1Kfp6IfCvCu!&9pYVV^v4ixO00S@Es@N z)I#8?0O8%;!1sy>@6Q9izmxDmBk)5D;iCfJN2E$w1*a9@=~D-cn9ek)@cWNQhE@3W zR*W>Mt{DX%Gw_p*giq^$pT-HF#ekpJ629;PzX%h)3<1A#6TYqnejOxy(+&K#g7BRT z{H~MmeLL`nQo@gmfIqeoe%cG=pBD)D)}AcI{0gYeAA%j u^{--}Rd*VGj9%#5gucOu!1#H2euZlOd%88>EDV>zJ*#d2{xOGaKc#=yUE^>7 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90ms-RKSJ-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90ms-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..780549de19de05b6cbea4ccd4737351bc9ff6104 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZE28OtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6C)7)p literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90msp-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90msp-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bfd3119c62d9976dde9b1e59c572c678cf5811a0 GIT binary patch literal 715 zcmW-eTTc^l5XJw~VoNEO2&Pqmx?BQ85Gy1Kg5&B40vb?if-xX2vLIS5w2cHZ5is;3 zUQoQDs8tjNMNzzg8>r(=1dvVfUk4O5y@0Wb4U-e!1H*~A2RJ`p_EmhUK zs|1K40Wc(gs}%5L55S7NSSf+n3@1T40ZQtSjKh6U6fCovgKDBFc+P4I2F&J=F+qf^ zjh0Zdd1J_~mn)$$R9BDTOt6QW6CGiHq9bDMk|H@Nw#a^17jYkvhNEA18d6O*i_N*t zY3nuEb+qf~Y|2Q9qDB-#>D2`>}yh(Xyh zBIC#a@D(JyS^<2upYU2Q@bw*pqou&3KEfMb;G4ySV}-zDX9#a~0^iOfypscbr;YG# zEATxh;dnam_;JGfO~4QAgcE7N6ODuq8-O3#2p?O4AJ`z>C7g2s&v^;od4S&+63!O@&vz1jXb1k7L-e=3qL;^Px1}0SA^g5iYfXXF1DY`JMrWSXGZ@Ro2m> pIdngIFSLC^+oeaK|2#XMub5T`8{&0BcPR@0tE+*R*O2w6;V*K+;HLlp literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90msp-RKSJ-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90msp-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..25ef14ab4af42f4b70ccac76cddac8f3b22d8813 GIT binary patch literal 291 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TV`-3ET%a4|9qgs+k;vS*f}u5; zfuS{tfw46qk*(2@aj!owG3?DvWNLI~IN-y;a3IK0v~kS= zzs90gM@9w+lw^69KH^V^*#(jJY2W1%d Q2{Ig%O=N6uVB9AH0G^~w2LJ#7 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90pv-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/90pv-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..02f713bb838a8cd46f5b262c934d0edc8c6e8fe9 GIT binary patch literal 982 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a3065e441a0e1f1a65e9109ec9bc4f826fccac24 GIT binary patch literal 2413 zcmW+&Yg<#t7JgTDc9NYyAOwPxTexVs69h$s#!VxNsHort6_ss`c;R9I;draTQz>^5 zB-}yKw$@sywYJqgd*Ivo8$RvnH=n29&!;oze3<>NJu~k+Yt~xN%$Pnj1Uj$X=(^l` zsmEJVQQ<4x>ho22t1on(4|*GKboT_?yS@85zUb__*4d@?1TPfXtJ~VV|DWIO?Fx1W zyL$iE*%%CZi;55I3)Iv%)_~9tqJGt=0zKYE^g(@B;gL7U}%yTf_E$7&sr%ouPqC<9T}qydj;K6ArB9ZcM_-~V+gdA@G8C4Sv)OB{4u z_6}ynI0tu=Yq0T%_p6on<)%1`Q*oxb(wu!Jk1##LOgoVhlj5w&PRx$0HVv)}2JzSN zQ1svv=U^*%l69~TdPB(&pf}P`DflNC+7A7wb!Z3lV>DD9iXKvJLjmZ=twRUFlQDE0 z`U%re6L^Ygs2TbxX{ZJI>6D?Mm>RYZo1ix*4LhNq!Ei40vt`5i(9g-k8hEN}_!9IM zY50~V4XYTwD^@*^su2oB4~Oj|e&`o0BX!V&@<;>pi`gS5p|>g{ccEYMjM|}J-ZYx2 z$s?*VS}B-U;2zy0@G84aeD1G1$MURD}9&~}3tu@a#Q3Iv5M$O zJ6L5#P#irE@kEvn2MPoShY0M3Kl4uX$!?oshCX$ z+bzweg4M{gnP7V?v$%d<}SB-25@H^Xc=K z!7kVq?4jss6$@@+LHmM`Xr%?Qp-Z%|8SJvMAbh_PwNMInHFlvoUaZsPh-zItBz)_Fcdl88sIc}ZlZkCxiN{^3~?b$kQMRV{XI5?o@L1T7Pm%NSb#gtCY1@-Ts(Dhc*=LS`-4+SEBY}OH z0Cu;74B7)jih*Ia!jSJtFf8In(WIIGfEV5qnJel6FAgd5s&h3ShTXQB4Z{(&S_JNk zU#)@>jnxJ*9Ja4E!f=9@l&!YFhymZa`Dr3}sq3j_@0!2!dQ2P3h+07jA+PS(r|v*2atiEq1C2VUOq z1K$x+R>JuHE_lWM7lN8+}oo?e^C7|Zd2S3l@#;CAu9i& zh0+CEa& z_S2@dK8#}NwGW2R`g$9T zlFhIEFiK-z2f=swUiWFz$GsQ;aQ~)gH?)+$RR7O8l=^ckee%X)^1aC-=bK}J*f$rb z;7u>dzhu$5U-Bsats_wI)=RN(>uJl|a}@WhmDFF81O8u|ss6WQD){Ycp#1kuB>#Sd z@_s)-(eEUReHTZ?@3I5M?~au$E;rrIsR73IE0M@*l19U hBiJ~FjYe!VVdI#~IGtd0&_=Ch`g=^e-y*oZ{{`ID*(m@3 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-RKSJ-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..040014cfc0880371c20a89212942727c5dc30a78 GIT binary patch literal 287 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<(QJ98{{4ArR$N%-RQ`;*Pnsm zfDaG{aWn1>~Fdm56S{nsR6Mn5Gw+)3Jb$Qmev}EgS-IcxJ}{! literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Add-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2f816d320f08b8671498299c4d00e4564d2ece6c GIT binary patch literal 282 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>X?$E>ygNGht``8&6_OUQ99OMMjtU#KJf$^YlAa{AfKF&6QHh#7?i8gWe mHX)Wa;Wmy$_VR4TgR($XYCxDx8|p%l=LmHM8lDo74dk4_$_P(g(w!-Hg>R!685l< z1014^3aY5#2*)_VDe5@GIWEvZ6D?e#jSjAGjT_wJ4)^Hd0grgXGhWccE8ft@07Hy0 T#ycjM;sc-f!Z&`z(oFmT7oB|o literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-1.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..03a501477c91d8156723f0c274a37d397ed65bad GIT binary patch literal 371 zcmW;IQAa~@7{~FmUG^&eZ(!@RyK_0)E=Ic8c?GTgwb(lAe~#GII?0+zl4K@HGLs}p zW|AaHlF3YxOp+u?l9{CMiRbhDcsy4>e>V}aa(Oi|o_55LVd#O7t{WnpvXWAmdE1d$ zTf`^FES0m=s3TLsfp8`x{{L;Eq%GC7cQmCG!NK8pBsOBkd_GNc=L=I&qQJ~z4n>qu z#sU_xgk`K?6%|ymhIMRU6I-aEj&1B<7kk*p0S?hX6Gu442~Kf_b6nsOSGYzCH)x}S qTioFu59s0%Pk6=)Uh#%^eBcvb_(l(X{NNYvjJLc7T(1JRsQm#8LY3P9 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-2.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2aa95141f9f5802818e34b0aa626e34e7cfee805 GIT binary patch literal 376 zcmW;I(MLmJ7{~FmF8eFqf1vHu-MQP$xfto9^A}WmtyrDyJxAWRfH^ z$xM>WB$*^hCP|WHk|gPS;`uy39?#XUt34QZGdVSu8udl5WtlyFrfG>-(jAt<$$7pU z_e5f1#8nwr4f!$|?vAC?;{V?hN_tXF21iFq5svgH;`V@JheC#-XY*N`$TL%z#te#> z!#ozSh$SqegcYn}4eQvzCbqDRGIp?wJ?!HE6;yGEBh*mGF-~xbGc?e|IWBOC7OrrO s8{Fa!_h{n*k9fi}Uhs-HyrY8;eBuk=_`xr9Ay`2JI;cR?K~xuwKLRC}r~m)} literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-3.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-3.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..86d8b8c79cfa3907281aa3f25a46f178b87aedfa GIT binary patch literal 401 zcmW;IK`TU26u|K}mcGN({Q|~g_m$`K@18oH)xWONo(l2>)7#w>sV2{J8=76$Q^{=5sg+*{Bi$FO zOn+Bk@`34ybT(0+%;nVoeW;8MwHdTaUu%_UY|W(7ZGJiya~zo}4zw_eykU%>gi(xP z921yC8Pk}-Eaote1uS9-%UHoG*07EZY+?)B*ugILu#W>A;t0n$!70vgjtgAk3fH*7 zE$(oS2UPHgDr$JbGhXnDH@xEmpZLNze((z!vY#y=Hi6g%Vk3yHAU1>84nl~yl$}3x CU7_Cq literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-4.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-4.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f50fc6c14e67a228c4ba9a61b1357c16410e8228 GIT binary patch literal 405 zcmW;IK`TU26u|K}mexMN{Q|~g_m#NRlK?k|s%# zBuSDaNs^>Vk|arzB>7);fA`estp0Vij%1K8n7*FgNHu$&+t}i|o=RkbF0K4R80r2{ zrE}eZ$p@x0(wTUDBAZqJ_n|U6)Mn5weXUizsV$vMwfm`9%yDG8IMB){@`f>jQH)_6 z6PUylN+@FnvzWs?7O;pVETe)ItYQsStYZV4*upk;u!}wH;{b;^!ZA*8iZh(!0++bL zHEwW=JJfKG2Rz~l&v?Nr-tdkOeBuk=_`xq^$bPnf*aTu5h>ak&g4hgVJBSS-C8t5k F&L0K8qip~H literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-5.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6caf4a83146a60a2db652647b9cfed5fb71bd97c GIT binary patch literal 406 zcmW;IK`TU26u|K}mNve^{Q|~g_mN!#-X5)|zBpQ#PGx_A`luPwPmMBxy;KBx#c*Ns=T< zk|arzv`LaANs=W0qwepXI-RF~O|>;06pCSYXIE?*JkPCbbY0J+azVQ_eldz|Ph_&a z9YI(K!nWAvlC`OP-u&N3CbW?a`*rDCYm)WN*>tAG&m-sM?B#fFL=cp-tmD?eBm2E_=ODUrv*e4h&B+7AX-5*gJ=iQ5JCxG%FZ9F CgrqG1 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-UCS2.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-CNS1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..69d79a2c2c2b00207ab27b68ebf4404aa17c6f2c GIT binary patch literal 41193 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 R!5J=ag&W-A0Z)>CkuT=vPT>Fm literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-1.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..707bb1065c76d69551c287141cb258519132ef8e GIT binary patch literal 250 zcmW;C!HPjq0LJmd(o>ur8(emGDOo64xKA)R4P{);y(uf1rfHfqO`0Z2k|asfBuSDa zNgD6qQRYv5zs=X*d(Fh{N?jKp3$BcqrV)%9hACrtJFBEscU<-4$YeQZ>x!)(T$K;` zVx^M2_m0%cQMz_JEu~~AoJz(MX)EFJ2ytmt{X#Sw>=`e3#T(wy!UsOl#uvWPK^Hyr kF~ATbj4{C!GyLEeb1bmL3Ttez#SVKMaKs5`(G2{Fe=CDsrT_o{ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-2.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f7648cc3ff02c44e9594ccbd71deec742e253c2f GIT binary patch literal 465 zcmW;IK`TU26u|K}mOjP(0>)!E%W0a$lq|f3HRgsI^TvBGHLGzXNs=TL-VlZ{f>DfN z921zt6s9qQS&{5KST4 dLNtbG4bdE;Jw$_u77-d=%W0a$lq7Fsi@BkOH{N@xS&bt}k|arzBx%w#BuSDa zNs=TU}~*Hl|me!dX&bah9j!F3aLjfsS7l3BmQ8m|yWwl_4H zzD_^L`$2nTv+>$wE@%GlLlfB01_QeEtTplarc5f`?4@Hd$C0&Se;cF78^SO~Fp4pZ zV*-4l~8|5gz6Tq;Wr6vm{3v&eie4&Qnn@L%5OOhl>k|arzBuSDaNs=T< zlB5Yqk|arzT(^3E?^93D>MAPKr?QAtrsV)XL*F@Qk~ zVHhJA#Tdphfk{kZ8Z(&19OkirMJ!<%D_F%E*0F(2Y+)Na*u@_9aezY{;TR`4#Tm|V zflFNB8aKE_0e5)7BcAY#7rf#P@A$wczVMA7{6c;HTtH4BH;^O9732(Z2RVdXLQWyK zkYmU-4m-=_tMvz_6R8WHFJ2IRbyaP#C_M$ZFh@BuSDaNs=TCWD$wYeo5lqC}J;_`Sr5mYp#8^R#fo5_alnIPHG zn2tKrQGGUSDk-XHYYYDGGeHz)!l>KJR2T*&r8UXQs@halK|w60mt0p5BggB<00uFH zVT@oDV;IK-CNYI+%wQICn8yMZv4mx;U=?dv#|AdBg>CF$7kk*p0S|+(wQg*OBwcedIuLAvuxUNRA{|k~7Jj ijwRQUbIHBrU~(}zncPf{rl(l7o@0OOeg}^L literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-UCS2.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-GB1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7586525936cc5398b86d3752a4eb45b15825b25c GIT binary patch literal 33974 zcmbSyg#^~;Dq`SLCNL%sw+i2N{zNG!^ z$?Yk$5++TC7EIHnbl@j zL>j^%M!o;^j0oPervI<+6Q?2wVGh2R4+reFD~3GkG$FYsWlU|O`ryo7Cx}AGcZY)y zxsPa^R$VF>bccxgAnSh6i^M5Kw40o9+-AI+wOSW<^;T!D3K)+#RruRmSh72~5X)V# z-T|%ochcM4uxZZv7+gyHqKeh!_-lLDY)7n!H8Eo%`FO!4GknRxko>LUi&DGoCuy}s zfAX&z;xJptdPg7;|?<=Zs- znM9ir8jGLO2K){r-Ozd>nt4A?g zlM(Vbk|{oJLa=XV{LRK8tzHA77?akx>58?KiL!3{8tsAHL;kyru_^u}qty~6qGoG) zWXmSP3#+77PeXmua`g*Ic&)V06D^fD7WKFdv4ydxV^_L|0EtGDStAtM!rM) zw#F6Kfq-AL>LhWDj{$=xvV_GEMI6d}Gy~g$_r#&qw%QZfXF_Z2urmU;TqlcaopB}x zha?9LCiBL;rmQbUU`nrDeOKPU0jQbTA&yOk|IWQpw$vFXTp`M=VVz4RI@NGW_m#p% zSIPaRCj^8O&bWTne-wsl#y!PTPE8W;)v-Sp0~Cy;)&;z&JS>mnG1%yEKpy*i`p3d?YxKWwJqxHWdtrs5x!9#vjH{k`K)eT>ep )hMjqg! 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 U103N5XSl!>Zg7VOJW1|FzIH}ZoB#j- literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-1.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..dad42c5ad7dad57954fc9a051ee7e222e83bee45 GIT binary patch literal 226 zcmW;C(F(y(0LJk%m!9Idac9QeF4x+{N-pdPuoG%*&RJ?#Ymy{Mk|arzBuSDai8t{m zKI;43eEnmeg6?_&uT`o(&8Vu9$|{OVHQOyQY6Ze)bwSNW+2x+gi$1gExaK(Y-wVo_ zV7&D^Eyk#v&Y8NAw+u-lghV0Mh7NS02Ynd85JoVD2~1%Ib6CI`GD7x@CoEK=wI literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-2.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..090819a064533f20aa68f562275556397683ae81 GIT binary patch literal 233 zcmW;C!HPjq0LJmd(q>-alr^r|-KAuqWZ^!6;WQL3=iZc+NRl*3(xgd}BuSbiNs@RE zkK#{#zs=X*`$$FYa!u#IbFK`VrV;ow3{yt3_Lq`Y&2d%Hk?~T-)@56#U6l>`B87r{ z_m0%cQM&p%Eu~~Il!!-TNh{{@2yw4h{6aM9tce!d=%9-pe$dANLyYi?G5#>Y6f?}R Zz!EF0vB4Jq*kO+YjyU0r3$EhhCY~ULRonmo literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-3.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-3.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..087dfc155860e65d2dc828dd432ffe88239fde23 GIT binary patch literal 242 zcmW;C!Ab&A0EOW@?&>M-#%1H=ZkB`0VnAFpPf*Pzg~>bJ83I>gL_|b{h=@pth)9G) zNJNB)MCe=iDE;OXBS?d4* literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-4.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-4.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46aa9bffe576e9a8b714646aed7f9e1a4e99dfe2 GIT binary patch literal 337 zcmW;CQAa~z0LJlmyWFREzd-BM-MQ#uW*1|2(fI_`UM;qr?LEiX)ig;aNs=U)B$;HA zWRlEGW+pQ;NhZlmk|cH4fARco9)Is(HfX1FdTBB4$|=({CZ-L;l!2H%ucVc8T$OZW zIJIEww5{h{74!Q7iG=*`9jTS0bas4NN=g4@BpeJyt&qnf#BV+`BgAr^6|jO;tf7c? zY+w^x*v1Zav4?#epoBvl;TR_<;}mD8;2amY#1*Qz#tm*!Lmds=p@|mSxJL(F^w7rx a9`S?$p7DZL3^BqR-tmD?eBoPIKjIHvDu)yR literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-5.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Japan1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..5b4b65cc6292a5ba7d89e976565bf08814bb88b6 GIT binary patch literal 430 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 BxW^%pYjuN-9#jwV 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-0.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-0.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..cef1a9985191f53c4a8a35811d1caeecdd1a1820 GIT binary patch literal 241 zcmW;CK}*750LJlm9s3mT#ba}M+i{E?2I0Ydf^;t$thU~bV5eb3M1+Wlh=_;<6+}yI|M2!7c7^j|X(nMGt)pFvJLB jOfba^k9fi}Uhs-HyyF9NeBuk=Sl|as{9=Vak*&o)>2O)q literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-1.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..11ffa36df8404ab970df2a24b2d80b1dc6348436 GIT binary patch literal 386 zcmW;IVMjwz7{KwnUhY$zFR*p%-F-PT8QF{OC#ZI;vURs}uh^?~l4MqrBuSDalO#zd zNs=Ts!7SO2zVPu$BF)nH~I5FL(VM>=iW5wWz_Cxu(|1DW$h za=719c~A8QG93-avRUze?+Yb;sYcAwl~P38yOZ%m%1wkqmZhgkg)T;kH->RcU=n3i zFpU|^Vh;0Iz#^8gj1{b64eQuI6`RR!J?x`~103QA$2h?$&Tx(kT;dAXxWO&% wP)7szXyO5nc)~MUc)=^)@Qx3B;tSvS!7ucv`Ah+A5@^#vn+Tc;L%L%90TF_m@Bjb+ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-2.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Adobe-Korea1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3172308c79d57147cdbe05930228043faa48ca54 GIT binary patch literal 391 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 f42+FTOpJ|eK+FZid_XJ }}!1;lb046pnFxKb%J literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5pc-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5pc-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ce0013167f852a873b639e301088c094d468a750 GIT binary patch literal 1099 zcmW-g`%~0q6vodN6a}qhlS>5pun5Mq5J!##vdM@Bf}@NT7m;gd^fxrqTR%L%JoC!)l4};NoKa|MO+K-CAa~m;Yy` zTdjJ8G1Z)yv?e_XG;o5ZH6}Pa2(*7(bPX13xi0#9ng;QCPDf*cZvnXeZG=E4V1^R` zoRvxy;O4Ai+72k&S1{ECpkGb4=2BAudTmq=)uyA=8JOxyQ9dy;?RWuYM=I0Kr6@a# zm_A*FvdfKWmj&gsAg0|K%I*ZFJ®2-Ds;%-*{dpuU>v^DLBo-c0)(C|^V~)q7$@ z{aT1<0Hy{bN<#_Lm#HZG=P~UsLiy@7rUPy$2a=c$2B93xXF8OCa!B3vwV)jKXF9wU zz5g(KznM_BQqZ}<``gR@4u?0-WN-(%F9AX;RGaa9ga(p$@iBOaih3t7U8K5x( z!cJ~LIW>#vR6fe-K&I2xDBlrNlRvsQZG!Zs_nFSbV(6JFfF>(MH3zZYoCyKVmFUyr z4bWm#ih#tHNcL)R05n%X$XO4Rvr$av7NDFerWB1l#fLaIWt>s{7^F{x*Fn~56 z2yaUP&$bGt^X|C*e2VhQ!L5A}Q~MH>b_>(@D^V_JOc!!cE-L@xHk2RYm@d77a%lro zM+{2GM@&B|SeF&7%L>*{3f2_`>xzPPRl&NdVEwFMT~n~GS#W7*5I}bZEbB~TQ!#G>3#<@hBFz@ zM%>t20?@00cFW9kYcD~&Idml6XmW^`%Ri^t@ zD8IkS^uQbCftv9!8s(v#>5sK2k6vPWv<0=k*I`qik>BW_2Xp&XCjAQLV+HeZA^Qy^ zL(o7zrVY9Q^hLn@K~;vq0(@&o6}_Kf@lX!aP&LjSCde30VR{mP<|o+zV++AB63jGW zLK&%Kucw&+!>b_VX)%V5E(93JgQ!tr9Q_dHjClb}%IsOxnO}JO%^D zQz35L#>*$dzIW`GnjFD7QmDR{H8-t vrdKjO(@~zOJ)g&;Jm1DKe{F<0GX}&NKY$rerFbPXc+3#E&b*VWK6&oH7Gi0w literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5pc-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/B5pc-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..73b99ff2fbca40e7ca5501f61e3f2f29c1fc1af6 GIT binary patch literal 144 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=44ustm~1;v(TI2l^-9&YkfwB h*M71;l(nECj@2Kr98sav2P-`~e{wDhU7p literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..61d1d0cb001dd484630e52eb7e47eaabbdee62cd GIT binary patch literal 1780 zcmeIy+gDU&9LDkA-kV{N7%VIoIuhGKu~2XrO+`8pQjuoF2qrneFl_OF49p-n=(4rp z-2+WBSyWb*wJk$C%#4~H6s;_^QahLCDe_RpU(xgP!rQ!QtuDIxto6R@z54FG9(lO3 z)ZZEktY})^t`-&*IrCjkXOUXc=x@+ecPQAdtq!W?Ek1vs)gSP-YmEh|CC$z1)%QU) zpar!+2Vc51O)Z$dpuDtfp}UME(n(RGrfKT?Jl%&K*Oa8ISE@wWBNg?MT02tVv+_HS zPj`6q65WyCovl}Tx*ygZ^LwUBa!;r3%Pa+^P)YbG<|i>x5{)Dr6l*1sLt+_;5XII=qKm{NMXV<=Sutdab&!!vB3Cj} zBqL20Q)DAu5_uHsRE!ETsz^*zjA|13$wm#uQx(HY@w6mEqqt2mR#Lb+XpfpZOiOq% zg=;C?Ac+EN*hg`f9A2gLc2FWi?(ItI-H_5}p~M(UWGa25DKX9xNuga$)<`-DCq?XX zL{<97k|`G=D!S4IO9+lYu-d_s#&IKQ2G9BQSW&+^53h;da_#us134VMK{FDoRPGTCsFZY6z zw=(O&sT%O>9B_Ip(+BSGeC5?)Mk^<&5Nct^c?LZLa_74z$_-g%xPCUH1lfi~k>h>l%Q+0o(|0 ALjV8( literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS-EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1a393a51e079d1b5e7898423463fac5e87170da2 GIT binary patch literal 1920 zcmeIy`%_eP7{~GFoWo_^SS+j^bOnx!Vxi!&+J)#M5fy1jtYA?KEX#@)WZ7K=7a5uZ z-?Pvrt3_pHS%)&T%d&RQ=w_*1?0&x)S(fcz(dXG8`k9%gnSN;Inb*wu&hyjz%sk3W zeU-mE9NgTosYfjDp%s%u@69_ddT88nTiQ(_(^a+T4!l$f6$HPPXY%xE?V2SsgiR8_{TB+8Vr z0`s0Cd3<}w5;G1NG`*6>chK}IX*`_1*CX$%pyRD{GDqIOQ<@+;Fh`nn(kY8q!}d`_ z70%%nw{U58w_XM!bD3>mWDOX-2;7;;ptL($1@2nJ+yQpE!B_=|&1d?+?gp@DCAj-M z#t-hnzj2Q*1NY8hI>3F^;Qm6eS7KVg16P6vZA=(Ev;pk97(6_W34lk|f&C@m(Q}y1 z;IZq0u>?#gj0Ze^HFzSA*$EEZ3ZA?aOkTi*z`>irp%vgM3$qnGT?3w33Z6}8yqdi@ zUO9B4!5#0!_tcFbaUnRI!L)UUWP%#P@7xMc6WB24|Xx8 zY35Ho20e9rXrB%2sdE||WmzF8D zqL^bn7bOfE!Cp|rMG$>}M-|Zz=*<^{kS$U~2(ra_!hozx5jVl=kGhX&4r>6cYhaBq zY<5~<$ojc8p`_*^SH@F|d8s=ED-Ot&L#{$uDTQ36BV7PL#+>OAKp&*tJgq9L2LW4^ z)#{?PI-Z$}x*9atYlF-!*gM8D3CBi=Z+5`1VfbCfx0cv8z)m6C^}`=msN=MzqCYvL zV~{Eot%Ox7nIcj>#7YBk&nYp8bSH6NliVd9=)`IV@vu^|Ks@Rr*4l{2`y~-#ohH#U zO~jKz$r$mpi+EN;Y%s|X@%$w5!YxS8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=Ij@2sOyo)qo~91%8!qshLNF; gfw7T^iLsFlh`E564~T_;SPY1zfLN|EgW;7w0IZHEdH?_b literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c89b3527fe57ad3b32061f36b73c756ead3fb071 GIT binary patch literal 504 zcmW;IX)8ow0L5`6Ns=T<(sPF-F)m3)lCgy(%}A1wWv;C;ce;0)jHG-a`#Sc0-}im& z!>4eLH@_FB^Xebsx0I?buh!Gm?H1W4lbo3&%O+vAtL=)gdUdzbr;93QhpM?$twYNk~HkIwOJ&|HsTmI*hZ_tSQ;1)BX%%R z0wx6+0#nUkx&X|?6AzfJ2Xi@KKAJdzuLdlngT-*t36{#hvH`3FkruF82-XrvKUi-7 z8@XUJhPc31E!fTgI}xNC>{fui6tEvcTERgPI7}o1;HVKC=Yf-0qJh&oaApMOk)#(~ zRD#P?a1~10!F4gXNg{*bwh7$jgZnt*1`ihSD1)ac!hX-}_riXD_VcsfEBn2%-y8eA dv)>2%eX`#t`+c$BH~R(HFTj33=$HJP{s+tZ#wGv& literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-V.bcmap new file mode 100644 index 00000000..7588cec8 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/CNS2-V.bcmap @@ -0,0 +1,3 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSECNS2-H \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETHK-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETHK-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..cb29415de4f5a669c1b47e34ab889b5fdee6e428 GIT binary patch literal 4426 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 VUn5lgC0;DLe}&hDRI?#j{~y^L&k+Cs literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETHK-B5-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETHK-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f09aec6318dbec88491e3e488526882eaa930f37 GIT binary patch literal 158 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^EnUt?Oi}>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q09TwZ8~^|S literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETen-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETen-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c2d77462d298cdb261f5e2eed5218fcba35cbe4e GIT binary patch literal 1125 zcmW-g`&ZOe6vfY1bQH7_;w1qNhb4%_41%&6h$BY=Az6ZfV9H5>nS>Pr!NhA>tPy-< zY6h8_Y2qsc1xeEk6EqM_%``zCBG1qU{U5sZ!~SKjv(CMDfA*a=@?LCVQAKgyrd+Fj zvB?w~5*8Y2(zCfR+oDgcD6v{Lm*^77PG;L^Yiup&zI(^f#)x{RsX2feB@wQ1F5HlUhRlx;3d+lo-O8<}>zg0drtY3Cx8oq0^3uRz(Q zW7=g#`NE%Rw}!GihG~y4${u0b8-!!;IuV3&BA1;{#sk!+LGa17D5s_~ zoytZz?ZQJ6V>x;>xdSvAl?)Ku z6v}Q*R)EGb2t4bAayE?V++37%$xO{5=u=$@o;CA8Hx&-h;tIY~kxWzXqrC8BdQpmD zFPG*!Hs=G>SV7-h3N9_4=-m>mW<4OJB>|jU%9zeO;+pdb$}0t3t1naQ0+d!W(~rwh zE@(^_HlSQo{>3dQKSeQJnul^}Ez{))l*^wm{j7LiQ9Q3Gp1&xbZHi}`;(1l^ysCKq zs(4;gJg=E?QM*4tXBsSSPi9kx2GC^!hmI(e4poxtJ}B2SnQla)+)(BDEd!%FRTk~5 zz_(Ln-D$-cUEz??rQUec1?A>yrfwsy>n;H3)i~KTFsEPjr9TJX9#9{lmtp?E2Bv{3 zoHa<0HkiQl#0L|fWCD!1g3C|<(~t>esGQxNrUMMFfWW8u7&Pn((3b^a!^AlJG0Yrs z0~p%~E+Z_$7eu=kfZbUs SS}75n>;w+>cVXen+8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^B!nr|V>@>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q0BE@{TmS$7 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-H.bcmap new file mode 100644 index 00000000..a7d69db5 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-H.bcmap @@ -0,0 +1,3 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE ETen-B5-H` ^ \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/ETenms-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..adc5d618d6912cb3a67e4745b63764120f93d17f GIT binary patch literal 172 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?HZDrms_msWUA}o$hOe?l^;Xn zWoOQ25yqxk#>Oidj7*6<3u74@nV1+G*?^b}i1~n62#CdiSPF>cfS5@MD9-?tKV{GO GP7na4qA}0_ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e92ea5b3b99b1f20d31c9760481de0472e72685b GIT binary patch literal 578 zcmW;HX-^Yj6b0a!LR#wJkfLdA#QItYF__k&#-$pgwHAR0XbY(^j9ToQiYX4xOdvHz z^BOzU4fhQfs9HsF!Cm{wpW;vPT)#Xy_vC!JuD|J|F9gk~~n5M;9B5#aw zmMK{_pRicpnUjV&X_z^i=c6kU#UlH^x0uN-Zcb5|;haS`AM8t}1~Vy1mV_j`W*7F< z5~8j%Sz0d&CuDX^6mmYamwIXm{c=f!SC+Gir_7t&NfCV zHDQ96hrp{Ss5KL(!Rub|rV}hS5@X=)UhpnNoCixs!TTNHgP*X$$29n)fn}8_g3tZn n%SQ0kP2|D1ec(GIE`T4S;O9>8YYj04eh-UqLp>(Re@6cS^@+ph literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a7c183228dfdc5c236b7914ca68298520ac60a1 GIT binary patch literal 170 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>Kf{->ygO1a1rBPe_qDDft*Zx sgPB`_!~OsLz3v`wueYcFuf=+=*PWVn zy}YQTs=kB}N|oa#DU8z6zYh`Dt1F6VfA!-q5nkI&;jcpi!e4uo({-;al$3^_qm|^) zpL@-rqgJKNJsRh9j~0)l6(|pYkpM&wCn{pWa4BL&Oo~`DavB&;fOTYGM8>P9z^ftP zH8J5eBol4NarS)Pwc{KmJzCY15S0o}^}IenEh9v&mPkqq{?N;I55=e#YOQnhK90nI z(Ltzn>0^LeuOB-H^@eHeJk$mJP$LCDb2vV~tQ7$=Ge8-qeq^LcNtR z#tYpJ9(Tyr3>q*_p*G>D9BOms_!+1zVdE0iRx); zF*d@N2=$J^R}A%TfUg3om-yzjubVmrb%0DIK^-(q zoyB*%X(|Kikaa2_>eGNJUi6uMss`$F$#|XyPc?8Ze}i?Zo#P8!nCh3Exm1|uZGLH) zE&zitT>(bIrW>%+0j=dz?8@|tBm^BdQjGeX0 z!bK{~o&gIIX0yS9GiM74JE5N)Bz^W1%~=#)7bEXMfO4Hj#9n*io^z4ge}%M@=*z-Y|dQZP|`%eTe} z^H##*jq{;|oz~CC%8o*6oR0%b#6g#Hp3_PSn!f;+Oy;Y>&N$}lz|NZI+rUy>^BuDD z3XNPKV5yFU7_c<^LMoWYxNs3H-Lg;&mSI?^A?%!S;YYA6EHul`B5GV{0n5h1J;HLx zLOWr(_JvNc{PczAU>Ed@XgTE|&Hff_)#&~0*v{7byTGc9{$4rgDvk1UORIHDput@(BBZEL{d`v@8|ju+y|uE!#_}X^D%z=~!w7`zdPaG1x7~GI#Jc_PLu)x@B%o zbKr8kY%im_WnQVpyqpWxie*ku5|_DAZMNlhuscD^17LT}D;7DhoMPn!VP4Bh2-tmW zW*IJ&OSD* zR><~i6sz1?*|=H@*5h7n1nZ4neTw6AhP808KGRw(-lZAV5@qLgdS)#J?1^QKThVV= zy9YKv);hojPp)-ik82phx(Vzl*15!IvbB;1u3N#LN3C;1{-#^c2YX>yzl7sV`#RV6 z(zSj=vQ*Ke^>&i7;nL|gij_FWMj6p>G!nAWM8Y>(mCDQw{+(S*K*BqZM5?o~J0KaW zu0ca8(TH*in%)V`V1j0pg<2Ze@_&X0vS;L$g~q>!3M;H(Mlfa}d4+$#sK@n>{4veF(5PfbjR(iWvF6 zhQz<`BoV)!P(=KiN~(VK5bFmhV$%nkBI-UoBsV{F@!!Tj%82EonGY8+esn8h=*QC} z_~Rww`B*PmZt(k@${@5rE+I%MfEHX0?ZikrG}mxGw3Ak7AjJb$Y*oYmz_?WlElSvGlyuFx@OS3J_fm4+rcGOIoY+4v^Xs=` z$jR*-61QDN%-g++SiAk4SbnQkM8j`Ck(}RJ$;nUQ#PrFdh{C7yME|Kscl}ejWNNN~ z7CkINi%~M5#h!=e4#9Djk_n9(h$hNH8x?j!pvC9!P)v7Wry2fQ{Z1>iQ;r?4WV%BW zclrSBG|am(91}Pu0=^rF-OZ4NyEJr{w>{Ci`v@Diqjq^ulFXlZy=3QSw-n~3p`Shc z)EVG&ImfdQK40UQf}GDkC}RBY4n9dm&hMFuc;)vFK1qZA%U>rvFn!75m=5cg0!0k| zQo$z~Fn(#~cn&#Vyc{zj?8V4JJH=ii-aN7FC1c%a+slTQ6}49kpF3`^O%@(f-F^U; zW5~V*TDEK74lT#C9|!HcW4}Qb9?`)4yU=oz_WLp6Fda~6d5(i*X!)jtJc)EvVm?`N zbkH*gS4hM`HxUl4e1s_C*+VypI;>$oV9vai(3ljX*M8dvClG9(a6tU>*Z4&m4 zNko6%BJ*#j@=&4f@8HO9H=DLc41D)&i~6 z@a++_vdC{Trg*~2&EK68k!jQSFxk>Wt>62hRoIXCi*n6*6pYaUXxHP9;xV2i992l< z`7^xgmdMj=OqWZxUYd4vgLkeH$;U>HRlsq&Pi*=lK@nYl8cFG&5j=5!^4L}W=dw=t KcNEe6tK@(8IPMSt literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Ext-RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Ext-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ea4d2d97b8bc1df2abebce0d4f8c58789f723eb1 GIT binary patch literal 2542 zcmW+%X;)NN7TvdA6;-cB=0T=nPzDtX5fCBe!vY12s1PG2Dm-I}D1#3WM2!~ODn&st zR~56t*b*ZU8B}=pcCV!WNRsZ(&}(&n=}-NwZ}*3{_FebhbIv|zpLee2$2wQXt-j8d z=Ih<|{E`yK{(}xjiM{-4#}&7|zOSp>-PUEVZvUdA^HxWv-0i-aXDn}Rwg3Nqm%Y>7 z^$Aa7`RCBqJ*}yAK1(LC&n_C`o^=`G223sXfef2zu`4ny*zY&ajCK+0pi%lUW@iFoV=9%aGwxVK-yle@r^KHw?Q<0)i)zZW}2gYhSK zitCb9fyAn5Mw@zA2ve&FQBTX{*#mqpD3*am47j15wGA|5J3VaR4%E7QFQC>7-U6tf z=)H%bo+I9J#pIO?UKi9)Meix7=QZ92s13w>k*F60Zxhtdle})l;`JB@HBc`m3|gUH z!ge*(%ZCQ{LT!v6l%Y0}!Fy0;3_g(cgAxWG@<>;Z;v>Mi44p3xc$JD6U$zoG=+XL| zP`}XnDxh8s^VL9g6JH%x^EJM6P_JeBErTTEcXC}AGGfynF=T_<5wJ

75+cDMEZB&av3deI|b?)VpDR?)#qLKLhoCq@UCO(&TS}`k>6;qlm+jIKpfF&^Y1*g*Z|JO5#V( zVdau$q(iX`d(0!9pc>sMKm}n`52`I1HG}FRM=Ln zF%sG13n6(agOhWB-K0F$KCwyJ8*nfTrpvvq0@JlMc|dl*tpI>FJZrpc&$niO@{lR2-pu zgsD`;G$!e$GC;Gj*>0QK3z`!#RR)?%rcQ(IwNBN6?o%ShJcg+&p!*$Dt)O|pM%{K;kr4DKXX9z9O1{6f}Hm;1aE-4jKNmCC`=FDQKBX! zgc3n3gitbQr7n~XdOR$Y1A0Oq$_K5|hmL?&laLFvMjJX#=t&`T3M-BJP@R%6;SoYS z!YMW&Nb2pFYn8xB%;P6UWbxG<}QX=g`ksm8eNi*i0E?WchQXHQp|F>u9Ml_ zpe^DoZ;Tt}*#gj;WVRf%)iPV5h*KVEmJ8Qrn2QE&H_h=PcO=hoac^noYGi#t!rW<2 zPl0akEXPjR=NdS6A!_cf5)<%<^H%H>Xy+3^yY=&_cz(b!&jZ~y&hw)6Xy>ni_L6zt z3U^}WJFw0x(}x8;=v^%E4DTsoPzql#f!T#J&@LRs&LQnWrECg%3=1{H zx$p_uzZk92ELK!l7psV{*g(kQC6ch%wC~U&pSSZ_$a?OON$4C_d*!g87xdv#Fys+N zj)Ms{Fs&X;r-;*1;`0WuFvIiPV0z8-hhPSLC4h+$U+H8r?YaL|oFdLh)}?4LqhTo% z%oM$p2WB=eRe)KrR40>}pAqbptur3uQaveLY9uKyVoAb_B3I&zGbHUr8_|4iBZ*%} zk=m~v#Pkv_=Swq5dwG&vc-ii9{;^8d&-lQsMPRo61hDWuU=c}Rk*C3;`t!k}72~`I zEXMfC02XU}6%Aij@+&)7T;waBR=nd?y-XJW4c|jKd_l@s))HYkhnSc1fZ23}Ete7F zvWsAuOBcEh-SSz|yxib&ej|~hZ}^}OwISwpG0AvcOAN2OWZlA5ummmGt~9Vj9x>@r z30QIye?cD|m-!p&e0^ULfAmCtTMCw9`^Hq&nWZaf7-`4KWrWTOE8KRsb;T{~f0nXWy1CUJ7*pT>HcgW@Zu2r%8%_F?s3wA(w>i~1;-xh-9r@VE79n`(O3|3J5)(v(@ zTu)KNze`xp#@KD+dM*}p=5?-AVbXd9e0J^n6@KhVTW`ip3fVA%6-94Yz=|Ck8DNL4 z8|P%*FH-o%RUW$pIU7B|kQHPzO)>rA(QWcON35HN)19mQ5Fm=w3w4ptudj<@o$_;-n5u08JxW%8Tke0Nc? z{^rrX=X({o@41eZ;qOm@9XGz`)+e;@Z-P}NzE|Mq-BoS)V3W!3lJi5nV*K5c`{6uT zjb)qv11D|Ukr?25eVn_vq-`B*T{(8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T!*Pnsm zfDaG{u`(P80Mh>aOnZZwSoVei*^xjT0>t4!9L6BHH`-C6vHO580~>>ooOEMRt0N-= n1WGc8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>RM5v>ygN#sKmI}pMl|k4-f~j zG8_m1(*FERdxM!+_J#r3kw6>*#Nj|3#vr&i+EGF=`+zS48-q}zgLHFIt0N-=1WGc< ggIR10jYd!*Mh1jnBC~2K<36T-PyT%@0*w1a03e<=y#N3J literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e39908b9844939a3c6d6baccced5771b8c1b1b2d GIT binary patch literal 549 zcmW;HX-^Yj6b0bvh=x@^fcgdPo2C^bbR!B*V$ecRss^bX`N|ESR}dF ziYT(U;(|CJ$SNud2>cj-3g`OeNzTp5Nv`@Y)R0Q|8Qq;-8R6G7pS#-U(?lSVit8fW zXJ+&VrU>?Qq>OaRh-LJIr!bIAivN967`mw&y?hMoy6|{!1{)fi!;OkfA;o61EZUXA zrr7tLQB^4WPDMWP#3Gg@qg3suI<?M`$=f?v}^3bnaxfB>#NYMU^7k zeoSNs$ZOA)=ecs1NV}1XlOHqWu#XgvM&(EqIpotqrVET-1<#z|xynSrSRHs#&h&%v z2$-k=lVywnrf!3m7?rPznS0=M6L@n5yv<|c;N2B4eVQ2r@7uwLi{Rr4CIdc&z>E)k zKFTD)>~-+vEU@sWv=U&h9?T1JMCOO6LVj&UT(|%hOPPn@+byu<2FpcEH(0p_R$XB2 z5EBFIm%;Z_%mCPE13zlP&*O{KFoB0odEc2XC8swyI@Z{ E08&E2d;kCd literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d5be5446aa40898742183202ce0624b8acee5234 GIT binary patch literal 179 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;qIjC8tSa;ktnio5kreT14D}) z8$(MN1LGbEAUm9ex5dqlVUJX^5<`m<8)J(L6GMwFBf}nPZpIb|AT7hl(Bdr3utyfi TmIJaQq#0U5fOIGW!yb76lc_S5 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-H.bcmap new file mode 100644 index 00000000..39189c54 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-H.bcmap @@ -0,0 +1,4 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE!!]aX!!]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] +"]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9 \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GB-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..310834512ffe49cbb7ca903abc2dc1aaa934e6f4 GIT binary patch literal 175 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;_jsDktm|5#L!~Tz|dmH#?TVR zz_>>O$PQ=WZE>?>*dx^plyqWaY;j>?Xt8Bv*dxu&*x~@BWf&P+oTVA|$O74NKz4*Q OLrVyd4rO52BM$&=>M(}@ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..05fff7e8254c995031783fb3b4892d58a6b176ac GIT binary patch literal 14692 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 U$d&`LBcvHxLV$EA1H&G90L*YQ;Q#;t literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK2K-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBK2K-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46f6ba5967cdfb381f001eb1193f17b43d943962 GIT binary patch literal 19662 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 BHq8J4 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBKp-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBKp-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..5cb0af687ee20a10ecc367892ae49d7b1e74acd1 GIT binary patch literal 14686 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBKp-EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBKp-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bca93b8efbb18a13e15025ad41d23db8267d2577 GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|Tof+Gg1Hm literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..4b4e2d32294538b5093ed3870bb9de37abf21599 GIT binary patch literal 7290 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..38f706699f395dcdad5c6ad93d1a9b6fe9f66c78 GIT binary patch literal 180 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>FyMw>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2_QS1g}24cj$w~fvl2s#6B}cT3ll?&EhEDoX>P_A2OurO$k5^}&9Fxn U$d&`LBcvHxLV$EA1H&G90MDZ`>Hq)$ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBT-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..8437ac33771536813228e3f9c1cb6c35af3acc72 GIT binary patch literal 7269 zcmW;QXIB(^oA%-J`d3wVlY;>xPzs6|Ku{DFL_h^WKoLcPfD#l?C{PqJEa$oJM{>?N z7!cGA>TDFdI#hL_r|~oF`6yE}uX@poRp)X2y59i%@9Qab_00_rs_s7yJsuw)eKaOI zIzIG5dEMQL(A?(6#}yA7L(?DKt81vQYbbkMQGU$xLTzp6|NVYrXhTI~MMKm7zL{H5 z5qc~tGd<;ER_;Y2QGByrT;?x|#iegzj=xD{9&hTI*PG{W!ixVx_h#Sq|0sWRH1GeN zdJ`G+FCW8+e}%s}9Qv;UztDfRyon0=_Z~j{-{;=MXZ-u_o8!g*|Ja*-A#c5056mKhGJf?elAI2!% z+j=ra<83pHG3;#%jIr$PYZyJQ^-Y7K-jUTED0;~BK> zA>&!JhA?A-u5~|*N&42qFkawVPmnPgtr{YgTF=3F(a?IH881<528`*{nnlJdXuS?& zCTqO`<5gMOF(OM-1#fW_CeKOwQTI*oEsc(G@<1NZ@r67qJ|9tAmwwa1dYgSDTAyh~_52YENOr$FArwO@j~m)bKR2UB|%pYnP(3Jwy7QX8uOj}u324~tvUDwI9)6jJjrrlguDNK9NRRPmp zT~`%M!RV?ZQwX{mVA56|OWWc_UDtD%_VL{erv21yfGG^!nkyXLn(F}T_9N3l&+e@- z9pbt}VT$Cs!(lqC>yCu!2zAF?^N24r9sNi8r~aS1e;)nw@Soa$YW}H~0^-Z5I{~H` z>Q3TJvFN@8(<$msgXuK7Gngr!y0c+AhwkezB~bSbm=e)_OA0z83f=iIooC%8FeUkP z--GFbN4LgJ_Ue8KQwrDPNv2fK9)FlFv7S9JU1mL+DoyAK!*T`Ja~P&{p(k1r&x))^ zYjy=aXJE>po^xc%q@E-)WuYe(rX1?gMAy)h&P>pR2xhM ztVf%?$M+IU<*ZlFOcm6tMY&JC+WZ6bZjqwSiRjhZR8#MEGS#4W7nvTScP~tJ=na9X zUf(M+lSI8oV0z5=M#1z1y(eL6qTW+vdP=?8N7;w6ias9ZFuqR*b2#;RGxGuT1#sp=tZzFrA7y=e$Q-Tf6Jd^_zC$p_@_k3he8SKd z3v-;lFM&6o;`%huIrL>qk%=Oi6R7Vx%;%{u59TEFX`BnxR{(P|>nnyih4qy&b1L;! z!F-wTtA;sE-&YTFx<_9#%vZR6O_Ra;Jz&n{`h8%&O8tQ_XQ6)^%-QG*x`H30s3=cE)@DTRuT0V zk-1ptFNL{8-(SVdrCfgl%=gg$6y|dDYm^GUzXj$>3=qs!7~o*Oj{$+q54Zt?v@b~u zQiA~vSj!Li!Tb;d8t@St2qJSG4ea5}5(f5po1f?gqRGO9fp}PW3?#uKU?3S59XF5) zi=GD3VKL|jGGXz+Kpt5?i4+EdU^&bU1~bbM8VrXeiXV(1OEepdf+Yrnv1ExA z2IF8kiNOR|;<&-{oaGb-FH2&wh`}_S67%a)$U?D6SY_OCpnHa2qB@2U9uw=8r z2h5Vg2I~Y%E(V{$a+?O9>n#Ns;(5zmHsr}HRT%Q;E!7y>4oe+|c5s$@4DIDCkGY|J z(*6_?mS_5*gRnHyP&6#h`Jq@?TJXEsFmwi%7s5~~v%KVnuEGioU5Ax~p&MjnG*kpD zFASByDsV%Uuf`Gq48fhZA7kLBp3|-6;&G!@7$N=a6+b4d=nS7sL6? z8cf4QWEC-73hRDp$3>B>VKiLMTMy`lHOpZ(tXYm=_$jj<#c&I((HMRS>v5mq*RaM2 zBfhZ4`iy9l6WmA`tS7xj4#67dF%l<*ToS!TlE`{W7|9}QJU4O^*0VHH255Y`knqK%~nj65alMKt&4k!J0;+0kEdC(XFsv;YN4Bnt{>1 z($UKzjRwP-iBU~`6{BHf&Bo|KSg+COA+la)qeq$b1{;kf>n$2RP1f5OJqK$cMiXHz zqR}K+i!qu));nxeOH@juS70sUMz50fE=F@mwR% zg0&u_&9F)sZISk;X_ObRHn7pxWNp-qX`j#&Zp<6jCX8wJr=DY5IO{Wv?Su6NH>QPp zi7_qID;hft>uX``7!+`0C!vtf*cm8{jiob%V`JH*=rDEziUDIcp?J_(z7&-%Lh)o{ zg;2aORziw58@mg|mm8~u;zwgOQ2g20BT@o%V~wP2!PpBZ+qkh;P_|>7gA#;s0m=^D zxE{(*VcZYOE{t!7vYW8V`XIq8r}_C6vY^Nf9xwS@&Z+nv^hZ zJQm6U>EIQSjh|-9L5wFtiNtskDTn#-6eve&T)X2KH=YIMxW{-dlo&RC2TClB-zDV) zH(p6f95-GIaL5nbu0P^vMhF>5?0w?e7KWGIw}nA9>p;wQtP)UnA(DD{}sWD=W< zhSGq^6HppyG7idP-^q9=PuOHSDNUHnV#+fq@uZ%`^f{;r zY&wxw6ES@WY6_;)pr+FF6{r_!S`%O5rgNZPrs+JWX_(f;>6k8ndWD}Zf||ii-z7DZ zP2Y!_CGE};x#?P{*}7?o)EqYboT=CO8IYRCX7o^R2{T?$^SPNosJFMxXfX?D<`~pM ze&#sTBFvnET5On!XX+iAxd^q4X40gHYuZhBF_Q_koMy71ROd(UN zF;fQhA!hE8`p7U-$<%t9X@J^DGfzl;%+EBF+N7HW)MqqnAhnsF^(M82X173niP`O> zzQXKI*g&(pVI!IiW;Vvp?w5{S7cm~Yu(Z1xmv9+*8#Hcw$T z5jJnkUWCnu&0dDh7qc0#`C;}dZ2r30Y}f+$*;}v$azMc9Y`NULX1&GD2f>!l=J)Wn+iX4zwmX>Dik9f+wW6h%kKt`) z-27?SD!KUt*s7$+Jdteoh51z2sxhx+tf6@=V=c|+!1j>M=W@13G_PSBFt5dIr1=uq z9&_^={0Zi(U~8iJ2V{GS`G>GI3-fibJ=f1`^cE~=Nnc`t!S+hGz%$!xTJVLP(Lw;( zIkvD3%Qd=%ozlUZB4-yo7Q)Ex!4{%n_YxLP!0wHOv#|SMA%X0^Y#|ADe|{kq_5fPA z0(&68a256~Sjc7et+a3p_8@Md0QMbND1m(^TPTBl7ZxhWzMEgTPxigEPzQSmEi{ll zlwW9K_I=XsTOwO{1$#Jq$C&*9-Wgy&gm<2tJreKy$bJm(0%4EFyRE$axW~I)u*cE6 zaM(|Iyo-SSH2*G^v&ZY-or66A?=F%((f3`Nv@KuU_fF#^(YqGdFW{XvkWBAE_7r;0 zll>yzYcrSm_nxq);k`fE)3?0e0(%DcK7#C-y7$MVpxdI?`;)L|;e9gf*?6DI>^Xt& z(_qi#-xqQA8(!}#V9#go8(_ap@0(yR!24#{3;FljWRdOzk-gaP!Bg@q5V;Rq&e%&l zK3s=mm)D14ICkShH5_}m54CXYl|l+d`XIp(OdlS@5keoHk|WgbLkk@H@X;HN{r(?) z;RwUWP&mR3ANRp=fIc39;~@JO1xExv#=>z(_;?bINcwmVj>GivJRC>Z$7JR>s{5EG z?J5#?eawagzzxWJ}TyF6dIc{*DcsOq2lLs8Pq@8y}uTNfZu@aYyD_w=9c zz)?=0s-%M@B0fDJM+H7&;6 zJuL;3L!u=ucOzTU<{x9}5FAg~(qTB7Xh}=|6iYF1JY!2I;ArNTv;fc9QX(8J{8F+M zSSoH^x=fB2x+Tr>O21SI$7_D64o+}OPv9i4rRQ)m-(@|VoNhS?PM$4?FsC5xD-%7I z!{IbwIT}t6T8@F!lP#Zw(@R*6htnI&NpSkmaxyu6b<3CF^cR-1;0*9s&Vw_MUoJ&Y zB%E8g1 zXmEz(^Km$j=|9K98D;od>PId`kc<3v0k6Gy*PX>8tkOXS%Pi$k~j)v^p*PUmoOqVff1*&R6=sc9HWn`zs6^ z6!2F>@CK7StHk&XQCQhR8-?7;Zfq3mRzk6Hhg*qY8zuUcDCy9BQMYmm8+X~td2HM> ztfXM094lAZMg_NWjW+IcE4Q#wjg=y{QNyj2V&f53DzH&UD^=L2H>^}+L&C~qY&6hH z6KynNxe*J0-T;U$yc(@LDfAfRuAbr~lR|Nkp6s|+Uw*%W;k-p!O zrEN8$@a-C0N%Sort_!+vg>WSc-|oSc;`gnZT&ei>0m|A;2n1OCSuxN6vsB)Dq*ex$P7ndApYyM=iiZ$ZqVPQP*9+-KO@F}TlSEr#6Z3~MLhPQ==IxXF2J3nTT6%g z086~UcKYj>FYqO_wy^meDQwR&>r32RT_zGYZ@0e3$CQwR5L`sq#X z0{qnGi`dUVxQqRNZioAh{$~W-CHkMo;V$KWo`JgzKa-@OMse>?ZS$`1vlQ-o_*n&a zx%bZpa97aJr*Kz#{(MgED)vhc_XGU$g1ef2Y4_FOmo`xA`AZvkh+o0dw#Op(D+KOG zhF@WD*YUr!1M5A1oq${7eQLNY`C8U{>p>9iTkC^Jmr5qg8P}_*JEkt z6OsS*lHAP!>pZzz^y@p|e#zFgYOnb9aB{!K`VrbBVLb|)9IeM;lQ*o#)25(XPsOI5 z)-$nbFsx@|(}UJ;OIw>nS}(+=C#~PXrWe-Bu<1?f_ps^1tyf~xm)2{%HvNS4W^C@p zZ(wr|elu+D<$v>0o59kKr=ss>7X416&0_r4o?W8*orTR({`XC6mf?31ZQfhxWKe zbTrZCV|3=C^A$Fm(3MJ?PtkpjHk;9t!fm#o_b@hJqc;n^59klj?@fOg`X&6~X8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>h2Vx>yap;sKn4>&%n@P$HveS z#=y8o0>}<$;caoVW7s3r43uR5)>3MfM7xe5iuYL=71oe1Vt1I6a@^+bM`)xbIt_@ zg8Bz#i(prWst)vSJd@*@8PCj|$ze?n7qiyX%vCQ~ta?80xBCWQe|hO-c|}d-{gQi+ z!}cX4#O{fUjZFwUQCNPbDC}}g)#IXvRbgq5?v__plvfr!E-KvXd7`W=?En9KRaj+F zRZ(U2|NG|UqN1?9F&SwmPi0;{1;T3(Nz&_YxuE~U!U&<1&%$mK!5CKHFG;!iujBT; zPGTOfE11{o+Sd`ef1-Q6_0pddzTR{7PY=D04*H#sVgK(UU+)V0UAAA?@9JL1g#JF5 zkNo|y*9qyrzw>%u?w{>_y*2cWw-`Dn>E7&yF%oa~!?>N^93{1!Hu; zn+zCt;Y}WlySX<7Fz&&dVi@=8-rR#RM)#(IjInrA17jR}QwL)_d-Dp${ix?)Jiylr z;*NQVtM?@1LDc)hc$n$~VN4L}*THxM^}%F3iuzDyOw`qHgE3iOzYE3_T>XABrl4L! zq*DDc7*84Mk2B+Gs!xY8jp{SWcn(+5x)O3pE6uv19a;m;5i{w*$(@n@{(3B_c`zEob ze3H+isR;5pG?hS3N7H@C8La66$>*u50&*5>(u@~$O;4G8k(#xhSJ2EuzA7~9AYVhX z56Rc5*`MT_XkH8X7B#PjoP*|#kaPLw&5&>Fn!_RIQS(m7`DorvasisPmUp@4eUJ;O z`5@#XG$)W;OwGr{s6~m%_gJ&Wf1qpD_+`|r^?XFl7fCKh^Hs>Aq4_$=m0a^3$d9R6 zb3dVG?bA?==7*4<^3CNWKV!|+kZY;AmdSN!); zfiUTXmi6Mc?~>3GOeTXzO9Yub`IcCiywP$HCLgpMCX+8~ISP|MwHzl?09sDMw1#gv z1=CvAlFpgdQOhMVZ8Wr8gK0C@k`GfbT8d!WqH8IEDFiL$WC}$~B~0N$%VTlflB8>? zg=s6_%3#_?tp=DP(5ks2(W<$&vsOPc?eJ_}3)4=nH4LU`t~C;-UAoq2n08ZZ+(nP2 zzcB6jCH|`TRsQSIuZO?Nem(eADh4e56}2Y96i2PeoGBiyr(rrot!H66jMj8!N}$#( zn2w?K5=@EIdIhE=v|bm3mL;L}2296UYaUF=KCO3QI^of(aZ|inU%+&dYx5*is%M)& zOs82}FidAyo2EJ|v_)XHh-=#gQ<~5gD~A7&Sew@D9NLb+lum8O$do~C$z;kzTPjQ! zs7(`HL|Ym&T|(P=GF@HQb^)gAXe%Mp4Ue``gDIP}X_I&Pc7mypwdbL~+aq74Vb22(K&I#(shB<|GLzh72`&^en+-i|vet<3wSjKnx!Tb-~5nWro%};b)v1DOFR{|_Nx{_fL(3Jvnd41sp|%_ zcynF3yv2{}Di*g{CDv6+mbI*_oVTn;*HaJ6X0Dr&C6aX;VA;XCyZhu&IvhFpo zL<`+PuJ3 zJv?u@!+JcKr35|xyrmR9>tQKJ&j!v?fu1d#ZHuJb+bCJyoz8 zxSndVdQi`EvU*W3VD&*SCx+N0zg`|zU#@o@tbV?|n_%^)-e_0@biI3E4Mgt&&bo$r zkH8wF?@fet1NEMUb)(Rm2J0r)dx5N*srM?ZThM!hSwpBdhpge~&4+cHxWO)wHG+Bz zdFysvuV&fBdNs>#^gdLmiS=Uou$_34NJlP2l>j!FrVXZozsCeYasvq`rKzCJB9o%$m&iJ%sfn>(jCDy-(S+B7Ec(Pun{=;OwiT-1--a>y8tU1)53~Mg>Pm=XE>(>(HQ~xd#@;Vxhl)x8B$Hmyz`m^;g4Mf&Lm;MfBH++g3Enb66`` z|0}Xq=?1iS=m|IA4Qn+9H2YJ}fi;}<83wk(`kWikLcPF%7V0Gp?1J@`Ft8U2xPb#u z$Yg$1I3pcD2C!k z0}r71vw=sX1n35;NLhn{=TO#h123Vh#~=qK2!jHY4Z1-+l#RlmACyfPTn}Y44Q_xE zjKR%NwqS4zln@#Wg%YY8+zKU(2BS#{$Dn52hQU};BDleLDBHyyf0WqZVW#ZBU=oyQ z3?`GZiyu4*We*K%ckJZ`GokGB7`zN6jt$<15>JD7NZHQ~7L#(28!Urzm>U$KBw(-_ z$`LmB49Zb%@Hr{R3`2~RBn7Fow&m-2}2tEBpcGOsTc}}a*7|? z2IVw{c9L=iL%X4*2}2tBoNh?Vn~tGGPRXF56jCnG&}k@_Fq8)6vSBEllq+mVi+l}3 z*`!>jp=2O|fd`q9WC zPW7jeL{iscK0+7fT`gaDTNw= zkup*vJx9u+?!ZVL)F?Lc0_skT64YqJC`alpG4`)X-lM)y_h2*_>RuWRff~a`!%2DcC`OM#O=P1ES&4zl8AI*W9&W+w7HG_@bgPJLB{_7GqS_U;s zH!6~PfsNKO^%6e@Qm?WxJ=E*Mm>1L=+*lygo9o83nAtS87wRp3Y#-Ddj2(iSYZyyl z>TMc31+{?2&WcfgLn8GK#xkH5(pVN6TQkXpl!dy`s6<7=S4!1#JnUt)YCY@qSYun~=i zFdO5?w~4#|riAe**aRAnhE2!D_rRv-$M?ZzVB?2i^T7B~vUv*QNw9fi{1j|HZ2Syt zz8Fu3%@5<}Ve{9GXTcW0k6(u^kQ>j1ZH;044%yby_(RUNo{d+*wh7};VcX2cYhVke z@fWadAqlXBki@|jDn|S*i6oteEeuj1Y|$jGg>4r}LCm%rQZQ^WB!$2hYmmZW+XrbE zY;h#*VYYa^6bIWugQO`Bk#rii1d`HVJHkmBWIIaICD;-<=_+hVIw>2rve7-2(}w+BAB<`WD^mv-NuAgG*36770t&)9B(V&CJw_^%uOW1Rw73K9f@rB zgo#wxN-?2jd_WUg#xk0?0NX=0ahbC{q6rOKi3u%c6;0&9_L!T{;7>470$Vjr+$Y;p zOgx0GMwlpvtyVvw(d#g&C4GTO2HQ*BB+qQGXwnyUMw0<#=h);r%s$XfZWMR?U5T>` z9+MGd_h6H;uzLxU`(gLS)PZ?%CGdIz$fq<1{oPvM<5bB2HC3Hw>R z^Cx@Sns;kpPv_o6kv&8AZm$^h4{yA;^7@Gh0vF9g0j3;SjMT@Giz;`Ocw z_8aV7CG0opT{Z04cvl1aE&iQ0nWKA8WY0Cc_Y^(wPr{oCpdtV2~R($Y=W1Ig6UpON0Aqf)07`M61b@~M$JVXi8g7=cZD~k+FX2EF77-seCxHXzCsu z7x*b{{-Q9Y-Fk_idIra3Zt5jDu5i;l9M>@I0mpT5<3EwSroG^}Axv+8<0d~H3P-l* zv^IWAKfMo*984b}M=n2|2uGe_`Xn6r{PcM^3fS~zIPM73*WtLUpS}%8Ax)QvJAO%+ zzE6%KOlz@Ae5SSA@9CyrkmEjPw0j@WjDZ|w`WY?sBQ~=Rj&g2BySjpALdYS~jF!8K z&1mzFF|!knCv0XH9Mv?VrGJW}fdth1pCv13YH0!WqcV=A$hd&NbX@2_`oP zvt{I5E6hHIb3JD3;0)qsU%AxJ$%wGy3c>oE-Dp1bL4!$ zfA)g&q37oSI3I}t|3dQpyamp3{pUS!R(O9t2&ah8+D0Y!SqoPc_BkES$N2mZ&L@V? z<>ai!=UUPKUrO{@d+;;e=a=NH!EaifI{r5gay~cw<`3sf{coGd`HKA(ffWk)Eh=P% ziJt#TN>~XO=GM^4EpBczR&sT7VOY7%%|)@5JpEjZxbt62y17GGxx?m;W96=4?j%+U zF?XJ=6mfGGY2_X_cO5IGn9E@+54gE}tUSV85mw4+t^_L;hPhI#h?skfl}ehcrj;tp z)nerd=AL7vn$5k$%2UiUtUSX!kCht3ybde1H1AICMCbK8g@nCa7FQ7!raMO^pq zB;m_NxRUA14Y*F|zTAQzwXul(_NVOY}7cu5|uuoZ!l!uZeJ7qOZy1x~%`2O0KK;nhDo+{_6#}Zm_S{;JUf) zYc^cjzF$SSZqWk4l|u`fG*?*Aiy{9(g6p=h;0srtu&|C?`D{Ux-@!sSTz9ds4X#2g zM8Z|XE$o1+m=<=Et3Qv$ z?=gHUhI=o4tAIO(zE!~;tNT_B_da}k33nVV0`7QPEaPOx@AGixRYWaNpp+>)^gg-@VD5 zjqlog4*MPmcdq~U^>E+Te~*GYPyc-%-1+?XBXAesd$JhxU!^VIwaq)i_k6hT;(H0) zh2G!q!(Bw*pTb@2`Ms9hC2UC#_kApR!CgvA+Iez-+`DH-lc-O_1tSMf_(a6buLx(atSx1`NH<(D48{miiRSlsyE zC4T7zxoZNJd2-k3mp8!uf-P&+Uh>P4?_+OzX?KQghJ&;PiF)dKv;q18L=M;@&f zvLA)CTI~JfK34D1kEiHK@cU7V)%#@h!fL6(=qo1tFG*N^fQAe-dZKXyt%_(`ize-H zRcNZF)yHVQjOLeEtwu{Ktv*HTFrtXunTCflhDw$8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?d}v(kgV$(>a6RLD6()7LyJ8F zLyH|7LrWL~;~ohhJDi2L#m$akk5sb~LyHp|V~YzDLyIjV!yajF#uf)4EyKvr;w;Uu WM;6GI1F|Ee8CpVsbSMME9(e#*4Ku$0 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBpc-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/GBpc-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c9edf67cf6d640607080ad2775c14760df77dd96 GIT binary patch literal 557 zcmW;JSx*yT6b9g#5sk8Wp~4N)&xVRox)HTbV$ezus|KWvvDSQMS~>x=+B(ya0BUlu z6%kOt4Hc2GF1UglxbS2ABPP6unKL6=RYgKy|sm^&HD=; z+9wK$t)ehQepj)s%u_r}`l(`yg7UVH+^&(zQA3V2kz3v=XL`Ztad5W*jA@Jk##_Kd z9Ww~-#lii9U~)TSfvGcK8b{@WO6C%Hcmh1y4IY;=1Zf!{oti z6ubz4xoRc@UY-Q=dw_$U(n*6?$3RJtJ6^g;jq>$5#5V`P+ilD>@U9aqc)|M$rVo5* z2OmA)(*`C9J|6*Jb}~a?@jO@xfv-Cl8+_{m-~Hf66>}N8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|To({Gim?; literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7b24ea4629d0d4cc9f0cd5852edde324156ef0b1 GIT binary patch literal 553 zcmW;HTTc^F6a`>fNJ|+U1WZdKHfIVU1k*BRx(Q8g4%)hO%E=p&pZ zbEd^7Ox8PjMK`8&BW>|axS~6oW&igkGq}l(87h;Uvv6yFZ!CT`8Fx4oMHIF4enru4 z=0tE`J|(&Hyxf(akmS7OcH5<8CAK8mJa(nqZ+l&STNO*h{HDE1f!7`2 zO)W7E7S4gi5O^yQV7GO1K*p$4;PUEKTm>RjJOVd4}m{N!QVP! Q2JBoE!O~)+#IZZH2g5hHiU0rr literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdla-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdla-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7d30c0500520d563d0e5891c8f4781c61ddcca5e GIT binary patch literal 2654 zcmW-fc~p~E8piLJgoLoDV1iVG#EWdQB!Dska^Z@KEGiKJt6VieWR+b7OJVMpTBmj!JFV@ww9{?uR9m&JOC9YvJu_$KuQ_Vzd^3MM|2*fO=e_Uydjxkk zm-X}x_qVsU4JvaA3e;J-YIT7UxAZjWl(oYHgStHf%8Kshp8npRe(j*HB|8Flbt(V< zen8o;8_@Od`=42>(l)3 z5_3C7W8#28sxAh9N4WMd$)m11OH42hj!JPI28xLDHX45P6A}5PLQrD$ZsAaCQO6I=ddkoZXMn>rz{cbfRZ!j3W zu@jQ>ynlWKk~fPmdh0nz-r9=M+xd{Zy%(c*cv$c9u-@fi{ho()froX0hxHy0>pdRU zA9z^r^RV7;fy+Kf0^rgXkn_PNTyT*A;Bo;FUMzy-BHw@y6CnAp5u=X^A^C`J#vdDC z@g;uI4>p3um-s_o8iZk&^FYJpLX57&LUKie(Nz`PcC{OTs|;X1uE6NyDo8$w!03}U zNdA6O5 z0B)Cq)E~NF`W+bn-)ceb9faYXJ|MX(2jKoL5PO%u&s{Z6y*CGdAA5lOUOrrMuNoBH z>%q(KX8`GaEhP6laq^E9ApXZ*IRAkZfP39w-GcZ1 z*f5LIpX{hHKy!>);gx&0*sJYz)=EPI+r=(0R|)l5F2!`8f6%JZ59>$tNqY5!E~K=V zTNiLc`YkgW!xod`NL;gnjCYK`5N+346rMbn+FWm6XX(^4292RReV((`ImqQXdXJC!_bHv5U)?UWD{U!X6n!SL9x#vjlBPtFQT9el&rG6k#4*p2 zVM%hYG&OLW9L%vcu6bNb7avMKw0NTN)YxRx^79mE#^|#4E2O?df~~r zN72z%SG_l%O*s***ZJU~hG4y=V6w<5*5p4e{YT;HQ7>~yHd$itVWUh5&NyeUUgcjg zHDYY!P_WhC@4@audUp~1d7ro0v_>$!VWqRup*^ zG@Ihd^E7$(dgswfeU?6DwPBq(r-$EW#d>|WVUMBLH*9DQ=F*rwmMp76AmBzPvbd-{ z`UrM~p(|U+_DhVN?C5m+jKa9nsh~~nM}8Y+vHUq*G^_qfnlDpw%s&fU+I_IhwQob9(!YiX*+$GL+{kvchE<} z^e2(Xw3o|tByvl+PEE9o$X%aUSIvD*hb200lQ$u^I7Yvj*DvsL4eUVM?hyZ#(=BF%-SwbR>N z&sWihQu=VtVs{Pwr<{I1472&JDDSx02)CG12S|>J&OGMUP#zv#oHbA4y zGWT3_lx-`u4pUoGg+)V)G$p^3{yIv_sW>Xes3s zwsnSZw^U`GPd}`nA4dhof&%eiyF|0&m(Z^(U;j;DwQFggC@3`47%D;?LXj}sD4(ti zcNRKxWYQ>SyyJzCa;`Aet#zgz9t}6{rI#i2vO?llg%s9G57Rn6dPL&Nx9<#=imudM z=}HXZU?xq@4;0PRICnY~GtxkuE8VWU6LUuv0Pg(B4VEzHMpni?XO1z5^;Kp?5W}fz z{VJQ(u}0#kHH?}wgXMvgnRNSzYt_tfFe(@w7}BK8mOh<7UKvcDIY4EBy)$d5dc4Y~ zz92oNpc!euF>KQJvkPfwgd|KF>rA(&POqm~(*?A~FB1yG4pyG2^=~b6L?3R`GP7;W zlTM9%wu5q`u2ycqlQ)&=UrSdy)2<4y3Y-a(rH1YXM|+ge*&EKL$7^J>p(~rOFP~CR zCHb=1N`I@T(Ssv=g{EQ?@)i5CeTlZ!_8no|3O@Qx=3l!t>u2Alzg?jZo08a;+tQ7T z&ZV7>v}M}Xu;GqP&TdO8C-a2~d`(=Dc`2JD@GgoJc%#Bu#H!fkbd2trO7{*er=qDG zuOQ!B;;uI?vTkIX&3(pjM!LhBo?^ QxJF!^-VRzcnd;s4Uw8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lc?)ts_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~ljyD=Pp1 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdlb-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKdlb-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d829a231015161e107123e211d4a78110daab6bf GIT binary patch literal 2414 zcmW;KX;hO}8VB$j_OQsJG{|PSK#(=aRsp%;$|5LKBC^T_S%M&IO_arj-Z$Gz_5=fj z1VX@Cs}=3EQ`_lc+tJ!qJ5D>*+SPSz$IhI7m~(pO%=EPL&V2ZPdCq(8z3=n;d)?bp zHZnSKsQ*BpLb#={Fgr6RJG)Sbdq%os!ukohLN+89Ru6ZN92y-t)Txm5WCh~ELE-B;W z>=~{S^;T8=(q_#RJ5FO4i>c5VZ75m`ou9Nf8*`oVGS$>tnzf9nTkfR7MP!W81!^;V zwykXOG^!MuZoU8P5p}fETA5h1wR5Hhvv7sxWE7|U9cf4}_ ze82Ocr+9vyre9N~sWy9gv+J$tb5(N_svvFbeELE5|e?s^WIqqRpM|qx_izCj;nF%}(a1GS}GZNHzEwqh1&}Ri!&HKhz|Z zSW2ntIPEd7cLmYNA-B*NV3L@MPPUkeXu4bCiB^?qTB~$2O@K_U${6xr95Dx2kGzzx z&oLd-$5U7OjoRs~)mD0`w|~v|VxCoQNpg1wdB%Oc)&4F?uvugq-leYhSMR4EAEnp* zV$=<)M!IQfi?rS1`DId7YR)Iz@*=7gD^ur4noDzY5u5$HD)gD)`w`{X+w}(%ssS~B~R?k00w8Sw; zu|1#ONT5IXFnu}+D`Gc=vwK{Tt|CN`JYGcT%;$g0I zv-OML1bO-_y^KD`|Ftpp1dHwMrbs$z$TLU+)M8r%*XS~OJ%N7Ita*02nF(hHmqD&v z77sF_W1e)nV=>2_NuxEPj8_ZOd#;fQI!`P$OZ(Zw?%LIW9-6D#peJ;YKAz~La!+Yg zH}L*Z3=$}Sdnp8fj&m6UeslsO20+3{FjB_BXk{DEOF2dXQq@DEj=)Gg3W-LHkv0Sp zZ4E|j8YFB#M$w!d{h>?K@iJ=rDV>~2Af|02hwwWdYuuWlPZi2+}6h;;W zB-UJvY~e7=RtK_X07f%nNM?pHI#~mWJqROvKP0o8F`Dy(WUd0E`9w(OyD)N;LgL`g zS|E@(V=;10LgFgKXi)&kVk1UNd5|p0F>*^GSq{T!c^Ha3nV`VafYC}YBrCfxT1|yy zwGW4%sszBZ7o?wRhU9r4jGpg;7u!0bz6|7V^*R1NCQmF?z8GroK1*>Na1_Y?r<#9XpK*|}^Sc}@Yq*)fpvQXnKR(Qe2tekADiD5Q45N#D*l@9mn;ijuFUMo_axx?@_h9t9?U1~} z!|0U`NM7aUuO5Ts_r(~!wh@xonlZXm0Li7p7`@J6y}@CQVMkyjMZ_i8R^x>|(M2N95bAjRmK7`9#;2H+YG@II`@=)+x*d=!Y$ zM}3fdoPyDHUr4T(V{`*Ta-$QYPb83hass12wLx+-2BVu3ko8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lceips_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~lkWD=Yv2 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKgccs-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKgccs-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..971a4f23f791f75d4e604ad717735ee55529eda5 GIT binary patch literal 2292 zcmW+&3s{t87Cz_yhk+4LK)HmV!xluLDa-%_0}!{Q89xgv!bn_%)-tr4wyp+MR&IvNCGYw6h3((wIh9R8} zvURRQ=(1v9R}@;ik`TL!a#Z(9^u8U0 zgKvl1;C2j_+>Vvvj+y-LWSA!0DMa5MFGiq@?uo?Uo(%HoDZ!AQN{s4x5>0m_G3YKy zue*=n#Jf{S-L02?_X^PWUK!f%t)Nl&2jj&1NmAUeqQqZfG3FN~#joC^e$AB0y`wbf zUBFm47J5s3p|{iwy^8fR9ec}l=(QvCRv`8+w)<{L6UHVVnrUpxDnX;oPXnWEFqgA! z$iNXWa0H@mv<2xbg$x{_1GX?3wc}c^LkBO=xcU~zd~k+?4raE*fG>En91Vd`%pO11 z%rJ;wNnm0f+3&-r9e1A7TxRLNv)yGuPOvacFpE!oaKS*R9d})V4~E(C#VWYD!k)gX z3|%1sx+_f6ToD?&Mk2VP2wa5dvT3?&H0v=MxMDSL*EkcnlF;l**1IQ*?08$Od;h=gnkWrnKzNb7v2f4%>%n?LppLuwh(6yYa-H zw6MjdCb0mc~m!j6(Xn<%bB-I)uMQbgoP4QB+`IBnP zm11)&sm;r!_)Qk6EoLdURFe9wO^TtEwE){TNb$RQq@E3t z;@JjLzvn647D#d1@*!?JNU=Sh)b>?U{2`arbG}kMx17`;$4c?Mnbh+cQtYsi+EF3J z3u&ZY;JbDzQoACg*tM3_i>XrV4kfjFt`sjNlX|IMia!;QdO1Lfmsio4J>wx|Pq7qx z{YdSdEyXJ_q+VGj17FPq*i!`KUY$>BpGk^+6{KE^lH#=ur2Z_V*dIZb{UuPie~A>Y zPo|jHn*jDZAn|}rS`W;H$OCIA^k4|U!FWa-q#sO>!3P@v4m3ja8-qx_ktoHR0i@o{ zlj6|$R%tm@4baj6)qz}&iWKiXMC!fyQoNr+>is9A_<)=BAvfzoZq{G9Ss!t; zKH_G5%+30koAozt)+gMoPbw+)s14vm5llFmCsU6hz{yn5kMT-5#uM;qB&knJr8qvB z)N!7Szt5v-C-{RNodY9Ia3N1Lkk`p1n0Ior6rTl=`m8{TQ}ML$)GB~e{N?;SM~cs9 zllo$i6kjYO^^a&NzVssXbp8A{+& zDOYP`a{D;2wA)FwSIN=WavWXjJA!TVMa(XDWRTY-#ej2swrOMrfBR!b8ck6#XZ%bRP# zX|>~?1^R#E?G?NC>F#`99!0z$ikav0LRrAPkWpencPTH3GF}vm7!_=*)J$#%$F49% zxmO~3hDh=RGAC=`NkQ;TG=panbE=M>$;?w3yevI}&@&x1kJQk^OUIMRayIA8W;vJr zb6Cz}Uq0tOhPtPS?ekgZ_u(mJR$8d1oO2r4zm|EO)I1wd@6!!r16b%Gfwd3d0ynk%qAp{S2oUCK%2jX)&DX{IlkK6wz=N;1I)E zhyjLkG5Q$J1`0KtPqCvp7)Kk;p=dFhr*TMgmh>^2=V7wZyomCRmSFTXT9(L%jTZh7 eV6=`zFQYYve2mt3Of*_2X?{j)l{Um^UGsmAm(QgD literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKgccs-B5-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKgccs-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d353ca256b54236a4acefafdbc08e5b719892014 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctrCoLsEyWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxZLvn!hb literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm314-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm314-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..576dc01112bd7f28c30804661f546ece203c53d8 GIT binary patch literal 1772 zcmW-hX;9Q>62|+_CEy8y9C8dzGJu2|ML=I^i69Frj-ce=RRZ<=ems{ZVz@n00OLs6mXL4yS)n(eWt+g{b8nYHPhBhV` zV~s&}MupK|AES5C?@aXe(gzPD%ZWYP%&}bo&G9<5Xj3W82dfrZw7-Togc}@{-JWu7 zce0!suUp)3Nabr8nU|gmbTq$cUTuyws~vn)ihy3niMSzcSCUz+KiC@68g0lk?AJ@h za;+}3ccrOb^gJ)gEm0~D%SBnvXkD!LvKuThq?$G~d6{cYDP`!Y8Qgg?O0Q~MI<&j3 zWZ6MN93R;%yHT`+! zWVu+bG87HI+*#~p^c3-5M0_JTTK@HOFq|re2r#5W94vrsV60Xttx3ODFEG|GHYRLK z8~pu{o1L9&S9w=`cTV>qTbt(U>S6aTKe?bMZ#c+M))Cgfsx`&FHMJ?dBl3j%2}P4% zr&^b;wzU?B8R-DeqQORPa#k(3mi)5ojjf$==A_QUo%OwmW#+BA!tui4Ej_lKFP~k~ zRoD%SCOlL=){%dvtdP^Y)-F62+*3ECv3=oahH-Vr^2y-Iph>0Kf3S3{cywQTWLv1N zPPuMi?Lg|lMzxLgQ|a+akRJP~oUE7TqZ-RPv>iFkRA1A!-B6--uzn%7DFk@DQ@mx% zUVwiyfO&fn*rRf@UVBo~Q{(2`AK4$&?%YB04u4aHIc`FERBhyqPL0YVTlzAMp8MUc zkEGvRM7|t;wud#O@0??=h#hC-(I^l^v6QKYT9uPLM8C)i6h@Ex9?PoU&?*KSV`VpIa z9{FTGv3EBje@`Oz-Y(?t3;+E?$UjIV_MsQ@4__ko(Hi6*RTKMzpv%XCE*}fJ{87;5 zoS@4&L6=ViT|N30u;xjL70l&-Q^Dk@B{z?qwTuC7IxhwL|Rm3b2_==?rz#@TUO(SMa zM}F0r*wrHBUjz~R(jNJjFB1C-k$KhBe@rJm`4MCrqf<8Bk$op0b1m4QS%-aqC z*TZ4aZ9%WwdvM(yf#n+n{&#i}yK@*F?=r}~yP4SczL@rXF2IxyiI-h}Qi56<9Fqia6^HFzX_;UMLNmXBpVe{_ekxKy8fx literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm314-B5-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm314-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..0e96d0e228e0608f77f035655140c6a235d4ea56 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctqkY-pnEWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxb;p(_9Y literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm471-B5-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/HKm471-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..11d170c75ed8696f0705f9fb9f5afcf3b0aff4c9 GIT binary patch literal 2171 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 W3S-b|;bUNIW?^7zv1XQNu>%0E(j#{O literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a45c65f008e7d6ff34edaf53af15ea471d4f6d90 GIT binary patch literal 1848 zcmW-i`CC-i8OOixy)y#?3=?IQ2uv?U1Z7bx1Vjvs#IU1aP?TlFfka8h8Nemd^tlqE zY0{)i(l!C)+;eVZ(YZ5oO(85Me?Xr;PnRG1OMmDOZIdqcZ|Ir+a6jjH&vMW5e&6?1 z{(8DH>z9aSZHI+weYU+K>S3_5VzP>wC)4?~Vd~I)yg(5dXk-&8DYE@eE zYf=pZr-eS649DE_8slzhYA6a`Kh#!yh# zPV0XC#L&G|T|0VjoXY3+>6&}a?{v>~rR2>Gq~^_q^n?C)Q}o8}cRTbW>U;rVzKBxh zi>YhAOxK3yXLRk{dwqK4`TGa-3g7)%ukS(O{pz6yO>*%4{Yktn@#6~;AJj^Gn4LsK z;wQZlA5}?woRP#eiJ!hI@v{RGKX)W?MdBAPOMFt4#H_@pgA%`dN#a+zNlZ)p`kcgP zH4>j^&Phz_TGc{3z_Q_3xC1N>!@KYf~RQ{cH^jl>Rs=Mg*TK?ST%UH z!j6I;13ON<7Q8-O_D2J(mUx50>Qvqc?gwiCKdrJ8;IF2!QxL@pYbWtNh*GdFhd2On z7_6H_rBl=>q7JNw#7Twql4u6&gYZMh^Y%mZtKu~hmmo$}c3u^;WD?j#GF2xV3^e`8 z7-FMRAVw2l3?rM%7h?xOJYUyTUI2L^IOL7wePm~eY)8?<<=f`+8EKqBmdKE8Cu)RG z*UH6N;BgJ|#9i8FW=S`gl@ed1C-H`^l{`8FtQMp2(RJWa1NN=BaP^Y>Z7;A^E5BR1wr8!54zIOIBLe5zOHI(c4R(IO z`Ij%SJ$$blJ9TqS*gW*085;rp5VqRGd4D%DqE`@&P&7om%^3}YcOZI;c$X`B8@wkq z`Xlf@SgGLsu-xG16)O#VK(jo=2O<4v)qr0P*Z#u*A0g`qcz~>9;8z^haqu9l28B<+ zl3u^2SdGN5E7mFSkjrWTdl^<6@i1BKV9hS86MR~+`oL$%dJX(0Sr@=s$QlH{1?w{S zZL)^I-v++}eizmV_$;hZ;_tw&CMy6zu*M)1`9x%0g;2qy>|TL24&iiI6XB9?4Tu!g znuJIt>js1yA{|yF>2~2EYYHOMW6eN#5mT`{p~f5#dmyruSSmygV(AdMh-Hw-qnHPx zAT8#F*ssP4APNyHf++IFiV-b!#j3-e?~K-1Er~O(*epbwl&&MLLUbUWn$%!i?%hf8 zG>ERS`=5q0o&nLT#`i*;EsEzt^p(etKC9i|IrD%mfu$sus0J}tXF3de-=fli` zT>vx3VZTUbzGC}eN^?KiCB!bf?NXRUF6kZ9M|LetjqI0TexK|HGD|&nBbjBe+hJCy zc1OVd+)&KQ4?SQb@3p|F)BP~=yf7-#U`)?|%^l||SZ2R6r$vNa)7#a4(iw_W7k&Y_C! yV!7M4%-TEI$l7s`XGdn5p&eNauv8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^gB>>l*5;>yaq1a1rCa3Py%~ zRSXOV8JL*%RRh^|EZqC*bs6?^H=8o-=V4>q&&$NHpP!LozW_JuenDx5{o+8j1Q1I~ IGw+uI04wP+sQ>@~ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b9b22b67879d4043c75b617a24f96b0bd47cf4ca GIT binary patch literal 1831 zcmW-i`Cn648pfaZ-Xstpq{U(4L1XORb!_ZPeu>guX1 zE>>69d7H-P?uESmXY&i8*?Diaa zWmRWeOKZ2kmB{DQ4+Ft#K3^cDYuEJ_{Yv0Ps;*spF+pX^r*zG^++uewccpli2U0!D zbNbnqZ&UP!?r%Hv3+hTfVWp5#R*I-=rBv4fD~r0;_nlv_xb^akUhaLls3t;!n0D?n(UlGl{m8S0;@K7)-O=bdYi7Lua5xhgXmqK*0npY8-Ul1P&RUd)G>*DSCG2yLGDwfC~usdX^b~YGn^!oyAR0?FX5!f6?HkU8P&VqQJuBkj9@IxPdH@A=^$=3$Lz~iJQRNYIwwRI%Q-@Hy9NX|4vWhfvy$5xdCh!q2SFl z@TMN8ww!XCtzx>pC1s{=1K1is<+e?>izwK>M9%G-x;D6dSN^sa*r}1<6J0y8Q%mP} z+N2SIedjT-JByqhshghNlYkjU#;(*<`tF<@=||)4b2+mWAHA)Y=Xl$pYyNj-l=|-1 zda)zw0Nz!iKPsI+Fb*p(Xdf!U;qZ%Y9Mvv2V*lK$ChP_Eb2w-ZdqTd9=siRu6rCg9 zW{-x!I}m+Byvq@N3f_|%{RZ3*GZnlarW5>@Vy1x)Xr_z!AfzA7YVe_O&4dqpgv<-z zK{79a-?N#Q!9y_X6+Q`5dVNYU8;DOU<~8s+huIAF8O%1~VKUpnnjB^)_<~~k!57K= z68tflx51jp90Y#?a|rw?nE~*xz@LFXhdBbi1ap-5*RZO{3_=jhF$hII5t-u^5^UTs$e|mZF+75UFH7f^b5l!;B=|E?i{JLu9(lMF=-yDvl@Bm<{3tM3xdu zg~&lH9U>R83=$rSxghe>Vs41jYAhe30I@=dLU*hP(Go|jD(t%NYmL>AxZ#K`L9|Kf z+Ttoi2jZzo4aVi(ofJ=l=n6X@`0Vivh+Z{*65?iIJQu=W7Qc*Ne&vXdgfpgmMezy5 zrnQ6vBIrt#felci7Gg|I)Io%hxC${5&YSiriAIR~lxTvOLPCbj4A||=#B~x6k&r?3 zNJ+>D3Pa2*i2)J|YGM%L2_=RV@l@*EmKcS2UXlofOJ;mFD;Fg_ux zo{SQg)j&omtacdXs?`y6&iWLi;zt+Q$al@ytkqkv>2YJTJPn%*E8SR~Xu(>;ax>N^ zgSOd+*qQvk8}G&%5KaGK5nH3d(%DbitR8Z|m(`%|eHma4Lwi3aL*yq%65|s8Y1Xxm z_q=pvuYuIPr@H3eTcXZ=naS<@cjStGwC>B4`qOE+f0juh@bhI^C=Rj+2NS^l7*Y-< zWvV!sqs&7GIS+HF{IE#wb||y=~ivf-csQK7Np5q&`=XgZdQa)Uz L{tvCv`X&E=BnB!` literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-Johab-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-Johab-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2531ffcf41acc01338f781c845c7f50f62fcc84a GIT binary patch literal 16791 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-Johab-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-Johab-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..367ceb226ab1e33624b30512716a3b65feb5a100 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l_>y@98n565GC~(t=abE=^ z!@ep8hJy@DO#7;V>^c_ief7Ew`?(uU8TRwAG4AJOV%X2m$gp34n{~gSG{b&zAX@^6 KC3TtiO923;%QA`p literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6ae2f0b6b7238adc67bd9231668d9853ea3c8e1e GIT binary patch literal 160 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>K*K?>yap+sKmIhf{|fg6$8UT z1}3I`)j)O~3-`WyU55SK&87_ddDs~D^D;5)=VxTtFTl;ZUr?H1zc`RB0mPEh%=@JP DC895z literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a8d4240e6adb3ac1db859085b769a0715be03c72 GIT binary patch literal 2787 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 P^z)@`@$;3W7gGNZsUm@q literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-HW-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b655dbcfb123ed06c7eeb87dfc96ecf6759363dd GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=N;^vTdW)E;jHTsuIrH~uy7IM zz6wT$eN_w$2N{@{_EiJfbu8Tb>UA0Rb2pnZ?B`))+|SFzu%DliVZQ)3>wZCLhW+9| NwgeDMN;B`50suw^GhF}x literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCms-UHC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..21f97f65b4a61adfa13f55d5a096ceab45eb485b GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l#TdW)E;jHVCD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE*uriJS literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCpc-EUC-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCpc-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e06f361eb6d429290806b9f9cd7a0aebce22be4d GIT binary patch literal 2024 zcmW-i*H27iO?oT*=I*WEh>y zWZwfw)x9+eYFE?kLGTF?ZkWX&sp}x1yUFzOj=XcJL{@hkG za{2n`g`xA~u00hMC53xSN-A8{=SKQ{uJ-F=KpToUWs(J`+TmV;>Nm~+UE9J5L641UahVi1pSv>ge>ZlTsm4xiL@ zUR92$HR^%xThXer_tqfgPo=AheX7Q4pK6Lqo$8EEof=W|YCeim-OV30sC(q;48pXN zqNcN`X*yR`x~C^prS0Q(weZC4ooa#W_GE(VPUh|6?mJat@RRKk+z|NoDS=PR1U^fO zU{v5ctpeXI68K(R1Q!Lqe@x&9I|Y7diJ)KLM~4M|?2KSi;3r)IKix0zvy=$N1%BQp z@QV_GU&c=f4691fOg*3_!7_6lnC(Hr%m7Pp@|W`a?N=-A$JDlSJ!h)XdoRZZ$n^{es8+ zT#}v752-uc&wFI&i*4fNMWr0`;%c*HL&}ghqK>#XVrBcrG0C>kCRsO5OSI8jo4(=o zxHoRf&X@aJ<6m}q+%E@Z=c{aWN9ik%+US0DMRvX}?TC5Z=5fF7mYr`hI^{PNkTyqa z+;0xbDQ|8R#BXldVcB%myEk*P6E^$T%kk{2-~L-2^Xa&IF=;+SFlD|Nvy-v&??TIV z&A0h8ey8u99|KE)<|b_?SSo3GR+a{>0D(M-Il&ZYyJVIPZ8umhv_fJ9(2BrzOIk5l zv83$HjCKe-OVa9z?*Pw%)@0#3 z!FNMzCSGXeB@!=()$LY1y#wucNAF2Lgu|oz`aVO-?xix?q}1f`yvwL z1pxOuQM6zY?F2FxO3A)(TvfUj&WO*p0*hthxvDB#7Rzb(Vx2HXVO_ieJa`Yui$dBh z54HlPA8`+a>|-B{h>;FdJ-8`m*5aLqmEs%^8&swJQ9eaK`j(n)3)p~1Md%1Py!6Mv zAe`p4{^@h9_S|a5)AFe*EbqEgjVE4p7gp;1sejeu0{sY#QecEwoi*SGYe3*Cu_jyK z8dyto;6t!>n9*PzFzsL`Br^uAQ!yRHx*+^$mVll0m;Fr#>m_p!n3v2_uzriV56lO% zQes0eh1V}irkmI$$vgx$VlzF^4#TV?<|nfrTD8q=1RIykcCZODPl8<`^At1>nO$I4 zVV(uMMrJqI4Y2EAH(~aIO~ULW_5s4hWO~5~<^Z@Pei51Hz-4GccJIO*1h-nuA%FJQ zI(U?94ueONc^TXe9t(3c;&$#Ja|}G*VNQT2ASh#PNDf-Sw}2-~!D#Sg1Y^Nd5R4<9 zNg$PYdy zg*u6k%b_mts}$;y_%)$(OQ;Y0W=_cG&-u4*3CF^)!HA~tJ1}D8@K%^rWW+%`L*Wz{ zTPU0cBN5>Y7|E9KHZszrunUGTw^KNqw6peb4h*MFc*k&2xD19u;r%eaLE%a=avWhd z8Mz48!zhr$4PN_OT`~$kb3p6;*aN*>t%07J0KFgv`uKD+W(I38>z?vpZpdqS`yVV0 zebS6a18xLjKb^q+K5y<@qb}S+36Dj=s(73agnOVo9uOh&g)M?}0>AR8%C;viI`G6z z@{?<-lJI1b8ka?}u`Zt$D>_iSEVBL=+mZ04NDAFw?i00aC6TZ)2rLgEYGp{Iij@(H zU$v2aHJJ)lv&3$zqOd$oLgG^kIi8A4)BRM`E39RbXU#&XYez-TTCb`^Jv&Gp&uWGB LRYsqvzytpSc&T|h literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCpc-EUC-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/KSCpc-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f3c9113fcf0b02e1deea8246bfd27408becc8401 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%k~kgV$(>a6RLD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE${4#z3 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Katakana.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/Katakana.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..524303c4f0c20e6cd19aa1d35805e98c2c05cb7c GIT binary patch literal 100 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe y$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{bJea$}HdW(NS2fFFMV literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/LICENSE b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/LICENSE new file mode 100644 index 00000000..b1ad168a --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/LICENSE @@ -0,0 +1,36 @@ +%%Copyright: ----------------------------------------------------------- +%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. +%%Copyright: All rights reserved. +%%Copyright: +%%Copyright: Redistribution and use in source and binary forms, with or +%%Copyright: without modification, are permitted provided that the +%%Copyright: following conditions are met: +%%Copyright: +%%Copyright: Redistributions of source code must retain the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer. +%%Copyright: +%%Copyright: Redistributions in binary form must reproduce the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer in the documentation and/or other materials +%%Copyright: provided with the distribution. +%%Copyright: +%%Copyright: Neither the name of Adobe Systems Incorporated nor the names +%%Copyright: of its contributors may be used to endorse or promote +%%Copyright: products derived from this software without specific prior +%%Copyright: written permission. +%%Copyright: +%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +%%Copyright: ----------------------------------------------------------- diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/NWP-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/NWP-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..afc5e4b05ee6f4be4f17eb616742b59aee4c5ac1 GIT binary patch literal 2765 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 K#KF2yhX4S!xj~o! literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/RKSJ-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fb8d298e9bb8e090139bbc5e958f11a237672825 GIT binary patch literal 534 zcmW-dVM|kS6vlV1!_6jlIAtre^(Q4FZ7qdzD5oo@Ra#hW!6IgQZI@-tuH22r;(#pN zc3YNZS(fEYv$QPBvQ!BADC=#XqScEBemwl(fk!HbNFU1>Bk}7gaWoL{A8z;i1EMFU z4{IWvNv5>Xr0BhQO*h7LLrrNh->#lSLj3oW!qAeMaqC|h)->Tea;}$x{o$YmELjUc zR{7a&frS$QWo5ftfMs7cJ_O=wHmj={)2+bMHwYicfu9^8oM{H0876!>2>i@TINJz3dxh|M1o(xUaIPMBE=2h9Jn$=- zaNYqt-$(7G(`^H#%Fe=N;MX3)#RlNTFyYb#;5Saf(o zt}4K*<3p7z@0?PlvV!j!_(PZ4@LR#PPT;jP;l~v4rw+n(Kk&Lv_&EXmrIm2wAn-<< p@M{eCTQlLN0NxxV{2m4V(MY(p8+a>1xP1xs@6@aCX9<2q{{oKurl8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7UUi5rR$N%+UUr**PoYhZy+br u-e4w{y8J;XlZGnYh++xso>knU|bjRFGekSdyBe u$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{r`}Oa}lMG#?cJ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UCS2-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UCS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d5db27c5cf1f5b0e66e16f6314d042a4ef707222 GIT binary patch literal 48280 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 Jqc2`({U4}20Ez$r literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UCS2-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1dc9b7a21bc59b6540d55b3d8933e5a6ba9f8947 GIT binary patch literal 156 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�ksTLal!IJ% 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF8-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniCNS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..22a27e4ddbe26664c57f778a864b6872f6c2ba03 GIT binary patch literal 157 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 Uyk~SGTv&9{NH!N6NOao&1LeutHUIzs literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UCS2-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..53c534b7fecfd84e465c8943fe3adf500a4444f4 GIT binary patch literal 193 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY*)9BicPk;tzg!q5^X z$j}nrT*t6SW_C0~i#-EFiybR_iw6T^OAsT&9w{L02E+l)b2AxQoY)v!T$mVIY=JV; k+>9*_j-3Bx_sB55H!Wak%8eoOCt*p0P(FjU;qFB literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF16-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b95045b400a77419292cab245f9f66f6298dbb5d GIT binary patch literal 44086 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF16-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..51f023e0d609798e72d46bf41309e092d72ccb07 GIT binary patch literal 178 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 M|Id0?+kYqj4{W+_`v3p{ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF32-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ce9c30a98541e23244876fef9dc67c2639fdd746 GIT binary patch literal 182 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 W-NpY7&VvC#?^62*GzIJ*TmK)sASzq{ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF8-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniGB-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f78020dd4028d56497c44b7afa94985f0d18f8ce GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY(U;%1@i;UxH|VM5Yq4M+!U_+G%+;v&G<;s5}C8#>Vd literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7daf56afabf65a4707d7bb06d829f56b247c9e80 GIT binary patch literal 25439 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ac9975c585ede6958758980ade161f687d40d58b GIT binary patch literal 119 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtKtsO>ygO9pkUpY R&cJYlpFy!nMUA0J8303WB^dw! literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3da0a1c62f19f720590b54fc1de7b027af100945 GIT binary patch literal 680 zcmZY4T~8B16b9gTW_C-zEKrO{Xki;z^rld0f@uiR4Ix@Y5SLOB2rjVUBlNpUP=hJZ zdv1(>g-o)Woy5N}MSq0Xx}bOFeWi!YTCQwVdLmXyM5o#>UP7ff4B)v+t$V>7V@)mi{{+VJB9MW zeBMkKX3fd;b1MvOy0r&Plg#y)x zX}a?kEYdC`e%><$20DDP28u4w=~n3;YfUN!NqxPZvI05?&-otvW_;5=!}nylUyt%< zl+mDX_+Nh*P#INNtw$dr{1ChXUIIS?FN4>>tKfC;b;>uvHz-@HZAgi;yP{& zWD?FQJ`$vs2>#XphHs|;qU{Wr(w_ML#!@oBh)Y#C<^_Wo0+Cb8kt`GOtNE+q)oMTu zssZYjYJJ(5D(B#;5O*QMkP8rfkc&*df=E%h0uh2pKo%j_;C90e5xD^|3b(hWWz&#b zRBl6zLD~>8BKP4&Aj^y3Hq)$ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c50b9ddfde9da7ebb2f67eba68d58fa2cdee902a GIT binary patch literal 664 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 UUp1g87AoR8lAx!|poMAw7d?}<%>V!Z literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF16-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..70bf90c0efb66da2a7aa19a820d766cfe3ef3183 GIT binary patch literal 643 zcmZXOTTc^F5XWcEIeWU@mZfZql}p1S79^z5N>bApgDXKP7qONqiI&*X4WK}=trCdA zkfrgJ7Xyht_z`$)Hfb#%WUGFXdH~!%YTOcem-5?-7jsfZ&dVHA`y+;jYbo? zQ7Gn3J-uJ9nA>GNxwBR*?G{V9idh&}jIAyGYQC(O%(7Yfcv(!FranHgker@*nx6Ti zW_C8`lIcih`Ee{BnKjtpNi`1=Fpvzl?yF}Q1*S5f*3?k}2)KY49L}4IKaqoG`Qku< zr2IqQT9x53c5B3YqmOC9#u%lIM~wufsbJV^KOvOJf`NbW4wool)bNDEc2OJ?65`;c zpP)ef6jJW+L;J(!l8eaH(1-h*q3fqC44xbu@4*4W;1a^M^}xVY#=%>S0%g^S|2rMo zWBMgv;0XDp85sT1o=4jFCtG%qf;F2tH(%3e%$v{Ku(x8K?N{7}7y(CCw>vVo9 z6cU=DzJBn720cg2BSyO~0?>^#LgnI-v}~-6~Uex?ZdBe ztS?FK`WnG{_A@qTSFu5??_F4bl~bcPvGuOHj!xVoIWwF(&yYCF9G%yUIC+ZBhD@9a nq0Syd=MzEakYUSZoypkR&at6$Y_Fabu${D4-0ek>+ADtn7bS_K literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF32-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a83d53ae70ca3d81cda827cc224ec8c5efa4f17 GIT binary patch literal 40539 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 TSv}^!0%Bau4|_Jjy$rZ_2%S+!ysBd@ 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF32-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a8713539491f51c52ba3a1525d181efd32c1f0f GIT binary patch literal 677 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 Zk@2$oe=xv)=QA%Cm7k5@(*(V9{{Wi~yy*Y{ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF8-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..808a94f0fd9c3b3cb0267e5cfe4dced2e65ecb1c GIT binary patch literal 678 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 E-=u#IHvj+t literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF16-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3d5bf6fb4ef94b452ed1ef0df926fc2bee55e973 GIT binary patch literal 647 zcmZXOTTc^F5XWcEoITxcODS8ha%o(|f`kCAn3~2ITnS3Kh_zHn6k?$pK!IXgB@lxl zOXDjq1`>VnBk)KzX@w86RX<5RfNy5yQNzGM`wl2!b8QOsDDF*H1#8XJF_8ULea zH`gXp87XylFgy1+o*0}kdG}#u2^8RTl(-T{8I&ws6x>*3k}QSDJJNt6yp{mv6cOqJaD7jFxN7$?&gjXDK+OiIXu z7k-$4LIi1V^r7?NV#&i)GL7D@v&hv`Hii#(54K?!p?enL%G%+^WhTI1i2?D-@c*5r zg#-H1YGNPzrJET0(U?m6M(A8WojiSc`a&qGB3Nz1)JIxtN{bFn6wsRVX6RsHQthLu z(MUvUMmoD71Uj_ubDtb-J8y+H3@RNIhg%{b7{-+#YC_?<=vV!H{q~XnJ!)ofBB&Rx&Ty_M)@* zHG$Px#amrwSY7yxXA_H9WA^tJtiH+xV%M?$uCjt|!l$_7g4}1w+&O{nYtGyyLU&bV oZkdt0&C&hD(B0!$_t?iO);Dsz=L8#z$9Zg|?0Iiv29(D9Ur3XRZ2$lO literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF32-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..09eee10d4fb4b9fe1e70a1ee56825a207ae8034a GIT binary patch literal 40630 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF32-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6c546001331cf4f2f68563229f994b55730dfdb1 GIT binary patch literal 681 zcmZXSTTc@~6vxk*GdtZbrIZD%TpAX!R6>9P2GbaWxIrlwF)r063Q^h(pg^&$5{SW& zrSX*)1BpKP5qKn`1s-L7z!8bGc&6%9b|D2f&{eEudws-UEt7}DLB$0>@j>h8& zV=|jtu?=gtP_#D-Msh2Y%WvoMZ;N(zNSoZ)Fs||oM&2&i`A>DHW!uKk@LbZIdTLGm z(NkONGf7KI-5pFVJ{}t#oHjW?&rxXw6yTtkegGp>PH_Sr zg1l$QyhVZDYtFnCLT^oFUXhWv!_oW9(A(!&^*JXhRyQ;9qx7C)ZTTdNwWO2w*XBW~ GrT+p)28xXU literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF8-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF8-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1b1a64f50d204b03ef0c5575233687830a1b053a GIT binary patch literal 41779 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 z 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 StUu@Nr1Glp*C4U(!~X!6rxDoz literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF8-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJIS2004-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..994aa9ef9f50495a3ac558630b0234680be23c2f GIT binary patch literal 682 zcmXwz-%b-j6voe)ncZ&xP+*Hz(8|Ubkr1F5gEq#HZUa&TftD%;Q7LTz1&VEjKn!## z=uIJ*lt3aE-gw`5MK)VT^@u_4q(qZw=&r4_igcOe^qVeVGV=x+(Iywja zzTPLn-aqxB#km20(1^O*9vbVr-`?-VAGzX?%=C|Y+hO2<0VkXF)LuTsC@?z%y0f7~ zfPe{z%;~A`#ZeG^0V(#gN*vo=5JBP^5)md8@17Nw74BHt?5T3U13;5)R)_2tZgHi*Ph2gGDy7G|gsSPOPV z=E20<%{DMJ?9j6*R6T&|J%fh^4-C8pJx)~L2t=JkqP{i=8H^jOD1KDe)4!H6Kg^l) z(**OA=?yIQZ(hd&$^9M0{6yGZP90+D?ZFIc-BwQP<*7D;L>uE#d%=hnrl`#ds3jF2 o)m9j49|&se3`?fmseq-0Fw=K)Sb3Q)N3i1Gy<)Bm0aqFS2j0}QeHI+_hb#t%0 z^sD3GC; zUAp1EhZJd*5WDP|h6FltwGN67(3xiOfz+ImO_Kb2J8i252+IbZ1!e;?0WU)R-Fv-F+$BYGcZ0(sh`VKz#}v0Q zb1)ruSMix3xkT`{1~KwyQW0&XA<3=D|8HzL{fl^1fook!;KLwddO4Djcz>% literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UCS2-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c148f67f5e9fe4a108519eeaace89e708a51f8f5 GIT binary patch literal 689 zcmZY4-%b-j6bA5bW_FiuTM!Bnkyf_RMQ;j~CYXj0-H=905X4dtf#3ogfzW^3DnSeh zf!=dtd<`$jB)jQ6$SnF0UgLt^nUi16nQtbO9QO0=Os#(8?tR>C8Bg>1Y-S>x%^TKE zZObuAN6nT~X&S}qcFnEVT)XA$j76=31LO96({P=p<9@ygOO9iVjn5Tl3iGAHukLbn zZ?;&+XyjjiqN$83 ztkG*eBzzyd23`R_0Iz~K!0X^H_!{LK;Omrs054Hq24AB5olVSX$`2QH^9BEO^J^E4 zurMqVeq!sRNpw;`XE^jAlsqHo^j&NcZ$Z_)?eH)U;%(UEF~wEF8pFA)5# zA&lHk8shCNn9?5q|Hf9bzll#(c%^d&@c=|lF2-_9Braz!S1y+|HKJuo$7=?5odWhVG zAA_ty)*%KV8xSeTeMpze7Gx7*n8`y36Y?0o0zX0ISNL5JeMFwXk0YQ6Gz5$UVR+Bh za>oebKoAQ>LpmUov+oh&ty%hY%B!SO;r^-NB>IuS(5Vu$=ykj^N1_(Fz8@6+0LGcP AI{*Lx literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UTF8-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISPro-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1849d809a679e56414f4e18dce8ca3c41109e84e GIT binary patch literal 726 zcmXxgT~8B16b9gTW_Js1`H(_H0)?8W@dl_~pp7wxk}41c(hm@UAPXCT&=0m1f*8^Y zB{3-mlad&NSH?>dZcLhy-E{PKOwsKR;4io!X7Xgtyl3WIjPyG^kW6jr%P*HQzB_?{ zzx%G=AMo`rCRNQB*-U4&c-l9VSV-!rq&}a~7JFR%tE;|?`)Qx9r8Ry1Jd9|Xucvop zXdpBi3H_;$C63r${xUo$uOdTF-gd2JtbyKP`36C@+uU_ zP=XCs_N(z6k~^P(XMem85@^@%6ewyyb6dIiRVlB_L1OJ4p7yB@tC%G$0K)Fs9@-w* z`fZQGtyZzXo=}O_+PW_H+YUvdvZPVf^yT&uQ_6j zDNbX-K8=DHv-Xptw>b3#+p5_kV*;-Ua`R&Z|5h7va~Gupb$LG|Ip6!gm77A>WlNQ- zJKu>(6&R5Z1K^z?qA%>O7IwI&G+df2O*oWV#X-%u-drubS40S=0^S1df*1jBh8UH^ zIQVrcqTo*O4v0yJDVU8gokYxl-+Y&3?q?y^A=2ROlGp&h39$uJhUp>V4a^$wCL*?B)}caCaiAiRiXC249o79G zsMG-!x6Ng90$e^8gT$B)I?ql%8*#7K{tj<$x&zJdplw%n2kF^Kp*%udL2`ETsS^4N DWh&!c literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX0213-UTF32-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX0213-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a83a677c56df6f1ac395d2ba71e60a08b0985e97 GIT binary patch literal 40517 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

ry6~E0z8>XD9~7$zzTJUQY|Ybl zQEm&$r@T#>j>5#v_#DY7uZ`Stu-ZniQR|$L?<86yEHEroO%wV0q7_B&`MB_3F!*R}}ZDRaflm@~mVVH-y zT=b(vkD~5i5sDMbQJmRMdA$KcaBdk|R_`hLU1H&w^>f>F_+o~J4%9D5#OFO2jQSKY z0q4$$zSQTPL2(@KJMW5_XkgP&7%`*`E{yR8_dparSoi#VXaXs1j$mK@~Wk#K+weWi&-F@i`mnS{NiR*a&dP8uJ($nW5cNFqHFO4$}jE7;qX9Zpf|6t;j2*Q?q?il z-{7j~Am!H#7_w{T7!+Q9j9&|I#?=@+cx@c$=UOz{eQgRB(zR*Gh{msFz))~)6>7M) z8!x)HFB?TcDvDDOocMKTj@qvKVw$dpV5qN0?nW^Ur)^x12;>-ojtQWWjyN>GV;)BrJ2KJej^%ME)|gO04B;J{`54AK z_TwcThe3`V1;vq+cZOjWJ0n1Jos$K@BgPiRLRS=vI95dGYD`V%dVU<`em(_XoIzJ_ z8aepDO>fNuWdx@5<^;UvW;B?`%_);n#By(xi_nUji^V-lFuXU@w=#Zng&^gdXE5en zIvW;c*EIB}YZltymADo~3WqM#wL(J+yC8V;u0tHP!3NKW6%NJ96D|7*h zNPiR)1tYw*zzTkQ>xhPzb?Z)`5ZtNT8^hA=ix+l>S@ja{UVy5*7jckm_bNfX-Mg$f z(BZZbI}^X{i{ZXKW^ze4XBotFL%>L~RjN$ENvr(*Ck7CCLJacdnyB?j#o!FzW2oDs3 zr0<;)#Tf|jyw?}q>J3KKz2SJMHxjhc8*N>LG97f>yBsX4cMYbhH#-i+mN^XBzKd|R zcLR!}i73vXhCV4Bh4T@3HGY~wN7mDkt#o7~9oa)iAWh~-BfIFo;M}>*Iq+=!tfw}J zlO?cC7N1dkOT1Lyk{C5!OI|>2sX1^!{JfcdnPdIe$-W{Af5tKtg~P5=>(Z;svFEV!WbF6r!{jK!IXgX&?qe zj>cDB3?%yCpWq|8q)kcqH?HbmQm5dX*?e|3Gqc~Boh<+T+|2Fn=Qr0kibgzcFf zVhLj=n_IIDYrjymw+lvcCzH$X=JIcgc6Lmi+1fI$@(V`ZF4+0Krqi-*V{CjeY0f^i zX8(kjcQ)sfRysBjpB!CIJ(`>toihbM-${85BoH8(3V;!*q(B4(aA*1`3k-a~Oio#s zwGwb(Rv4iFTfI0qB5n-@ZgdMxua0nDeOOI!Zs`C60rxTEOd)#z**mhtnc!v%MF-p* z6(b=k*xbiC@Gu95F^DiAH0t~TVTGPgUG!`ssWRhQK=kw<;&tJ%rBFU_}ZEEE0s7mb`wDO?Z zs;2R9lJZL$m-Fq1t@&KTlAnp?PiF?Eh zF|DKfPGRl}GWQL!Or(jDAKk;RQ&?G&{FMyD%F1V~&8=dUIp5o{@+uRg$KS;I`|>(^ zQ!SD=D|7D|GA|{g_gXM-jia}rFt5nCR}$!bV(1+TtoxiZ1?$@x`YQcDv9WrV#YWOe L`x{R{YNY=HNrj7y literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX02132004-UTF32-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniJISX02132004-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e1a988dc9e80be9a0803e22d021b1e81fdcc5b94 GIT binary patch literal 40608 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 WYzZKilxEs5#lWzyu91adzbpV2cs2|G literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF16-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fd4e66e81f3507b190fb2986a26a45c1c380e302 GIT binary patch literal 26327 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF16-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..075efb7054901b1022af68e723647769cbe1d556 GIT binary patch literal 164 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;$~>3>*2_)AhxfT zk9~fwLi5~Q1}+vx1|1$o21W)s^F|h%M0N#X#(mZEa~StkuyXEaWMbS`-#oX7aX+sB L>wZCNru|X?)N3(k literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF32-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..769d2142c03b10680800b3b6ae883e27fe04c5a2 GIT binary patch literal 26451 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF32-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bdab208b69d287128195eccbd084c8cf4ca658c3 GIT binary patch literal 168 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;%025>*37Jz@Q+u zua=K}ey&3E+*}4O7Dfgg9!3U6208Oa7Mo;tpu8~SzUuiojQc8BIrlR%G488xo?FDY OpI3l&zo0eKeklND@-b-u literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF8-H.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF8-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6ff8674af772af896d7d33c7addc37c57822f8a2 GIT binary patch literal 27790 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

    UjdU>!C<8eSfmt; z0yl;*-o`ow6JeYNFo!T7#zjb81=B_neCs*|TiB>B*adf2A)BmYx?z+HvZ_W+>Z?zOYxx z#Q^bNR3aA}Ir<`I;$k=f`*e|mq2^*6<;q;Z7xo>Upp6PD}8Z3DVOrQ zPK93FEc%k7gnC@=sN`~2pL4mFPhIXWQI`h+v(u$6 z&lhufk!tkO=qpOe6-s!;FXl=kajrC#7FW0h=DX5Y zt1ClY=L-Jfm9dUo!Qfw+4AWE+&81LR7K2y{Vg(Y`64nE6By5)OD=e1_aXkuyc;>Y* z#5jdav4xQ!qQqa=R>BLr+1Q}M(IC*yLbS7Rw(BcgOe&_%!qws{T&JaQJB2LV3387} z;XY*wDezSzp;sGu`!IY9+povQTJ`M^s_eRYLWSK~!rrGQtz z1-Zp>uWt9Lt9u=F^?;~rBK~VG)x8#?}18q>W8{<;6SIl+4sOwD#O^HXizUyto zf4vjL>v*u&X~FB%`}zc-4+1zD~lfZxLPWiYg{`aU<~+H`cm15~V1{5iV{g zrnsXx#XVr^qof!=xOlMZ77sJJcnmb2%nB=>4q+99)yfpF^|{4cfYF}f-7xI6N><;#0T3bLBRM>h||y?gSWpr-70?!NeP5 z5AH-b(RbQ_Km+g4c6Y|pG$?Y) z+{4Sc=M!_!Z{%JWRlV0tLhrQz(On|%eFei*^1U}5#4M3}3mttAQ*&=6sW3J7)*5|p zD=_Ba9xZuqzbE0KPws2g>b_6OeWvC69mU-5LjL#Z==+0w?){-KjMj309K;C_CxM%3 zN9+6ZB0ZdY3@h~?m$UvF(uJPmoU4QFf>Z~0QX~OtYoNm zN=8a#$r!ClmN{<8N+TufDNG60rDTf)muy$j50t0}?WxX#PU3seRqF@+Knx)a2aa`o z4<>4PFw>5698=6kI>~uwA!O@ zL2gxnkC;FnD+zzBG2o9|i9BxYx{uo$^|+I39(NP}S$NDg)Z;xc>}Nx=%yD#?QBu}WR2d_ptclyEj2%X&jIGNuHXF)DI&RsR22R-| zU@U#vbl};>EnDbF*)pnDwt`fvj4s=#8kKF6@FxM7g(ne8o^%p<(nXmk4Bsbx9sQ)A zggzO9UOkzr8a1yxb<4Q{q{DF!O3Aj=A}tRTyZNyMiUW&zKoP8Ca# z5T{keI>)WpWK;#ZSh1T#jM|EQ5>$Z${@hPDJf~ltqleGK#5@lN8KungHo%yd=Uu>c zcYV+MDS1AOGCm&xVwBO(>8t0{VV()|>_-0Q%NZxnH$X%mpYJ6lCieM3ab6hFFECy& z$l(Q={sK+cFIp@8qCG%Ykr#a&{Q~hX7?v-Ffgfq~iwRir7gIp4gJA>6O+M$vPM>l}4cXf7x52U$Q^`avsD5j{B0Y%9CO3Z7mu`WR5Wa#iK&jWmMZb=cW(D)FBxR~V`E%v&XzQ@O?GRN|jh zey62!KMV)NREg15%w$y|^iow5k*cQRRD~N=)yh>>%obJc#8=f(0;_QUs|MkVRt*c5 zsxc78k@{;=&(NxBzUx#iMro^-lWHZz)ezTdQ-#g1qV83DwNxDlbgCT&RyD(=8ilQH zXmoW`CDoDQuf|?fcXD(!wX3Ff)!acf)%{@@0fO39(;n5h{?!<^>iNJ69k+T3N>PpP zUronUZ-ikp@m)$+^R=QH53D9YOpT*djbEgu5zSD8Csq>%p&5kcM%P3GW9e#8*qZJQ zoEmn@YKG7hHN(WM85yE#CP177aS9ShRVv`mJ9=-!>NWww?Ij zV);YfG8W!4^}a>1-cE9TZ)Xx;NWf2ci(0;2gA%`84-+QoEhg#hZWCR{n^jU5BU0Di zb?Z9$q^_ryx;_Lpnd$}_UB}m|I$X=Tu~e%L-?EOyT-_WAshcm&>ek}A*D+Av`9;0M z6Mq+C^t%WNd&eaAj%Tr*cV9{9yMYq(ZW2tJDE>RvFYmTBaNg}#`aP?w_eRY7Cj5E} zjrZ*Ua01`=CE#GcAEct*kHpfyU#jH&Dv&7Z`*lja$ESV2T|(dQQThXev*m|SiTu!0 z%m>e3{V-jEKj5!^*zPp@z|8{?9CUKcgO>G5(+DLR==npX15*GoAUFVf*=@gx4!k^(_dk#MHMj zQr{Vd`mP{)5)fD4Pn`OpqU+gNu18(!QJ4BjCa|7Qg%S1G(0aBT>UTT3evi>#m@dCC z{=eWGeW9J5FLdyiW*}RFh!XRqEpTVm>(EC_Rt`YJj6o|_sG=R9{R?^P4#dy>?p?` znlDfm3rXU<*e;K ziP7*Rj)5m}oa5TWiI^&zIL$+{sbam4*EVsXmvE&AuA>jN;qFEYR#>%mshHb+qNBb}0Kv&1)md9$^__ zkMJ;}wnsWhs6B$J+aq{d_Q*J|ibpUu_DGzEj90`q(y&KZpV%X)f<5w`N7yHhJ*pra zHHbZmCuWZZ<3ih`OSc2j@5COBf%|9&6=;vL!(xvP@Nk1X96QjY9;<;T(<(=& z8DeuhIrBY6Mw&g!P_svu89*vShU-*+dvp`zW9>W*IOg@*F@~8v*4smR!jE~vj}7&3 zOk?)gB<~M)*&dtji8waPW1L6#9b4crE)$S{XBcJlZRwkZMit)*pq#cbJ80&Cx>{1SdTE;`!miHdlGNLo}5A% zPtKAS_M|tx*d&3ICux;U3Zhq%yaAr%4a6i*?~**dON#bzT|G_VUI<9m88!*u!6xD9 zTAt+O&v>epG*JR=67G>r@>(m2dzOw(T27&oR?*o>YrPozeKu*6N8aplZ$n*^z6Y1= zFhG+vYe<{i7-TY@i%pJ%k*9f|H*IoX57*yuZ1M=NZpouP?(rUlZ^1Ts zGFc_FMPrj^c(S~Ko$P5?GIOgQ0u_^vi( XDie!M@tP=Qo=5R?GKGx`n-c&3T8mO+ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF8-V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/UniKS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..8dfa76a58eb720dd1992c2cc9abf1dd4b39c5a66 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl9jqG~;%1@i;l%x@VcNc0 zKKADSxe6P;=Q41yFf!=yFfuSQG{%{?u-GKAKWdoFxUahTe-7im3Rcejj7*IC>Nk8Z RV%*Owz`9?sv6^YW6ad@#ITio_ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/V.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fdec9906621904180f42bd5c91f377397fd6cf95 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=#j{(sKmI}pOXoN*Dkx{jjaUT-^bqy(L literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/WP-Symbol.bcmap b/jero-boot-single-startup/src/main/resources/static/generic/web/cmaps/WP-Symbol.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46729bbf30f3b2f176492d907fb8ca3f6a1e3026 GIT binary patch literal 179 zcmW;C-wMG{90&04*(h8{xuKNv0%qLpa><2~3lnNLW=^QFb+%;wBoDUVIgjE|#O#wbv3o&3S`2gr-Jo93r6xVAssnXnw1B!ZT0%WQ!k{%%Po}{NAH@>d0EGtm W&}LiN6j32_>FyT<6+0XN literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/compatibility.js b/jero-boot-single-startup/src/main/resources/static/generic/web/compatibility.js new file mode 100644 index 00000000..06f54bff --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/compatibility.js @@ -0,0 +1,577 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ +/* Copyright 2012 Mozilla Foundation + * + * 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. + */ +/* globals VBArray, PDFJS */ + +'use strict'; + +// Initializing PDFJS global object here, it case if we need to change/disable +// some PDF.js features, e.g. range requests +if (typeof PDFJS === 'undefined') { + (typeof window !== 'undefined' ? window : this).PDFJS = {}; +} + +// Checking if the typed arrays are supported +// Support: iOS<6.0 (subarray), IE<10, Android<4.0 +(function checkTypedArrayCompatibility() { + if (typeof Uint8Array !== 'undefined') { + // Support: iOS<6.0 + if (typeof Uint8Array.prototype.subarray === 'undefined') { + Uint8Array.prototype.subarray = function subarray(start, end) { + return new Uint8Array(this.slice(start, end)); + }; + Float32Array.prototype.subarray = function subarray(start, end) { + return new Float32Array(this.slice(start, end)); + }; + } + + // Support: Android<4.1 + if (typeof Float64Array === 'undefined') { + window.Float64Array = Float32Array; + } + return; + } + + function subarray(start, end) { + return new TypedArray(this.slice(start, end)); + } + + function setArrayOffset(array, offset) { + if (arguments.length < 2) { + offset = 0; + } + for (var i = 0, n = array.length; i < n; ++i, ++offset) { + this[offset] = array[i] & 0xFF; + } + } + + function TypedArray(arg1) { + var result, i, n; + if (typeof arg1 === 'number') { + result = []; + for (i = 0; i < arg1; ++i) { + result[i] = 0; + } + } else if ('slice' in arg1) { + result = arg1.slice(0); + } else { + result = []; + for (i = 0, n = arg1.length; i < n; ++i) { + result[i] = arg1[i]; + } + } + + result.subarray = subarray; + result.buffer = result; + result.byteLength = result.length; + result.set = setArrayOffset; + + if (typeof arg1 === 'object' && arg1.buffer) { + result.buffer = arg1.buffer; + } + return result; + } + + window.Uint8Array = TypedArray; + window.Int8Array = TypedArray; + + // we don't need support for set, byteLength for 32-bit array + // so we can use the TypedArray as well + window.Uint32Array = TypedArray; + window.Int32Array = TypedArray; + window.Uint16Array = TypedArray; + window.Float32Array = TypedArray; + window.Float64Array = TypedArray; +})(); + +// URL = URL || webkitURL +// Support: Safari<7, Android 4.2+ +(function normalizeURLObject() { + if (!window.URL) { + window.URL = window.webkitURL; + } +})(); + +// Object.defineProperty()? +// Support: Android<4.0, Safari<5.1 +(function checkObjectDefinePropertyCompatibility() { + if (typeof Object.defineProperty !== 'undefined') { + var definePropertyPossible = true; + try { + // some browsers (e.g. safari) cannot use defineProperty() on DOM objects + // and thus the native version is not sufficient + Object.defineProperty(new Image(), 'id', { value: 'test' }); + // ... another test for android gb browser for non-DOM objects + var Test = function Test() {}; + Test.prototype = { get id() { } }; + Object.defineProperty(new Test(), 'id', + { value: '', configurable: true, enumerable: true, writable: false }); + } catch (e) { + definePropertyPossible = false; + } + if (definePropertyPossible) { + return; + } + } + + Object.defineProperty = function objectDefineProperty(obj, name, def) { + delete obj[name]; + if ('get' in def) { + obj.__defineGetter__(name, def['get']); + } + if ('set' in def) { + obj.__defineSetter__(name, def['set']); + } + if ('value' in def) { + obj.__defineSetter__(name, function objectDefinePropertySetter(value) { + this.__defineGetter__(name, function objectDefinePropertyGetter() { + return value; + }); + return value; + }); + obj[name] = def.value; + } + }; +})(); + + +// No XMLHttpRequest#response? +// Support: IE<11, Android <4.0 +(function checkXMLHttpRequestResponseCompatibility() { + var xhrPrototype = XMLHttpRequest.prototype; + var xhr = new XMLHttpRequest(); + if (!('overrideMimeType' in xhr)) { + // IE10 might have response, but not overrideMimeType + // Support: IE10 + Object.defineProperty(xhrPrototype, 'overrideMimeType', { + value: function xmlHttpRequestOverrideMimeType(mimeType) {} + }); + } + if ('responseType' in xhr) { + return; + } + + // The worker will be using XHR, so we can save time and disable worker. + PDFJS.disableWorker = true; + + Object.defineProperty(xhrPrototype, 'responseType', { + get: function xmlHttpRequestGetResponseType() { + return this._responseType || 'text'; + }, + set: function xmlHttpRequestSetResponseType(value) { + if (value === 'text' || value === 'arraybuffer') { + this._responseType = value; + if (value === 'arraybuffer' && + typeof this.overrideMimeType === 'function') { + this.overrideMimeType('text/plain; charset=x-user-defined'); + } + } + } + }); + + // Support: IE9 + if (typeof VBArray !== 'undefined') { + Object.defineProperty(xhrPrototype, 'response', { + get: function xmlHttpRequestResponseGet() { + if (this.responseType === 'arraybuffer') { + return new Uint8Array(new VBArray(this.responseBody).toArray()); + } else { + return this.responseText; + } + } + }); + return; + } + + Object.defineProperty(xhrPrototype, 'response', { + get: function xmlHttpRequestResponseGet() { + if (this.responseType !== 'arraybuffer') { + return this.responseText; + } + var text = this.responseText; + var i, n = text.length; + var result = new Uint8Array(n); + for (i = 0; i < n; ++i) { + result[i] = text.charCodeAt(i) & 0xFF; + } + return result.buffer; + } + }); +})(); + +// window.btoa (base64 encode function) ? +// Support: IE<10 +(function checkWindowBtoaCompatibility() { + if ('btoa' in window) { + return; + } + + var digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + window.btoa = function windowBtoa(chars) { + var buffer = ''; + var i, n; + for (i = 0, n = chars.length; i < n; i += 3) { + var b1 = chars.charCodeAt(i) & 0xFF; + var b2 = chars.charCodeAt(i + 1) & 0xFF; + var b3 = chars.charCodeAt(i + 2) & 0xFF; + var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); + var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; + var d4 = i + 2 < n ? (b3 & 0x3F) : 64; + buffer += (digits.charAt(d1) + digits.charAt(d2) + + digits.charAt(d3) + digits.charAt(d4)); + } + return buffer; + }; +})(); + +// window.atob (base64 encode function)? +// Support: IE<10 +(function checkWindowAtobCompatibility() { + if ('atob' in window) { + return; + } + + // https://github.com/davidchambers/Base64.js + var digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + window.atob = function (input) { + input = input.replace(/=+$/, ''); + if (input.length % 4 === 1) { + throw new Error('bad atob input'); + } + for ( + // initialize result and counters + var bc = 0, bs, buffer, idx = 0, output = ''; + // get next character + buffer = input.charAt(idx++); + // character found in table? + // initialize bit storage and add its ascii value + ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, + // and if not first of each 4 characters, + // convert the first 8 bits to one ascii character + bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 + ) { + // try to find character in table (0-63, not found => -1) + buffer = digits.indexOf(buffer); + } + return output; + }; +})(); + +// Function.prototype.bind? +// Support: Android<4.0, iOS<6.0 +(function checkFunctionPrototypeBindCompatibility() { + if (typeof Function.prototype.bind !== 'undefined') { + return; + } + + Function.prototype.bind = function functionPrototypeBind(obj) { + var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); + var bound = function functionPrototypeBindBound() { + var args = headArgs.concat(Array.prototype.slice.call(arguments)); + return fn.apply(obj, args); + }; + return bound; + }; +})(); + +// HTMLElement dataset property +// Support: IE<11, Safari<5.1, Android<4.0 +(function checkDatasetProperty() { + var div = document.createElement('div'); + if ('dataset' in div) { + return; // dataset property exists + } + + Object.defineProperty(HTMLElement.prototype, 'dataset', { + get: function() { + if (this._dataset) { + return this._dataset; + } + + var dataset = {}; + for (var j = 0, jj = this.attributes.length; j < jj; j++) { + var attribute = this.attributes[j]; + if (attribute.name.substring(0, 5) !== 'data-') { + continue; + } + var key = attribute.name.substring(5).replace(/\-([a-z])/g, + function(all, ch) { + return ch.toUpperCase(); + }); + dataset[key] = attribute.value; + } + + Object.defineProperty(this, '_dataset', { + value: dataset, + writable: false, + enumerable: false + }); + return dataset; + }, + enumerable: true + }); +})(); + +// HTMLElement classList property +// Support: IE<10, Android<4.0, iOS<5.0 +(function checkClassListProperty() { + var div = document.createElement('div'); + if ('classList' in div) { + return; // classList property exists + } + + function changeList(element, itemName, add, remove) { + var s = element.className || ''; + var list = s.split(/\s+/g); + if (list[0] === '') { + list.shift(); + } + var index = list.indexOf(itemName); + if (index < 0 && add) { + list.push(itemName); + } + if (index >= 0 && remove) { + list.splice(index, 1); + } + element.className = list.join(' '); + return (index >= 0); + } + + var classListPrototype = { + add: function(name) { + changeList(this.element, name, true, false); + }, + contains: function(name) { + return changeList(this.element, name, false, false); + }, + remove: function(name) { + changeList(this.element, name, false, true); + }, + toggle: function(name) { + changeList(this.element, name, true, true); + } + }; + + Object.defineProperty(HTMLElement.prototype, 'classList', { + get: function() { + if (this._classList) { + return this._classList; + } + + var classList = Object.create(classListPrototype, { + element: { + value: this, + writable: false, + enumerable: true + } + }); + Object.defineProperty(this, '_classList', { + value: classList, + writable: false, + enumerable: false + }); + return classList; + }, + enumerable: true + }); +})(); + +// Check console compatibility +// In older IE versions the console object is not available +// unless console is open. +// Support: IE<10 +(function checkConsoleCompatibility() { + if (!('console' in window)) { + window.console = { + log: function() {}, + error: function() {}, + warn: function() {} + }; + } else if (!('bind' in console.log)) { + // native functions in IE9 might not have bind + console.log = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.log); + console.error = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.error); + console.warn = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.warn); + } +})(); + +// Check onclick compatibility in Opera +// Support: Opera<15 +(function checkOnClickCompatibility() { + // workaround for reported Opera bug DSK-354448: + // onclick fires on disabled buttons with opaque content + function ignoreIfTargetDisabled(event) { + if (isDisabled(event.target)) { + event.stopPropagation(); + } + } + function isDisabled(node) { + return node.disabled || (node.parentNode && isDisabled(node.parentNode)); + } + if (navigator.userAgent.indexOf('Opera') !== -1) { + // use browser detection since we cannot feature-check this bug + document.addEventListener('click', ignoreIfTargetDisabled, true); + } +})(); + +// Checks if possible to use URL.createObjectURL() +// Support: IE +(function checkOnBlobSupport() { + // sometimes IE loosing the data created with createObjectURL(), see #3977 + if (navigator.userAgent.indexOf('Trident') >= 0) { + PDFJS.disableCreateObjectURL = true; + } +})(); + +// Checks if navigator.language is supported +(function checkNavigatorLanguage() { + if ('language' in navigator) { + return; + } + PDFJS.locale = navigator.userLanguage || 'en-US'; +})(); + +(function checkRangeRequests() { + // Safari has issues with cached range requests see: + // https://github.com/mozilla/pdf.js/issues/3260 + // Last tested with version 6.0.4. + // Support: Safari 6.0+ + var isSafari = Object.prototype.toString.call( + window.HTMLElement).indexOf('Constructor') > 0; + + // Older versions of Android (pre 3.0) has issues with range requests, see: + // https://github.com/mozilla/pdf.js/issues/3381. + // Make sure that we only match webkit-based Android browsers, + // since Firefox/Fennec works as expected. + // Support: Android<3.0 + var regex = /Android\s[0-2][^\d]/; + var isOldAndroid = regex.test(navigator.userAgent); + + // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 + var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); + + if (isSafari || isOldAndroid || isChromeWithRangeBug) { + PDFJS.disableRange = true; + PDFJS.disableStream = true; + } +})(); + +// Check if the browser supports manipulation of the history. +// Support: IE<10, Android<4.2 +(function checkHistoryManipulation() { + // Android 2.x has so buggy pushState support that it was removed in + // Android 3.0 and restored as late as in Android 4.2. + // Support: Android 2.x + if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { + PDFJS.disableHistory = true; + } +})(); + +// Support: IE<11, Chrome<21, Android<4.4, Safari<6 +(function checkSetPresenceInImageData() { + // IE < 11 will use window.CanvasPixelArray which lacks set function. + if (window.CanvasPixelArray) { + if (typeof window.CanvasPixelArray.prototype.set !== 'function') { + window.CanvasPixelArray.prototype.set = function(arr) { + for (var i = 0, ii = this.length; i < ii; i++) { + this[i] = arr[i]; + } + }; + } + } else { + // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. + // Because we cannot feature detect it, we rely on user agent parsing. + var polyfill = false, versionMatch; + if (navigator.userAgent.indexOf('Chrom') >= 0) { + versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + // Chrome < 21 lacks the set function. + polyfill = versionMatch && parseInt(versionMatch[2]) < 21; + } else if (navigator.userAgent.indexOf('Android') >= 0) { + // Android < 4.4 lacks the set function. + // Android >= 4.4 will contain Chrome in the user agent, + // thus pass the Chrome check above and not reach this block. + polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); + } else if (navigator.userAgent.indexOf('Safari') >= 0) { + versionMatch = navigator.userAgent. + match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); + // Safari < 6 lacks the set function. + polyfill = versionMatch && parseInt(versionMatch[1]) < 6; + } + + if (polyfill) { + var contextPrototype = window.CanvasRenderingContext2D.prototype; + contextPrototype._createImageData = contextPrototype.createImageData; + contextPrototype.createImageData = function(w, h) { + var imageData = this._createImageData(w, h); + imageData.data.set = function(arr) { + for (var i = 0, ii = this.length; i < ii; i++) { + this[i] = arr[i]; + } + }; + return imageData; + }; + } + } +})(); + +// Support: IE<10, Android<4.0, iOS +(function checkRequestAnimationFrame() { + function fakeRequestAnimationFrame(callback) { + window.setTimeout(callback, 20); + } + + var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); + if (isIOS) { + // requestAnimationFrame on iOS is broken, replacing with fake one. + window.requestAnimationFrame = fakeRequestAnimationFrame; + return; + } + if ('requestAnimationFrame' in window) { + return; + } + window.requestAnimationFrame = + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + fakeRequestAnimationFrame; +})(); + +(function checkCanvasSizeLimitation() { + var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); + var isAndroid = /Android/g.test(navigator.userAgent); + if (isIOS || isAndroid) { + // 5MP + PDFJS.maxCanvasPixels = 5242880; + } +})(); + +// Disable fullscreen support for certain problematic configurations. +// Support: IE11+ (when embedded). +(function checkFullscreenSupport() { + var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && + window.parent !== window); + if (isEmbeddedIE) { + PDFJS.disableFullscreen = true; + } +})(); diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/compressed.tracemonkey-pldi-09.pdf b/jero-boot-single-startup/src/main/resources/static/generic/web/compressed.tracemonkey-pldi-09.pdf new file mode 100644 index 0000000000000000000000000000000000000000..65570184ac82fbc478a403cb8dd64a59c0065eae GIT binary patch literal 1016315 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�v_)@^!rDg3@1D%o#Hk5G-tYeQE;I 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
    v7R`Taz^CF$7 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%0Dbq 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

    !H1ZAV|(6is8=)Ne!ez0@sCsIv8hxM`v%I^cdj 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 z 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%0D8bGnWEX=&1U%Q%cSAF* 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

    tnorth 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

    %hSe#a|9It3t zG0b3gH;$6mZ0NQU`Xp5FdufiL^J zFOR$KgCVUaYcj%{U7gY&d{}!L;`fZAlT#{RAqZ|j%!rqKK>!h$?rx%J0_?#ln-ngI zavg2x$q(_3-u)tb4`2~uH;pc#P3lqU>f>x_Ff zCCgdwE-d?XuO9Mq(u2&@KY84{d09PU^wBZmvI6y`l8;cS zbY`S%)jqY+NgtkhYkXvZdyM?>TyNkY)*_n9N)YeMVW_$|mJWKi0l|YjJasjZoM}-T9deBS^8Gya>-V4S1p3jQ3TmRfH0 zI6g*P z7u{g&Mj%vOR*EALvewr&_X7=6C}7Dd0(@6H`6G3<8kg{pK|!^@9$~-fsKioUrdU*R z;Rf9kRcgv-kwsc|?Lg6nl4b-Da=u!?Ky&tA-)nZN4)-HzY+3PbwJ4A=2W^N;0834x z<*Lvr(XAhsrYMu?mqM^nP!ceWrgBj#)}{F~CdkcIQ46fl#R+d1(!`d-h$^R2|gJE(d@zBxUS6*Q=YiLxZ@4o8)Q3TM)bW%m70j5~)mKM|KFWGU7uoj4@@S{jDO)>+l8zEHR>W=_%9Q57C3sMZ z2mkw$Bjp@#JweAsr2fqsZPb-=KI}Om`6OBn0g`zcn1;`HLFaHm9PTmD`NfI5+XSKA zDeBAK`s#;v@{&K4uD>Pp|G#woQ9=KQR%;f(i1gn+U~1cXpUYw%my>fP#fYPeqi(2@ zmnFBUrK$eDd3y2RK7!Z%dgJ4l_vwjWn$_09*3D$_6~y=ZZkN^1wjbQPJHBsT3El%2 zQedcu=5C`pL||^yGvJID9F}+z1zyp-$IDmn1+Z)}nQ_D87&;0A)GEMljSnl47(#+> zzs_Qd5+D-=52cg3y@rLzj2VgH_;h&z2FotOB7z(Wg%*w~s+Ujzm-pKRerOMtLhsLefT(6 zo)tz-0kh-fT;%9#g_zV-W$kXbx&p}LZk;~f#|ztbqLM8fzt0j1%||CY&jIhV?-A!A zsO8qq97A@G#)I6F=j<2&{r(Enavm{Uk9{_)U-5kgEq%cL~R-{e-oh46FIHE(y#~| z;d!$Z4IVx$(tkD~9k2buiTzxaPZ?u!+&W8uDAgxYd#(4@0s}3u6a6`^8dW^0Vt1@! z*{+H2_*b+(hf5oM(OOD%z&cbPd{pX0TGhd)4~t41mB~uBQN!yQx$UTPIp72kp%j_+ zTO@K8^9)#*VKowcdsd=8o`ml1aROpL7}jRR=|AA=031kk8_F1Me3w=saL6S(B~}LX zZE5*f+e~aNQ#2iM2C>}t*mHV4XRx(-pL^e;i~oys1inO$Kc#gti9o$#E7B#(}!|&_L!pY`> zyL)urkJ}j;p;@bkjCc|{ItF(h{o~{W$oX?0G9u_1z7($4EU#hZI1tbOP2B5tpO0uK9yZDzR^alC%}?Bk}Rqp zESuhXt~H;8Z40KFw>@t3f9ilOJey#S$qThSIeFGyHr)FvNmz{%rx++Cp5NCz?T+ac z=(cjTXu*6h0*<{78!!j7zh20ab>aCj@+eWK=Pc3W0`<3~a(tBVlvU z5m-V_1+W=$=A;nNdZ6Bu%hxTp4%!iCI7--81TX~3+;z(+PpghWQlAZF6y|iYvhtc0 zI^>I|ch3pR8s=Lltal{@B^k0ABjWrO-+>f8T>7DuWf=g@QZsf$XAWG=CKiDGyOUoaXCBYX*Y&g?f|FF=$oQe=&u{494h-#mLHA3|7m}32Np~qZW)c#U zsae6lw;uo=i@%*_qe`i+v}6#W>nLNnSMv|A+!{`j@IK>i{Yk?%j=E8yc?=$e`L7Rv z7qV}n8E1UY;pWEirkT&j*VostgK4m{%@WuqQGJbFuxBu;Wm_p7dGPQsEMIZ|d@Hv9 zr0n&Q>a#+Ah8_47uH&Hu)&b2Uy5~I~t2dEg5QsxF#geDyH_iXrH@R49a1L`r z0Ot*0(Wr6-R(}`qzhrk^<$j+J@j_sR=-S$rW_93rDEbY8U?)OZXd3#c2b3#=HMy)} zm?rTOb=zC1O?WGS{|fZc>>rV&z>mH?P==XWbm=*`JwPhgF4sj_>q~H7Ky;Gx^@4fN zs)3R;{A~c(f@G84Fz$4nRpT@Q@{yRlE~3Oow)Y+kTEfL9j32~PNH^Ln=k9Sk^#82#R zrJbc!)DwV&5ORn!PEw&!`%+k;Gp|$}aTSP22mqE9$#>%NFdZ)m%N_%nfEy+_4x#sf z#{i;mi@9Ie1sHpbA{Svx1Wlr++F6Utu3-zF)nvU)2>%LYH6UIb0N1~Au`;by8pM5vHd*)0DRZL zv#|8Rk)?#hGi+U^2-hPXoh77wZ4i_~)b z4RAO>i9j6zmlBd{M;)UXKT?^fLMLTRJUCQ8E#fz=?GypUI;opZjtp{rZy-2Zs$f%) z$^lDcaN);zG4x>mA>}&oiXj~#dT3`gFu4YFO$`OL*$8qukz8ovV)u)P8_0JN1$Ef7 zB%7%5Ug`*=Nnrdx{X<_9ts3y7OIgDbNAV=7vEr?x`q?OxH~WvbfKOUQ?%2*akPcd% zJnq9;4qSt$arT|IDJeq8>&+&rICX*Gg=HJ{aXncrF^JDXl`xJ%B2I-D3Cv?&?TaM* zLMZo2$8FY>MG3?e?wY}ExcQ!Rg{25hZl|7Bv68>eihtK&v3ZGa6yWb|*Qc~FeL?-P zAz2Q(G64uDfH%|2(VC7cu}}@G zmT};;z_rXDbt~)~0?~K+OwDi`7~%* zB+~9fU}%4vm-lddfN)z7EZabSMZ|Sc$(F`+X1G7L@7oQ6FeHhO**(8&?A!JGGD9r2 z$itmlIg5@G*EY0v20JnM!^aO-&hxe&iVYp9^T>Elf%;Q@Xt=@Bhdm-m8wUNdjYJzA zkI$ORQU}&XmgBmIQVw9#hs`!6iH-zwR#3r&OTmP=7R7!E!BN%$giGxs;I#89c2UJ| z#7D3RK)QB5uubbC*@Zwfkgc#8+lYs{>nGM2ih`|rI-B73qL_MBEwDXBM#cshS7mrbk3gP7T8GKuOoWn z<4J%?;-&YccjP$$<>HG_9iE%;oSw0JXh+J|)&|dx(7q0lH>I8}eh`S{L^ z6CQDu4gD-GrgsytBFP})AtZ(xGGvOm7qaEND*!85VMb>Pb~YYsE9l^>IOSfrjie8e#*$3c`5 zY-5g4RD^F1z`KVbGWNs2(E?^f$lp0snzYC8mq!n7Vl`nS*0lc3P7%`TH_X zzRp*CUh~2BgL=QR&yxAI6*hbl8YYDeR>kp3pBZnCqU5XpQ6arzcm@a7HVqjTpBdw? z4fS`a2}2`w`lF@fZ46Uepe1f@nu>Mxu3w(%e<@C0Km$VntY4fVD0l2WDzEbua?3<( z17Gw84?o~C4@7a=%`sY_m}D_myO4auG;Me^~#}n0*C?0^K#xm@)yqQoH*} zXtQYG{`l?Fi z#u^8>ApBV-*y`(z5HfI63-3sP)MRj;xkh4$;lok<;?dQ9RoCqxTZHWSP$(9syHesk zy13u{HUH)Lq8SLis-3)4`I;FV*7pA8sj+=EkKtEsS$nt6IPpS?9ii*3!@@O`6$(;o zFfhE-4d$EUAE$Y;pu=!+g$*&K1~>;s06*6dn8qy9t;*A*et6X6=_Yql% z-3Yez$Un(#3|0N`iMBHcEn zA+bz`x_p5eEEExzpsLJivz;zwda)=_6&A{Vl*fmVlasX#>JFpQM_pz@C0)E^z%&D` z%X?q0{fXn)#+8&l;4-vQtL@LIt#gfNQeZw&Qp#I3net8gcM?LXjYM#XXAC`R^2EsyUPjAp+lL!4_6^K_ zKdCLd8YjWirFTrR0zhYrDFzLbz>z zXcN@EP%HOPj^=%A2+QZO;v(Fh_`{q13i`=o)R^f8keKpTIp)qhJKYJFhV!p6pgh@w z&Vs`a9i0M#7nBlSkt3{O1$5|y_WNYEOyYmZahf)TR;ACX73N!Mh zhyo?_=#$ERB+1@Mu>`=HKON@ur;?OW9AX4ewmJ1?Ciw-TXD+f$^rTXKP~pCHrE)`F zMbm*=v3i|q8#bmkCNcZaUETgQ8Y(}bl6mw^eA~_gsDC-l|)(1*D(-+ zwt8oeotu5KXMV%$pQ8|_KQvKl8t|(|8xO)AV5(ZkH33|hS6xt~ROPMiNCdfFARi6_ z#M6&)pVkE{_qI;^(rxuo9yP7)9xQBeXZ(gp{0yIw8UenzOT8vJPz;)ixcWYigm?!g zSQ%j)UWo>6>h~1qeHModNp=PjvJI}HD-YCmDl1L6u%ZBA5{9?7IvF2TVVimi^(F$! zE#rx-6%)jC*=uMJ`=s~I%dnH6;{>JR;E>5%CzXCgT+Hi2zGFbS3(&W|4IG(U*xP?Yi($whUEkv z5$MQ}9`T8wLcQn2u}ZYSx&lsf<=zyc%+*g$6JymV*{Cb@^b$^Rr!G$CBvIXpn^}jv zDa3L9SwYbLun>7~6ohL7*wG`!S0Rztp|X*uO<9suF`tMrv0@8j5}-cAut=~Wj)Hmt zcZ8Zsl~8T`PwBDqAX-^&agjAr3i;DYyi^=>suCLjn3##LMk$?Nu5_*PRwZg3il+om zbIFZxsCl!b0H|w)_q{hNPEjyTHvJg(^qv4`%#g4$(&(u@*N{uXvtdNy+jO^a!$c{(Z_WyWc|X#C{|y ztjH2%LVbCCbL_$Uz6$W5KJGgKdU8WEql?E?>8uEG<5Ho!fQQF@(+WTd+4k|e-K@xT zLCi3nqQOdNG#Qgk!C#)dh+YTfUbUf-QM4~t=8m{h!{xwkvXg^J?Rl{U5=bBJQ#G%cXxJnc2z|Z`d@3S zgtl&qB#mSr^JR>EH56=MGqc1tgC9mupyKX+Pu@+u^*eY;FOk66Ib7j6Mde@5kUqz3ihC#x9>`>zWa~)T6}c?@ZIA&BM87^j;_eK{xApo^xvnS@yk$h$p>dt9G1+ zOhgxDr`^AM{PV`J<>1a%!`Hek?TC)f41f1jHV*V;uO1-EP5Qpq|`~ zV6&l)^7k5p;rpLjRzGN5)_^jINM(bD#nBTZSB@Q_Snj4j%m&Ku<&8j@Fh_XLmHW)v zy0!%fc>R7g7|ZEa^gsOE*>fWGf>Nil;NABr-_hqJ!@rhgIb7gX#-bP2U}QvX47_Nt z;kBnWWGJG=a^5#viiq4DgBhhrKLsR0w1b}0nZA%#ISe6as1S4%?51LN1gf&e_exPa~LVQA7rMn zFXj+Adic~boh>gS#&-&V9UsBHBGQ!slDKc-_)Wp+s1jE!$zU5^9L$mg`hRzB|M8MPklAivcp>zF32K@)c zitT@3KFyxj+yJzv3^Fo4O1nq~_%Mw`TG}$^{6dDH{D4>R$+8GyR*XBFO9f*Hr9YQ> z-oeR>@CC@{MdML>pupdj>d~jM8-Dij3Pzx@9lRAvRR|uiqP!*iG{c9l%!1ayKtKv! z`x)&+U9tNtA}vquE;L;3ZVQ;T2)^9`8CrK9bTz4LLzVDw1LYfj_PGKYo3L#U6;;uS ziqJk|1vN1d9rPBkJ+2Fy@;ef%zBTR}OR0>t*eyVC`rXy}QPz#VqY8)uE)n*r6EkpYF$#lK2o-R)F|b5tstCX}>a zr+ezBpW3|dYdB85Cz)nm)AR(J32=%{r481aw>mx#jxWt?RPy0=cZtYLc1|c<_bZAA zZ6LQ+4UGE~KOZ{XT>u7H%NeJalV&#?n!Y>8=ExknRR3!dYoRHHC z;tEO|Y7gF#N?0ji5&ZS;9Y-cgG}!A;xALtqni24`reu4D!T7J&0qOYC+GZ={W{_z1xA3^%Ly>{9;weJ@_dMBQ)S;DZtC@VfWyrksfDr*CzA6 zz5HT(UL}X~06{g*AA#ld$O)wrekNhg9@Q-KtHT;JY`{uaaPC_xZ_is=b0&*}!`Wza zO+Z*zrC}G%Df^lFGjhl80LoXf*IYLlZl-YBszp9}Q$QZ!B`Mu_ArwP)%rPK6arAS{ z2NRfTnKdV{PDl?zJU%H$!chJ*?xc1PLVI|&w+mALkG;2!>SFuizX_!q=@tR$?vN4` zq`NyLr37gN1eB1LM!FlML8UvSq#FV0&Ih>{#PxjEdY=3HWS%`gMCa-^!0y4N=Ag8|Nh=`dF^=<4hNf)YVst1w?|J z{c@?||C6s2)BlBSB`!iLv5PJxDT$NduLWlLhn0K?1f==j2TSx^EJ~bKiK-vBIa{+Y z@6vm?5Kj(g$Bxuy#tA zp5VN(a)bI>uKr$NIhGuS6}3twaQ2a>o(lWy>$(@@zvlg1tPx=FSVsS1+nRX2@yMN& zvUlKxDHmxlClcGvxim2kF6b_kpZ<|-xAq3D2>o-iY5F9hys_|uGt+qq5jyvBQ zi0YyA`eLv+$H$$$C{8JlL01@u5t+GInBrpIOW#upTsD{Jj^ct?&xsxvrW|6^v-fc= zbMNN4eJ@sMdMo-Yf$EDjQdM!dkd;=Cq`vqg(}0VJD@SR4>qj|8kAX+T{*V2%(U<`%2`8n#JXU1DxzrG}`iE8vl zx@mbEJxA!A6psE+ilkQ%n(8pK2TV9)`1Ye86>lagO^?`A%rUOY7oIUVN9F#S^)q94 zF*Dys$nsIu|0(xwX;y|;lY7}o6sR*91hX~d-Mbw8u#|AZ`wv1KRqmwc}Oi^!2J5# zL+e3*@jZ$M^8w3;_Up^Ea`9^v_|C5{9ZV1U)YA>i%{y8ft&_%Rugjcc6h1!a_zDiY zeE^LHRe;Z}l4D=jJW`O~@A`hYcdtPjDd433lb|*GS zN<(_mOSuDiCu9b`k%^y}7m0!%rTeR9wrt`ZG%)ezC#V||)dz0h zRGPOEwk5pgAROCZnmyu8N~(}i;uPb0%islCXve_JL{d!>i>6q#&R_bz{3Ma|IEO`$kv#co#Ah`Uc}Bq&-S^c zh5V}*2E-S;Z^=D(G$2+ZW@Kh#)qtZHd~RzaZD1{@WB$U-fcPR~CS|Q}U`>3nDyFcd zxz2Noi<%6?j29JUbu5g29e45D)xV3<#};~)`hOQQv$0&12pjw^xlvK%xtZ<7dFe&W zbZia&ssqQz2WMkzZJ=Wg=Kvo51)3XA2MlZ~K{4!mSdw9`>^)Y~a5$9^6jY|4HTx5; z?oq=|&E$I)HZ`W!73*t!>)TY#n&F9W3zc@3vLQ~BunW4ji>0R!sth}K>^3sBHyF=p8$E-LAcJ)4p*O*}ET=q7&V>jSzn$|R zYJSU47WlA9spdEF*;cg(8vJ(x!6o|;6NL#dT^ zD4H**8J3vrs+Hi-V%@v=Cm%zPJ-o93zxv9NxpT5}u~I_1Kf0?Pue%RM4zGJEK8-E* z%&|S}jojE#|Glx$Fh^VKQ`pnWPH!l}Nm*C726e?9m zSExN-5884$2%bN#G^lq9HYi6maGFYWLiL(Xb@Hm3PW2+InkK87oMg(;$EreCe8yVh z;A7Y;`H(He7`lQ$R`^`4x6Fd1BX{azZ^2ycFU0ehH7moN5oX0X z+7V``blMTGoaf@J(1R?_@Pj3HP1|0>4#aZajpsB7dhC~Lbzj6VfO!Mv4Vd?>Ht(yUus^)_ z-;nifF>fEm@6upkJw&G2zL$TT);)ZEzj0X=vIm|igp)m7``pJhqWVYs%bXDW6 zSTD3Ms7oq~c6r-zStI=9G|K!MPaR`7OlhtnnmK;4BVOnC_U}0(eg2(rW%_2?*<_w( zUCN&^ZJ=VxK2SKmya!r2D8Pl<9$SM@`uA6DLt^Qp} zmz1L-PcE>33)_E%6Q;csMgXu3Ol^ntJW5?i8@ypj5oE>iG8%R zf%sy{@t%wR5-x`W?`u9D2MPRg+%#U67mru#aFck4-5#%2;ivHS*!!*5;A|q3Bda?^wl`P(0FaH__kv(th!kee)tSTh;gOGrdt2qfN@}+;jq(b}8<; z^q*TW*|foX5l`^ii=M>L^igr^OgQ(w4QEeah>UO9Y^Ie>lW3+*ElSg?4AH~kqY3qj z`N94srdrvJ!+#*|;nE{tGE1<3r3D zJTHNkN^QuT3_2J}n76**!C+eSFz<(;mQlS+!L42SpX|UNHgMG@R5xk)&}D3*zj6id zp_l?UeZ{9+njgVd_uXgl=wMEh4@>#$?o4(y>$6u1nmol>h~Pfv6pb z+CfI`S0lWCxb?r$+}mQ_ch%5;b;{2vp1{3MA$|ham-yse$ZKNCamGs1246dN|E^v{ z$eq2h_)+u8ar=F~{Jm63c+G4V0aHyA*6tqGXrrR#Mch@nfTJJuoda1EuiuzpXot6f zWw6Mj=E&pv6H$j3ylob1)Vq5kp7%&$9k8`{RiGcfvz;#u%DdXth-LATVL_Y2fqV zd>7&Kw(ds0KWTUF=Q$%=eN0Fc(_Y8FO=nHnF|9F`u(;7--EGrxHW%N2VGx25Edt z|C~m*EQb};QWPlLnN|>}jVz};Y?&i82QknJ?{fg%3g5I1-I}Pih@5fG^hwIJZ;Wqh z)fLUU+i_-COJFlS-jI{^AA=6Hmky(!Svo{saT=Y+m~b$zG1czU{b5QM(PF3c z25X;&xN1ujLx6gLJOq#imu*qvY1!cF)lT%HFE?2u3PS<3-1*dADG$KrCYN zr(=RU6xYLkD^$_$us3^SZ#*N{Vq+{g%DxGP_iFFXPuy3E6)yu45!I`p)=Z<#@i>MZ z18H+4czsw#(~$NR2=F$Dn5HOpLHJ^j}@etAO;6wa3BW%XEFE{*>KZIUv8an zi&ATVlLnmhf5J(FB91P%G`U5_3Uru(4l~eU2GwC^z2bNN@Wp?x&wm&nL4jkJJ7wJ>&kAIU2a_mIB5X?1n|#)EB?s}iVtH1_%MJE1NgB2 zIX;XP6d!iErQ|Jg(m+HFMAZL@h#C~sb-97!EizVs69G68fD-}9iGaeuF1JDj%o|wk z09ftdmalfe1_}dX0x&ROIy5jH`rkYqnhg{NcDZZtEpqF?U^OsU4GdQQqrqx6P(&Hi zEhEYRy9ewZu={^z_n_dk%e}Gze-Dg%1LNNR)^Tq(P;eU4ErZhle-HS3z~BEfe-Dat zV*-{t0~RR;7AgK0EKs$+Xe_skK?CyOKpy5m>Z*zcR&{%F6g9g|=VE2IC|1-M>g|o5VGMo*_ zxdA!1|3uCW6obYJFla!|4am9u3vzCppcph(fI$Py8!+#GgL#8u&{%I7g9e1!K&bs+ z2(>vufn%%yI0k@Y066wP2aa)q0>@YZa11b3z*ztHj1?3(#tMLAKra{Q<^CIbxuC!? z)>{US0li$Hm;0aS<$|KUSOMA#pgaM}^WRK)a)P40SZ^8a1vqKIN&hFDG$=%i?Uo^0 z0GbJ)nE;ykkI+m`P_!2tKzjj+G9XcQ`x9ks44`N)wp&Jf0WmlbgZ~F&a5e@|>=xTC zW4C}99Eibz82q2a;A{+_FfcX%0|UqsfGqi6BTLvAKw)5Pw+sUV_Ob)^vIF+A1F@GK z8v`hCj12(CfP5H`5BoRd!$5&!Y_|*?1H3ojy#enH(tCqK&Da3c3_#5Q)a+l3nz1o} zLe1C!)C|a=0U5Oay$l*C)QtU>p=Lk~4#eO<3=T2|2St>z-!h^MKu!SU*V6hwMo>f< zJ3y2H$O(X){0op1Mo>f<`z<5NfP5H`5BpE#!$9$2?6-^$1EydBQ?P(3SpR4W79%Kd zj2!^SfYch0TKiY0)o`4>PcOjisVJ0}yIfrY-Mt_d6)6DV?p<8LtSnSq6otuZ4pBL@dN6CAzBb2D25 zYhrp4GaXw4VFNu&eFHc?J~$g&YXco~I0x_n=U4pd10!b@`&~^m9T3b22n>*4qjli9 zVLf2E!9!3!+zENl@4k9$p~#|&5g8X20unaUD9Vdk3I3A*ou+%gd7MV zsi5sG_IVw?wz~1V)qfZ)x8BY|By#ztWB3eO=~-XaE>`YI&Cf+of0a-io4_1GLhPfJ ztXOfJ_Hsy^Hl?pR6@vQ+tC2cJITHmg_Or*83hxu@Ewt*MzeqH$He=R{LM*UhLs*?y zC2Ft6*>fDO4S>XZ<3?0`gf^^X7 zU)BsJb#(Ub95Xs8+&eh`9E$avouSwo?dMxPv*rFwo6voT+3&;fJnZ#v`w#f`pN*tV zoQABAx8kLlh0bz8GiMplZi#37T<>f6mTpZerkd7PL92yit}yw-m@-|ybH$mw8%^Js;Kd| zuQpj7dQ+lL}TnIhvx$1@6E+8Cm|NcyoY`~6T zgErBT^U`ZfITri4ph0k9&wVGB@9X2flVn(7!#Dw?K@%i%bG!_?h@m6D2)v(_kV=KLGwV`+3FSMMUIHTikTWcO#JQ94IiCnOrNs48t zNAo4Ha2C52ef0sJ(&@R}cTZ*RTJ;6xlDw8fRYJp{0#QaG*Lq2v)K_R)U$$Ki2!kA@ zvMX9#(M)%rvtmiPpxLZE&ynsfN+?Ju!Wxzje*45yKPq-QzH1zw=N z-LqxjA|6Sz_7m35o^~nrk)?&G(`f8q#6nuro1@B+&)=g}2AGZH6%@lFF)-&A=k*N? z5Bh7?9I84^7;*Fv9OD#|ThQ7~ci4B2zo?w*NJP}7k|m6ufpb97z1Z<_dBN(!C^g*N zj!66ip3}3XVoRLUGmP1RFI|6Ip?LX(M=N;}%Qf%wI$k8E{T@G&#m4^8mqq#Uk0ufk zCd%3=sUN-aduu8`V?`Xf1Wc#JWsBk+<85uHFoqURXgxCP=+@H{K~I6Dik+S0A)o*D zBeQ%4T1sG>8!8<(ZAk`b z@>=LoA3-jVocGlC#TPKS3nq)rE-lULI1$ILSi&r>y=o5tL-N@^K@6C7Cqgt;dvS)C zQoz=~upi*s(&KPmQI|M?fZh#9ZR_ z$a2DVw_bW_>|%%IH1)=R4A-%&GlJQ+NzHE##YEb>?_6^hKds3p=BmcAk1&BmkC3Pe z=W;A-5sWjAw8D&7OE{9ev(@|h>yX#Gx;$LivVy>8d`Wf#wS=u-h1sgbS)i4)GN9jt zs7${8qJ1ydax+E8Iy?XT<5R+AuxM1aSj$kTfF9Qga>s=8VV1T|ys#Bhe2el#53P)Q zZ@$+Xo1fRlF$Fzl!8U&Ffouf7F60`I@KdOWgeEy5>s?UND3;;23-6hZTRxG^LykHh zWTc={u3B@Av$C#6-eqG^qo?~=G-CNFB@E)GD{H84)Pp#O?@2d@BWIhiXYai#o)>S; zy+6Wkvhm3-V2gcUlvlrc*d6A)U@MPpzvxG{ao5|9S z9-=#=;o(QN8lfNRAF#~9XVq#}zwoJ0(t{~LVn2Fwu(7(L!TWu(-I8wMi}Z{docI|o zX2dD0UPunJPr%u9WkIV}^J(drmbfdy{>rJHPAeG+$EWr<2hrum)q>3t zdZVMJ^t4K+zWD9f6^XC3h4+-l&;wz$iFypX1ZoWfUCU#>l6pc`6VQ06#Z5-#de)R< z346En;RXsIGWO!WPku`KHJua=QP+&Y-Q*AzdpdaHg{6Dl^KRUU`w88chO}om*e|o> zVj3qi3hcj4(=VXoseEnfXy4TCWmuwqDfcitC& z{QN%u+(W)we<8GTGlTN!u0Xa(S?n{htlb2fegehS+*#SPP1RE!6~j_=%V#`V9Ggv? zq6*WTnH%huwVP=_PZxhGc#~Pyo-FL#Z;dxpLM5VJ+1=!FbM#P;h*Qv%l~pH=3^zRN z*E1MUQq`164!f7$24@|TF0xRTQoYmN*j5c2=UlHWyG*~O{`HE_Y zipKjSr5&!vrag=D-%>y2T0V1=u#~c@l*NbgByF63R=7f;In?BO#BRQ7v>UyfFrKkw zNSE6wZNZAGA0WvdzbqNc#++;Sk+mz0v2kRT&T~SCeUXJG?%*wR)KKuMt*iz*f$ztL zwS*)2A0i0FBYli6V+Y?x^w=^XPbL^m!)U48Y&&wcM)b(LicU$y;lw3+gTxo~tgQSh zttc0j9gTE-2L?rEl^nin?i#w+y+!3Ae9Pj5n>6)+Qdf_jmVVkIRZXvCiJ~|~&hed0 z@^T`{MC6=g5c?c?i$vDGt$NWo!${JnSFu)vP8|(IJD4?!@7^tVn9)Oc(S4Nalv@lF zFvm4DaC7|78PDZ3W)k|{Xq)dNJymiLRkD8h;P@Fz8v=XNW*@=bE3r9@byzY z20UHy1W=kV@&_5B5LI4pO*%H!6SfylwvYfsPCD^D>J(4y?8vZq^TMh;h=Q zxRG>8UN4rauFvV(V(BVzuN!4`rd$Z~>gB*kf7BnsI=Bv|ZdOH#ipM$So9NQKX~jd_ zeD3F5E1-g)N=w(43MK9@lH66*y~gt4(2N<6g&JXRuAHMX*tjcI$|XxBH^2zTOpk%= ztNY-*{*$M%#UUxNcPQKM&y$J0vYcGq#r{z(QT1$1^eg8n#BJ1OblodY zi#RSVB*d!Af6HJ<^fAag=i!GCwTJVVPgE=@sRi0zKIMGYrZL4nB8NFFWb*FtB=_-H zuUIuxFRoo1_P=o9<9)w zj(BOR5$zdYgGn__{l%p=4M$lQT3-ZEw`M6Iq+zQ>eee~qEFF9hIYu^A$)gyM)Vx71 zZiz#)k<5-R#b^d6UMTsEs=ElyOl3N;TXiv)I!EpqBW$YS*nH|q8vXny$IJkFh}7A> zW&xV85k>N-D8zQsn9mdsi(Yqcl|DAOH2EcH;{S<)r%}v2b*n=z6^%MvOdQ@& z3NMmJVCCHpS;tE9`MB4d#jfUSJq3bed(OM7+(wH-wCzVPhO+k$e$*G$W(me*y~|F+ zqFrhCUj*-LqoPi(&kC(b$qBRAS}IGPM*otTK02WwtFHO++xHOOrxU|bL-uTzD;@bG zXFpkw)%zC}J8_NUEZ9Eiu{cVNe+f^8RI)X4*?#d=I_{JG*{VeGm|?M`5gUD;d7GIk zXO+u#Y)4w(p+WpTx3`}oj3u5u-AZqm_eQc!kZj5CG+)k|O~4j6W1Lx$bM0sw4%cg4 z#`VLv=lrG_&UueRx3TEe#(OZu^_Lq}JQ-O;IQ8or5F@iil*W|);kxMObBMUKv=jbT zPx%PhMGv=aYpolURnry0IwAeqh6Lw99jWflZsw)QK-7oZw6HTQK%P?IT&4D6%} zrRqke?aFPos=DafsYy-OcYZY}{xmj-w`BIvrg=%dw#T7E^KFxxLdFvn_0;^**yJu@Qs28L7SCkikZSeHrJIMsin}RvPC_~Qwy!bG?-jxXE?v-uTe)Tp@i8SlG00T)c6R8elJZ_$|89L!L4(!CplbuTQh%D(;0sN&p6U)pgR7N(ISvsk3& zSp4W}xY^6&xw#iwGB!G2HbQ>Tdc$h8b5HKgSL)G?kFcrF%9I_~;JkxdTw7}sx8j78 zJ-u5bBN;QmU2JG$>}XiXbNt!~w$S&vV{xTJDm5ENB}Zyi z@`%oia74eu3eK*PUCPI-&P4A=4CE5T;=T(mG)Qsh@u{pNEKbfTsrT-J=U8ZG5m4B< z59mN<>*X9VD&~pK)6zt7PB%8#i->y+gu)&0+SyqJiYLS}IC^3$t(VK&@bnI5nKv75 zwpH-kjyOau@UbD}U~zbCN_0yyYrSmR%`{Y+;? zJDulMEpPit)=CXFVk5v(;&e4672%xG+q2p1`Dfh|R~31ylKi9%PAQ9*oV*D|t4EU& z^=xR3kjk>9j0!55k$mv$aZbTq<#VFXoUugiF{$E&hV#`y9GH>YU0XJiQQu7+b`Q|3YQI^GWP+5~0F|#F1b(&RK>m3mpX%`mBvvbr!xIX^;t# ztWA@FJp<*yvXq2f^0LEj2yTK&j{LS#pp=fCWH1-iz-t)_dgVi3^`QRq_U0ZGJ5izM z8<~2&{g1T#6=INaC*!2w41BB*Ahmp=fl4)>=17z+Xt%u!#<|iof0Q_m?Zpz&*|#9| zV2@4GI8szezZRk2C6^DyH{E@S6x=uMkp?3UL^<>lS(=i3{ip>;b_WzD`XJHw@0E1MhcD!2ns(wTS0SyKz%TUme-O8#sh@x) zU*Jel=YAw_6qQQj8I~EDMk$*|Grx_<5ZWE+OgRxC;Jdi;q#FJ!N;g)h1E0gDMIK@J zVLA*Sm-E5F10l%*$6>H+YSx2Q*txEar?pm`kFfQ23h(1%VUQBFV~0It>0)m4m%3+x zW6nadVcYB-JZ*##Z`F!j_|o8YQqap`*+vyYQHRkOm*ov%CE8kL=%sJ|Lbb|SN$<*P zOZd@Ud}n;vNrET< zk>;qYS=8c0dHxvMViG6oNvzwh-b(&?Ym2}Ck%1b$5X*y;v3HdA&(W2^kA)aWNfp|j z1T%$@)rqz}31LD@UOZK2JwhUyd54EYfke1*-*0oONWC_R)5(_C5To}*=i;t?kzqkYJON( z-I`IDLOwjsR=j5QI60WbF?6liRB!bu4EszC#%3+#b|sWkI@u?6xD>GpN?FCMdvhKV zQyz$7bbO&2%OP_!9@aWk@ef-Yu(IEZR4t<(5;K#i!vy&y96s|+Zq-zo-&W9pz>Ixp z^#iWbOu^v^CgT?|4`ggO0cGieB%Wp>`hlkzB2QiF<@Y5~dKsaSoX<&k|z z9TOiaj-VL&66rjQ-%{MJF`fK@@`KsF{54Hf7~75~Qr%D4Ib`D$BWVYtrtKqX$NQCw z_rF7bszsZvrz0)Y$$@8|weiB;6YdGoATfyC-X#{7nN7Dq7s$MiOS<9IETQa5eE<#3 z>1&BJ6aBSYinDP0EjtDgjpAE5ha9GKrXNs`QnZ0L5_;aa~ zj;~ZELFD1YvVerMY!i`6->R*yjD-a*j+$0YZPnOYWVFqLY<5Xg&3@Usielm_o5?RK zyeh30mT!65wOLJO2|_8)29qTAEwVxab83zH5uB2^2hF6chk0K@#!ovVW-olB$={6* zWil|0riT&=31)s3sz`^2{dh6G!If^7UGZB*dv_Jhse{3uwdt-8O>eysi_`LITAfQ* z=;%h~6OvWzcqNx<``0`6lGRNgtkxc-OKB3=KqMbDD#emx3LQhN`L7oqdl=3Kb!6cf z{D?MFOgVW?tDsoW*!EnJyygpCe^}AzoY9E+!(uRFa6+&$h_Ce!@-E0#qD4^;|FQK)nuHvY>a=v5EI_1V>l))6L_(}+x-P83%S@Bk;Xiy~?geg?@RS?X% zr>pEsLIUNjOw!xc5rdkG^+)c3I<&As~%gg>EZ2-2V=$@v}% zcA)F#p%4g`!1t0j;FG9&8>1$v_>z<0dK;r8Y5H=J7{a68OH%a3B{77Rp>23ZVhAHc zCY*|bAs7ZPLoS?&LMC_*o>9a1J_(%nLzMekzC0ulg3r+JEBWG+6nVFx-Iw!4AUP3C zfe$A4l7h)c$rMb138wK9^?g8s=KTUbnAl4kCLLu{umN@&$A%fowMj?XR z^gwaLnz0nDrf+Z(JW=qq_vWBz(DFJcMp=j1EJHE!J_to|yElU@SWVWj?tKu4VhLv@ z;yVeq`39v9b!JGgny$fA@I=g43vM$DB_C!JoK*EK|{BfgN!ehmxHG7qSrwt z$|KYn6%tpP24+DX+J+!62QlA%!4qj;3U3ENUpYY@x&~yggIbgz*v$--AehYplv%;p zdox}r$go!GzIuYfUfAgOX&O8Qd59bKy~?$GlLeiXd@q`4PO^qRqe)Ur*1+z4@CIcc z#_AJ_s8_kTFSqwWC5k=FCM$^r)(jho1;z{}i3R2iIf=!+87Puks)k)bb&7^kL3Ppw z9g;lE87dMH?{ZmRYOiv2-+UOWD3nOJ|Nk!-T;XHiPC+v?-DDIzFJ<}$E|NjGLJ{8q z!5lQ*RFtoR2(XL~8{kNwyq2(ZD^S|Kme6%GQN+EJX@v7pcm-+DbU&hykW_jvq3L>{ zYVX|p z4r&n+8i8+0^z@k2AYW3Au#+#{+msHGi1FYs#~!+*IAQLG=G-cyzGWdc;tx`h?y{kq z-~awZg$*T_LKW+&g>YA?u&J*idhUHyoTnE25jsV0e4+dlQ4mpf(P=4EMdpuMRK-fX zj2UI3@;N(@@PqU z;cyHz4CxBzB%UO&UX~>FB>W_^EUtGCLzg>_ccZRf+Ed=c!S_thj{?Do^Ve}vQfE^Pj8(qii&ey^0D ztKbfe!69QW^PF?^lBlp0Y8?3y$-Hw&4u!8IDzD`8N5n^boJ6FKVN0kLg`TE-L5;plLj{z1ur4tmVf6-Lv0*zY8N#+z;t-EVYh?psiH{&TCdQE8XH? zB$3$pL`dP|%mY5EPm#t_4V+#ySTdXA!d1R6(S8ztmn;d$nhD;<%P-4Er z5uWP8l1UCp9QUCy3gp1?ICF&yg)#3l&$Gx#l5*<#A_zO)Cz$^xD~ZU7aX;$GecjKL zD{%D9DRw>FIs{v1=ts;`a#KVbE)bK=^`iAY_0SvV1P6G16F#Se8%k3eQ}`!t;Aj3N z_S$ubv3JkzoG`u&-$yRYuCWBKgLZ|khMmOOu=HSepR7M)J+PZ%ol>f&r(LPeS50%$ z0zdy!G;v%+)_!a=MYfcn0x^N*f#tp!e1`A*sMKuZ?9P$O5|Pj&J(U%g??p|=r0pi_ zauEs>{SS|YzU@EQxPubQ<-IankLac9WMaXkp?dt7fdMJj>-^3JN?#!9 zPi$vYZ3GxdArKJD+br}57d_Fem3*Jb*_*X=#l!6u>BAlL5J8no@ZqMsm65r$RZ zIX9GaIbrR@^=Lt_xu4-KR}$Ebzp1qFUdNm=oFbnRnSz?ierV6TT-C)fUZpY@O_5a8IMCs35e^u@H3N8gkU0c-m?Fsrm8#+M~+z z-P6xVaaLN!QpW4OydU2QRtZ)Gt-<}|sU%GqL9Np}Mw<5|=<6kr{fd-n?DL?Qpp2lF z;O#3XV^ibN-dvJ0yR*UI-09rtsOemzvNp49uLS%AuCjs9?+tGCpDeQ*2TRCGC`%5P z(t4W0@dQnKb6CT(1+#^CVrn zx~T}ywXte)(=YI_brJ`rugU2?yjSaKP-lzmPMuN;l_apSv)!&Guo+-Ok)oG7{yx2B z#Htb(GVsH$EkKjv4CTcCl(%Zed2H{sM42jCwp|+)bZ(19z;0992@^*49ldlV78P2} zcOCR{n2i`E^yTak{)JM57j?cRIIMD_Yy)QKb7EF{xnWBmo^qLaa~Z$(F_U_P z`6!`uoz7G4a&IiOjT&=qv$MOeUCxGBmllV#YGv8x)M^pwOL4Iqw7QP9^u*6uX-^-G z_AoY`<6G>7IaA_=AcIGOVL_7C3rv9(5Di1G-rWPk01#uFcWc%A#gpQ5(zUP4Iu>*F*Cpo!3XM}X+ufhm50FK z=ahyDgCOH)WFUA50p|fhOw~D)F|-EV9eSO{`?5qU_0(eJrL0&a^+O+2v5NDgwUM(9x#BP zpdTO{+&h5YfZbr+K;0nO0N=2mvaCO@cdFO&u=lX3*K&UZxejItY2@(;-0jX8SoPf# z!UKX0@)uACv>Q+xcvD05EA^)J`R-Z}`4IVFbzquMu1M8)P7oYW9l#w39gq$vH_)e4 zrkd-S>-+12+|%9r>ybSuJSg1d>My@HkU`)<5J6zbkhAqqr!GD-FYq~_gxwj55qMyD zz?_lGi8$b#u?~Sr zSlqDytA$fXR)b)pmuNf$Onro{5V3|mn!Y!F7E!$19gh{1=uk1 zD&!u7llwdO@p?LKiUP=CBs0h|2sQW4dU9>j0&r#I9LPZkQ}=;-Ds3_b1O#x;dN^&c zCFlsqc6UB)%7Qz}2s;qG_4l<&P#`Kj=(NEZh(17f-2Lvsrj67CR|3|_kKO~r0=8?m zbiN94I@wz=aUN)RmSCRhbjY-K4pyAyu6u#5{f(SmLu^+ox-c=Y|0dh6mV01lVfkHn zH5Z(djq!Kk)kIN72BsUwUri%pXZc-~`D(h#O@@y73XA7pyixNCrsZU2zP=Lk6@tge zz;L7VioxSxW&K_CN)sC!=kLNRO`PmE4!_dG!Sb8yW4@t@?f3ClnmAd1x0K~d6DRZU zE3sT@Vq{?befwChMX~%oDa(~8PUahhSDH9Eez%n6O4G%SzESmB)D5L9SE3j%8gSiy zmMc}9Yz)5(uSGHaE@ZtD#mI2u@v~m3x_PTuuS792u>Woq>$NKO8)v;%#q#@Bv0ka- zWcw|Z^;#6`?^lZTN)+dfd&+vP>Bci*{jKSDli02_adP~=C2Uuc7?~MJ8h!T%_%bvdWzuTrMp4Y)+{FH4zjylI!P?&WFOe>aQc z`t`eEC>+$OdB{uae~CF+mwH0PD7KOQ#cm8?J7dZmh!^ZEs5XSh;z(SRGJ zSF$*N8vy(DChnZv~x;Xy&y=1@MW0sxc`VD4hxKi~;;gu?m-yb^m>&>qIsClJ{ zo%zN&uQc5}{Cdg%n>DYO7QcDU>vf0!IQ&Y|ABSH(s6Ps?6#a4dm7+gtUOlEiYJyV4 zc%|s(;n(v-Z#JIk>LLA6c=hhxywElK{zu`JqCW~jDPp=(^heDrMSooVTG5T?&UCHl zM&a*J;>Odw4kd1$lle-~AB9)X=w_3cuN2+9blor@&FdKArp)UY;%4K2hY&X&@pTCC z$Kjw9-H0H5f2^(}h(9iL_167S2ujg)0C7{%bpUbm@aq8LkDAwZbVJc~0C7{%bpY|l zIj`*KkHYI`bn~27ivBn!C`H%d!_Au4;lm$=*WbDu7rKrfZpyq49&WbtI(GP@@Ji7| zkbdo^nXcB!Bj(|`nDb+4VSDkz#iXALL;j^z_ScV0#J{ZN*N+!Hn#(Cfzka^>N?y7X zS>lUXLG;Q}x+VsCe;xeP{NleZUGiW5Cv9!1Cud+wtVT>PEi6JzFK^&rORRA*nTYuB zE*(3^-*@Y>5r54?B4%N_c&RS`{D00x`ku=*5;EHqync$|Ji@@01p6^dnu9R)eQLO1 zQAu>!D$EEnF<8ikJ6OP1-m!dp&ASi}hH)*;p6w)3t+ce|RKL@z;d9xP$YA$N5RoZ= zHEtx@}cN_IF{fqu8-r5(V^aZ^wERzmIT?Q)ti;H!2uID?=LlmX3QwiUN2a$y^%x8#q zNkbpRob2p$r%#>{n!Qce-aeI^ieV{?VPCpaD<)UN$?I*kY^o;2jFDG>fr)m}QqCJaWNPO0j!0G$YXNnYjq;iSrJ6zUFlIHe&5Va5A^70!&@JH6O z-!bze?zeAAf>mK4c}K4Qv_u$_TVLZP&W3LMr^3<#t`|EbAAM!+g2#iun87AdcrAad z`2Gza!JS|zS7K$4RsDbl8fea?PgPm1mF+LJNf7!OHX%N;p_o8^9MsG#WecpPb)K!C zVgGWd_8I#i^A+^$naW+wK^CIs6JKsho75pM>jXATYdeRpdb2+0L3-1Ljf0->0gL4^ z8fxn9t*ZTGXp$JPlHp_MRQO11`cIBUq~8#)tiK=KQ8>)W-Oo2N;H}msNO_RjQnVzJ z*unjw(`y73UZgP(wJIBmfl&=ot9#L>hRXIEuP%ZkrY#K@~L`Y zebb1VOl{%!$aJ$y<1^S^bKGlKCTK7e>^PCEZU}OPURN849L=G8L1~}IkLdx?#(`o0a0^3tYPtv9(k66)yu9tV}-bqUdrc%tBo!TmRzB7CH>9~yB z;Ok4{{S*N!G@fsX2aoQfizu-g2k!QBuDmSh`(PXx?x%npmn&pS4$Br=;rQT@`&xPD zXkLc(lm&izsCQ+J#IDLhujCuf0aJZ6K4Qy^BFE97^!OHp^@2AE9=m&D=+%8wB!g$_ z3sXxg=8)=dBzllDDL=rfGi)n==y>aG{f2QbTyvJb$#;;u=RBcnG^v$1M`rrmhg6%* zv{dB9BU=TV;kBY#f5EK^!;lBm*t0&^v#@#&i&oQbJ8?h04uPy%g^!^@O14VxXsEHM zyXDaEECeBqzJ1TrC&k@@Z52sk@G@%gzV^X>#OZ|uz``M1n` zvo@N8G%o+~VzHil6Fe|)KEfSxKiGhLUBoDq+`~%zqAWUiO_Gm%Y@d~qr%jQ@?tUc5 za?RL^Ki2j)XqCZq#*RT=%zAjYmOAFdp{+8gs1|>TAttxT1340^6*HEXF&O(Jlj#|z z^88l=ch-Y;=7W0(@CtKZ=^fC z-9K`*rerPBD^G|RDj|A)Nbgx<@FB;8HCnVtW72$)TKtSb}|Y&=WU zZ{xQA`LSJ+S2KTraLjfiJz~Zc8$WPlO0@;UtW?5fx*~m*G`dq3is`HaIj)_r#Y{c; zr>gX^6I;eqox6tL2B(!X6c~d|j?aWBtbWT7eyU;;I9PCNK^8$#w2m{@y|#tf`k~-w zkvw1T?C5pf6)Q$d9W*~fH4oad9$O9>3fmM(6vldkZehkU``m}8QQ!fV&WGm2xSthO zJm@BDl1-j8F9p{>eM!#p5Qmz^g@HHgBT^xCT-(ynf%j{)+{=N4U94J_uH|^>GB#3R z-%dw^vdbe~QA0QuOY#Z7>tL37N-8mG+x83p2E&smxMpZn!nMu4Z_g~*=8B1zo-x5A z+V5ehbP&y^XRnExDCn=MjwvWx>ya&<+@1W&CPV34maF;xWKq)$1wV&NA>|C}N$V&& z2dmM0{G(@1i$zerc`ILS61pd>z!Wfw7erO?oB3ysB*TpqH zP5F!WRh#CG(l*2QJJxZpo1@IZ8xFOj~)?qT7GCvjltB0@I#NbObQB$BBMl!jhS_?d7$*%K%+hAy8Y zqCxz6>|R(0^s74Snq$a+gHGu9oVWIrB_deVM^~ZeE!gg(T^Xve5bF|SPtNm}TYx_- z5j|9fGnR`xD@aQdRt2Gj8mMihvtoQj%(dZi=7yyOKs3Tsi{tS7?2aHH`ELbN_)+*b zj#;SDZpO|;k1y2eg?L5lQHxiWrI;<`l}>*-P-C7)2mdv?0`xSIzf;zf&9G4ta zqjnG(P?#_poG4PkGls}^Tf0X9#kCbtrYCqqcv)8e)93A4Yp0L^N!qu)HoIMIqj|k7 zJ%2P!kcs0*{Ib5W0Eqs*HGvLjmIy`3$Y!L|wJOdvC5RH_FO#n?EUMu@*Mwu&$r_SW zE-)X+=E{)+0V+@Qu4wH%>rqyuY#M4OO6=J$MM?Us>I}oVheX@V`$@!gLAD0y75C)U z_ehiIuVxsdtOUq+o0hcFI)j#wiz*%3@j<~`ZNQa zs))EVK_iJ-<1L%mjxFC~;jNacgUwtG&-@kIBi9go37t>yU(tUZ>b8m}BBA%`owZzn zLzt;!x)Z-{gr%ADaH4zC7fB-wwSQkgtZMUwvp>rjmKG@3xHlT&B;5J*>E+tfy4?@g zF}{t3KwxU)wO~A?HsJt{E*gSxqO4fqOHy5|gf^&eYZ{H~AdP!5nBvdSdeYaP&q<)` zsV@?l0nV5^+u5GhUKnL<+GBlaH^o_|<=BXQh;`}!g%mZh=daUR5!Mhr@gT_)9jSlp z>n+I2RV^+rA(fiwzUfv$Fb-ZIKxJu&Q@a>;gBa2kZ#e3n`wP*`OghAP`aze}T=%(j z+Y*D!`JL>lyB&Xd91rUv|Ae7dsT0STCry&Sa>bt|35K78nzFZ>8d!Lgx|^N zAPU{8c>N1VXduR&8-1;NMIc!Q1=#$VEhJ1~$z~LiX==^=h?$4L^d;JfTqp7far)5< z^dLmIz;iF2Sa%H59||ax)}&tpaKK2NV&OI!?9*x=PhoO77q zs9v`Ib?_N6!ljA`S5^6uNus#?us5hw-M8qrzM$+wvlYgea<1?|E$b4+;Ig#d7x2duGrCeK;c|sk$t>0{|KON2sU`&KlaO1!I4)1dIEdLN>dtQ4 z%jHqqiSCqHNlna2OY@Gs;{9LVmiFiXa8;=)4<8ZFE{mVXMqokFC-=T6T`WB6mck%x zHoeD_$?hd~7^OI+(|mI;oO=P&#p@2w1=S=op&AFJwQ`mwRS7PRN4<#F^%=2z!os4Po!cG zzi;%Sx_MYiykQ(1EMO655vFJdBTe8ylY{}ID>J5pbe@^kqqrW8T>EJ)&n7>2rlk&_ z<)&)A>e`#2=W|eg8#h~U@|PU(&y`>FP75%zpZp_DzKIA1wlYMq@6(rrOdrz|Se2k_ zA4a#|n99jRf^dIIsemcP_a?X#!8Q`4=fXM0)t4{##YCbJ7*p#SQJ%O#+RT`^adLU? zguq;7jm}yt%c}vw(GQCupz}_W3(h2fv3~<2sM3$-cf-LM+Z-Uvi;$_n00E6-e&P!3OPfiVy(|R2GXB+qBh}Zz=RcLxM-sn`?V`o;_${6>S$d;W zha7nVMvg%kzV7620T?iZ;>G;(3>Q?oL2*^7zn9@=!X}uLwL(kbMKq(oIN6+5b>zOX zx?i$dJo~Y~9rlv;fTNs7;n00qtKw9GJ?dQ!@c=aUBb;A=KGUwUXo?G3%MW{5$I`3h zqc19``XOu0woC~`nkeol=d2c4fq-ic`h z5nm^4=qQjCKjbs6RaN4CLm^>^1qYC~KnEy97Z|1p^*q=tG%XJ+O$lB3?;2&&60g7J1 z$ic?R-oWU6>I0gAqL(o;G}9BbaV5}rf2zR-gkyjYs|AKh_8}RdAXwN&s^FO0F|2`c0Ur-!2AgcQR6UB+r&`4NosrAm$VYCrbtVP+B zP|nU=aT?VyGI24PJlrR7^A(N^WEGk1Smt`VKlxQHAdfXUcu=NSfbHumy7f7v`STmJ z&D=g4?5s?-_1@as$>GE81({6HVRzu0C$jl(r*!LH26BSvKAFsY$hp6df0Wj}m)2h$ z9bV?wnbb74Zkk|j%B3thMps?;%AYKksi(k*S&UbBx3;A#I{%SS6D-$9(IED->t5<7ehe{;S&Q5K`L?9g)@m(eW&Jix^v> z$+KK_LGuPSaR2x)bVw(uqGPcIf4u0}@KA7J1utlI+3R?}_UUGN+hXDm#Ix>;z~W>H z>DY)N2Y!0CTI^h+mc#LQso2@sj58X+8_cI22(L67BOeiz$<`fAT0J(ejqMk|Gf*dk z&MsAmM}_uhe%v}oWo&)G#S`@9@Rw#A$)M;%Iw(3*@EoDJMBl^#>;~_qmtyLY6&bB( z%5RnBkr2aDUFTu+b$9xW?5w_71I_p@Z@Q;FX{X=9cXaxJzk}aWy8CKRoFKB$i`S?u zpr%^&4`i*3zB$KH2grYx4Omb~?lrEEWHD1+V!$TTM!3h$p(3L3WIgjD6?(0V7J} zDUlqZ%@jlu)jUqIm8LYk(#l=nBO)pi_$O*8v8w*%bAUJQH`=QvdvcWsj1IMJ%>Gt_ zS|T^3G3AQ%5ub7zjMu|*df0!|6j#u6%Y zkt&J8B&)$iWRMb31l55J#V!lXx-%q12|bizif)c3OHI5jtMM0p*50h&r{Abo8wx^uj0vlMDNCZexMMg1kxUdQ!7m7Su;KT; z-_x;>Jp)T48XVQsXnK4tFU%te0g7<;sQPr@)nYBE$S@O)_q|JK)3Vi@o8#_)c+|k2sSCU zP_tM8)4d)`$bl~Tc)d)lNf0>KmKLmL`8xUlS!e;Y=x8QQ*v|eL6Up}Zwy*ymIsDBRDOqi1A}9wYKU`mE8%m6*=+woY;C9h* zQaz7H25e^gw

    h1EIu|$2H+G*V-sHIx?~Geuc0tlv%S|XCl3S3UwFZy z*abmIcrDdIrJ91Z7}V;>qYz;EImv#d&}Libd57{jA>=5>07DNTgawXlc$Egv!KG_{ zK4Pr)%{Cx1g(0W@b8eC{6MemT{ZE7yPB7hKQD6S=sm)`EYi{krA>;Yv$59v%O$~MM zWL`XMNm@BtFnR9AJDV{q3l8+Mkcc}9KdwkHWf5e)%H;AL69i%!t!E2|2Us=?gD$64 zpKC|YMUS)bcVbr*s(gn2l;$?-yBHy*e=7y;T`=l0uj=j_Y|-~CrtyVaeL+KCkmFY+ zm9>=&Ii4|Z7d!cjB!+jX6rl7gQaSE@OzuxTIN0cX@c@RWT8Mb$o#D@rij}GSzpTnY zO!SA4e=yj9zCKFle=mT~PgS{ZE3NLh<2j&jfUqkk5#$^FHS!2&+MV@Q7zjrCsWI?2 z?HFUY;tqpc4dg4jTsdhJnX=;E53^W2&VWZ;jPbVW?ZqQ8hOjc-dy31yS0PI>XCZH1 z3wJq>`vI9;ZX);2}zCv_vqBQ&u65*gX?*8x-rW|~s3(iMZ%>{anws>zZ{-$T2Zy}#)T5+AFR}W3@Q+5Eslpku z)!>~9SK>X1Ldl`IbSS<+NVAMTHFbeVCp2B#vr4@Z1`F!J$ik~pw5D3zCa5=4j_ z0uSf^tUMU@J&1)-Vc02~?40jvhR4HA?1w8gf8l_wAs^k9K^T0pO772S7_K2e<(^bN z4ch-&g7r1Xo%^JuI7!ddM>{$pAjTU?a-K!?g8amjhUzov=y!czn;t%O&i>}bJ zq$8$axMg_f!pQLtWj6dzN>flyX)SiY_^mBdlMaoUb4P-Urt_hm9Uw%H+I11CdWT3L zgjb)=8huL+ntG1XM$K7(&cN9RjpbnIVlt ztbixKc?4fP zaCkdu5N*qiy`d%`fA_tJfeRj!GlDOK0Wwd?dX!4*Iqz*7par=SD4cVTzF4~yGJCvv z@~M}g^0Fo7_r<05pZsW5V_)riy4y3tj}lD^reJCT9_Ao~XgE#x;u1%{1zjjnrZVeyMHc>biJQ_AQi(b*cN7}9##|LMCp#N|Kl`q&YK#hrIF!E7#0lWnWVLB+!Hvc5wrPovpqdziNUgTnn^@d}u4t^UhO{@JBFlFpecVlel(8F^Vmz5-cR9D-r;=RHNF4f9pdG6v%0C+hv-VuK zdBw35Cg%YO1j6r4cgs>$&hM9-WQ z?-crx(&vftj2S>72QruFB*V`sZAwC&?ggVmC{Zk(;~oTMJm?+dEWr(LZMt z#p=I*esZkBqD}8&B2E#|V#bT^%ENX2=9{i%!&UL^h{-*I_6upjxPSF3PJj_^v zgyV8DrB1X$nMl8oLbiW%fEcA&EhnV|Y5SGapgE=DbOD8*u6;MQqHA7<6e^;GfLh*W zIQH|&NJ=xN3gYk!uWM%cTU}IXtVL589+a8~SRegRx4UxHOqrg%&y_>Ck1pQr`Q?u=IQ#}3UDlQx*gm^l`DkUDpliP(##IsG9cak;@1A>3^E~cW)e&q8R11J`srp_xA}J3T)pb&H9D?J>khXi%CZB0>>*<;7v+UYH2!o#gIq2t({uj-U zGGaslAzMZtN&s>aTyxl9Ng!4`+lz7`H`87cj?-VCDLRn(r7G@*Ess(fyPaA`L@RsH zor)GUG_((u8iT!r6ZbbsNo6Pan}lL=IDqasuJ%AfXH&4OsKi&QB;W3{&fjLyO)%S1 z912Dgfm5l_5vWBaIm3B&{%o~`vTG=$YEA*p0SuYu*Wlhn%OgajQ|y*XAEM@aR?Vf` zy4WaWd*`Te14kMnj$i;pHV=hv;$w)_E_pP4c;pzH&4UuXdg&CBiSVOCOZJrJkGn*j z-6Ky3O~YjH!i4gHg3l4p5Zy#9DA@E}7n~BqnW%rj@K$CvbTgALzUsJaskPcq=^BI0 z4PTgichy!d3Y-pf?TtF|h3aIY-7BlXZn^WC)|uD&BiVZXB|zFotEF9O;bv992QP}3 zQvw9Cqv||Qd3<1{^H&vlX$ESd;sR7K)?55{(+xmYDgUmruU8#!Ogwpxw%E?i!NIgD z<^`mkTKBJZ4G9xrFUs_I@)&E3g+9N zL22R;AZ4~kMG&$uuf$wucUGvki)S$HL_Jztu=IA>IZ%<`QKp!HQKNZ_g---LhV)Zf& z9}Ma-4rA)@{ssM#X3Uw@cTV-~EcJ)1htggTxy57rLB=SY&2LZi-l-`n4LpQ^R~4~W z;`+}qhEJ5AC1+}zPtxddxCIWw?C*6$-G^!YrXSUmw;cb7^vP}kem)?-61EQ3dEgW`~BUNM$_|Ea4`JI zzzjcRj8cc*o?)J5pRZ~5!wYqHd@jFiHE)KBi#f=`;@3Os&+!ZIozugyWTdpwni4Z` zUdF231EDbg9=7&|#Nl@B`zMFbPJ}tD%7!T+O~}xmGVDP81>>h;!jnrNaLORROPAyX z)Rea&7-7GDN&Rkn`?fdX^NE_|Ciwq^(f;Ks|9`+}AK=vg2BUq@n*K)^4T!0|)1Uqu zjK=gYi}=6A`wsyMieAx4-|+*;6Sc9odZ$#`TYUg~j6euYNko+nc&@UMte%w-0R%GP5!gvT<;9ptChJru@&scOX#K$x0u12=l+T64u5x!e&6475fLfT7dwV zyq=@I84v+vq+|Hc4*|pfb@)Fm0OE#%A6OzQD;*;vI|Bgdj)0k&k&c;#o#ov%0V@Lo z9Sb81+lRo;$U(=z#{8iHn*J9$`OYKzzhZ^-5>~*91PT866#CDn1ds^^L^~~Q>=kYG z42(WHD&)Wjtni&@_}+DT5m!esMMvN%)E`Q*59K?T4Y-?P4)2)fKX52;<$v+l80p?! zyfgC@{#SY$6fpd|%{$`^=s?2ieceA70?>h+p5yzDd<2qXWF`PM;h%MKOaP$p&dLKC z$pOCs9`HdAe;0r(UI4>8_wz#o9RHIzy&RA#2jukqM*(Ef0T}*++sXk6%772j_qz#@ z$_ilkPdai;>_Fi^*QFeg1`YTicfT(KDn2;fA0at_!ar9fFbvQhnCd_AnOK3szX<>d z!T`p969DG_!S(wH`R?qaIq&(uoBSIeH~@T5vOksq!+cP&-vwZBzy}5UBLQG$A73Ew zE&wb0U|heCfoL!A)qwvb^KSlccwmqZUiF8ocg4Tqfq*jr*xY~82fp$H_~1{!F9R}+ z0Ux~S4;x_0AAIR|f%#qdw|*c@4J0)F>i`(%gBShb066|PK9B+p_@F_*D}Z$XfIj{c z6WFDX7pOkM0E=P%xBtKpfDfAUhX&{XnCm|_@8f^t1K)@Oe7qI)z6$6F@WEpK5P;)< z;{*2*@IhMs@CD5BgRJ~60Q(5|c-84c0JetZ-^=m+%KZ-;67WGz2Cn#@j%A<7QcEyw zwhP)iQ_)OUcW*jvr>C8atc(*)wj8mKMRaF)%hip=qYiEm8Qtl=y!d(6Lo?S+Uo@vb6vhxIhZpg_p*omiVqFIN{$F$4LTE}aN zRmXG5afffqYlms0)+S)wG4lnJmb$mE2^Zn@)UGHyC%^r5Mp`Ep_39s4i zEF*6ty058X2Y=A*T=q}ztksaSWtVj^+78*<+1g$8CXa7hw+*~adLu%2_ygu}#Ib2}xw zH#9w})bjX?D5NWQU69ly^CV`9g_P*if0t`Y!HSva!xFVTmh2Nq7H|{8JK%4a@8O~Q zJ)cLH@D*hBWi}Zu)ttKBjEm-Folmd#tpg_{ua82*n-S)Y{Vi=FuQ}vPFVmrsK_QgH z&?W(Qo%J-c^YYfu)MO~+U?;;UFAq&L>F=o{#^*9~@N>1;WXXnncqyOv=vm1sW&w9Y zZYL^@Ge*o0#h5Ag0GGMh$UaZQ^r5*x0x*o2gGG~nv(S3= zp*b6lC|R*o%r3(ZRh?N`gaZ36>KUBfXD~>&W>o$F4(x={SN62T+>UP1d1L`M3z_?O!D{MzcG1yEUgc>k3?-G- zYrt*X8TJ*N%1^0jH@#ZnS2QjBAE*RWVZV=3i1|=l0cMnRVhb8 zQ%Qwr@i|`~(TujdEeI7T8AwW&MxiZcE_20rdr+C%$lI10%!*@rR?K)-#&IpKpdf37 z=pQnQTXnX!e>5~N@@0a7jylwv-q#CTnK%0pf6g&6z>s=(By&z7R70KsoIf?jX)n$( z72-ykU4PH@MWnrRHL(zEcEswdvxnoV8t_@QsfK`nLb$}p5H6VN7>%ZW0haV`Gj#>v{w>X5B2z#dSWjp6voUdYtf1mp&7B>+xI%OXA<@8rF0GUBkvgPE22wn$RVp-MYrZ5h zH9-`LA2{Akc(d3K1?#VHMpmjEYhI2*3A&$4V?c!}0*bK3aLTtO3S~JH8z(k?{_%1G*UN4OlMezjJWuqcbpIlaa95yjL_DSr4{sveV0G770I$(*BAI0L z;7f4;oaEOF&0udcjW5N~nMhUYC4AmCJimlu9K8GNi64vJ+7N}&w0L6~I}}njh$XvV zd5KPD1a!U$ypsc`%CeAS}4ZaCLB|x zbIB%Bl$?LG`M&l01X=0WfjD&YxNYNr8>Un(9Fg9yDEK9dDm}aI{DjRS(<(3@L9O(_ zr?KSpl3-jGwy@jS>gpVn^=O)9%Iaj|9$iCc_L`8r+{I#2)cSSvhNrBNe&j{|p21>0&1|8YFD6b1$is z_Q;z$dm{sfehH-&Q&PV_=+#UIVAic~5^K~^wKn?GZLBkSGrM97 z(M?oVSCikR!Ic%^7jt(1mU0Z&yCK;#5GZIe|HqK@Q>`xF^`x7Lk&a8Z`~o3og&tjW zwWbO7%W{q1bhV7IwB%?fhi8tQ9EREqwffKlU-H*xTdGgeRd>mXbla>l4yi@3Q2zG0 z^HPF4Wg?Y(7%XW|W$Q_{5-ETgx`(w^*Jl@SeV@-%=nUV5=>L4fpjV7fwn~Alf$NhF zLVdCE8`lbkXiI(NMr7Tb zQD(C+UsuXN5|iDnneQlyfWs@r0FTM%Bbo?|u0s zswsVWloBx`2({;YAwdhiei1)rb31{DWk#k=jXVOi3vu6S_3^imu#OLsfg*LFE!9fU z#n@)+$AYNv3%$ZNQAV?mmS69IT;){dLY<3GM{FnxFqpU3=HGl0OA0IvmQpXNY!BxjHOv4sVbvtfq{+Pl*z{Puw!GUuCGI>X@Nbt zj#Wm<6RCr7b%8Aoq)YLzVb8;^w$fIS7+{0rjVvo)3~&fD6&22?s}9I!*Jkk}ElOAQ zdv)bFmzc(krT4`3y)d@%$h3=2Q*4EgoCOQ?Or=$Yj7D0M=`w12@vbJFxY$AmLFLHSAB?iYsl|*8#|jYC>}gAhLkGKXGJV1Z1FyM`l+o&Ve#~V>vnTL&O%q2`;J#Q zqrOun1Xt9+Y&hCVN08_vP-K~(V4%w7#l;aa=+*s(#w`WB zJ5BE60F&^bb4%u2e>U5Mo9yhjM*{a?x~0)#GcYYgt~hAiSF1y`PYAx>U6*1ZgZX3l z!+`l-ZJzLXoK1!|g*SzJENX$rUM&vL8ErL*{@`*yUDTroBnxxaNTA2(^ zivB#-Es_*lzgiOAL8z-;n@V3$>2UpgBi3=Devwgj5%FZ1Bc+&OSE0=H3DT58Coxsv zH>*&06Y(-$3;l#dVom~;KLN$VWiaVqaED`aDG5u9%V{|!IP%$gp65cvz8g)0W`PxF zGSV*;2Lj4xi*O*Ey7MB#}Yu!ic1L z>RCQ25pOE#FB6_)>FwM#9Ojl1%TzXdnCBvD_AA%N`4nanMwZzWB%Mx(W%o}7G3g3PvsDN%iDndFUqAYHEO#lP_47G`TZ$zv|5wXz zU5HMHfBGldVPQvSIJB#lA9lZbuVjwwPX-JPY&qzdQrDtuvR!7IUn}!r(RXN#90U_( z{V93i{fvJbXaVarO+Yc7ZA_FKr3|Fq_aZ5d-cXlUo(h6%nj$k&IR$yXTN+r2FtHU8 z;Ef_R#!ex!9w~5N!M`)O(81_s!cdAQk$vY^ce@yk+vgse7HC3^4vRM_%>o~;H+1BL zM2r27Ply8JM64`{?aerj6JnYnknM?t0tO8+mVOkyyzG{2O6&tt88^l$+S%WPq!ddf zQ{!7hXKB9^$fQ8JN~RD6vI-OLMf!t4IbHYj%v>5q?yEVn)V!1vwP3dI zCrN)W#~5y@Uw#y~y`f8HA=@$5N`DP@gGxKh-Fz;Y@1}cyOt@_xct26&ATy?POhr?u zTi3>XJ-y%TR%>w=pztbkC!kYEJxzd_EaV8DedF)ke9?za0VEF9;;g+*-p5J`Ls^$) zBG4$VlR2M;)LwNqi;Y^5o_^Deej!74ur#fTSXbP|@0ASbwH%1Ipg-$07;P-^(;Q2p zNJ)Izt=lYFe2h@iLH0ZN{1|fRPEMX~pweul0QKbkq_&<9kL(ryN_wpTX#@~e6SypHNrNI;Hcj=%z_p{Bqa_;xU3SnAV>4QSr^|k7Ps;c@z z0iJoAH54i76Sv0F4!NzpHf09?7j~@2F0|otGec&zd-(dGoI+G5YW2&{nnucNua9pQrnAHj@P^yuE8n1C8Dwd$T3n!GqF2mhlpDQn5|TOEnoOMIix0?Js4mRlyMJ4Y z9nq-R3_!}I4%CP4Bft9JG^#vE@M3bh@HyD+aEeYA;OZIW%$K;qg+gJkX=$!3WnU!p zyNHcI<)@Pe@hzjeFyVQ-5bb6CNf>sWZaoZB50t-DLOPn=V@a~)4xr-HPOdn1t&qPi zJ-6Caiq*R(YSSELzD9s$IUUeiw)sEWJFb#w*G;k!)nmJ^G>|j|+IPK9&9F~Qo8GnN< zo5ZM%KTS50D#MnCdbKxa9keJ&4{;NW&4ez?5Ri2m(@#4c6pv`#t6&R`X+`ww(r+WJ z&~HmK6>$u>+A7UGEo4h4)8DLN#HVSxnkGmZ3{)0oPpJ&E?#}`t4^LQ~7MBl98aobi zDGmXjNv%mgKCDBXfkh%gc{`OCIQQAs>Igqh22LB-kTAO=E_%8 z#8FCB!f^~}VI}H*Ot7bx`?EjxbB}SZ5~ipOmmccegpoxV_R%g))L~FPu_WRpWRfO( zpLtcrNU|ZjE7DN*(1BzfHa(lbPT;df>;??=h;@*qgmb{GR9ZS)`tKhGzG6<>V@ih2 zfy#!!q(`hl=&$4#?DVl0`}l9aKBu3f)ux{t*P*UNNof?C95+63o6fuE6KKb6AbpSD z&}<-S7dSr1?Zs+5DG~z{xjFD^4nI$>2?v@ik+vh!2B}amufP_kg_?k^OvFlCF_%W# z3db!Fd|@)rpn8iXyz_Os{*g;4Yvn*G)~~-$OC7hri|oJ4>o)(Gy-{HYa;OuL`XJY3JNP-MM4>yuoY83q#4dD@Go0qm>qHHI^>CIH6$9CV1OpA@vRqeSHNM3Bl#)&zU+iJWuw^ z8Mzd*H#T zx!=ri*)`E#I33`j91=Qp4<_@-X|Cw~GiHec0*nSVfW0@#0xyy8UC&C(g{WM}( zV&Jw2)9hUPb6b5p}4kr1{OEd9{;{yK<%3|1&F zi*0!^B4Dgq);qY<30GA7q0rJG(GYl0k&~@4Bcyq>gkKEDs6ve(sZ3q8|!S)IdlE+YQ_(*N@9Y~bg-$Un}E>}wnXSNk%Nk-HUfI5ttU{!KH*I*wu&wyXq|0=&!qf) zHSh^KzOQtuQ)GjQh2|FxWQ0JSS!A8a_PN)?n(jD*MLt~d9%q;;RJ=@qbJy;oDr29> zb|#2^MFdlv|4Zb%A64+l)+jU*W_mmX>|oI$1z-ngfTh*KWI9zR==KGeRmAo?^#3~@ zM@!W?r~}#$saVbPGg`pDh;a*tddLnP@cW8{J9TlDI28^Uj2hSt%ZC=|OpYc<<%=Ni zijbZdj4$h5rO8ru4i%OLhyV{^OAIXB2zmR3ej?k+0@e3!(^^P>ZUP%A671{szMWip zV}1~jwp|Ib9w2&aD;a0$~t6M12{ znv9m*KgWPmoRA4J3EgEn=A$;pOL>l_icnQN(#|r$iRrTuPmu{=1CTStweSgA31E{& z#VBOVvQ8A0Y?!-xbrwv8^NGEN(Z`&Lq6x(RNrqB-km*bgOD1@qVTFZ5!L*J+&CdZ< zvRo$EHT66lhLZJZ>^B|?d7y2-zs0*#LJ4F>l7et4RPC-Kl|<?icYG8KHARv-xxe8O(ptfBB8$*%iYK;$orph;*GnOlwC@>uN zB4ZX~8zVgD`LA`-YcwRz;>lQjXGD^0R^ZC3+>*s5?W*c~$+;gBU{()suR2e(eY?=X zJ_pS(@Ym3QMEkiAXv_-Ry|l~rrxF-?i+h2~yOhg`wYlec8HwKrj|WYMKJI_%8BRyu z=Du_F(n@NZ&tMUAl~=Q<^QndeFWbPmd#K@?jd$Didl#SxKZ+V$V+*~quTnk=6IWmM zPw|cV?ulVT<|=qR?5RgK{5|xKYoaH5jS@@mr&dz}yMVd>J7mm^s3|;&ybHc-yb(rU zWpOu8IvN8b&n^M6Ro<{w^RwX0z`cbA8v(8RE!Z`hoV)=&nBMAGqXhAK3uoC*V;1JX z25GmuM`XLx11UWyI}oMY5BP#1`;QAYS2Rk1~QcHtsx3LXy`OTM#gm z-hE=MV=;%eJgkHRHoEPJIejN^H5^|QUW3OF63ZeUuKd=0QMw7W%F2&hCm28iYrNFE zTiPZfSe{-e8psKs*yp>i?0Z#4W*;%)j}q5;2%Y{gL1CT-qPV*rg2sEy;Dy6|zTPt3 zZ=uEO`eE!tP51|!7VQU{QTKc3ld(1BflP%#WQB3FmL&l;zL*$7wW&6F0isXzWD9w( zpL>|=Qq5heI}T6le2FcK*OL3CT+ z>*zu@ElO%*Xoi|)h5>)m;6cuGQcZ$Q!iv7ji{#=s6u-VQua`Z7ye-vN@pwKsIlN#6 z(-Gx(Ev$Rqx#07e^S&tFj!n(FIMM?K6{%;TsgMkDFw3%eLX+XJ;~>dY6499EPtgH(YGDlIiJvJ2T=cr*$Y)JL-kg0i z`?a`*wLf{&@eS-Y-((-6!!hx+Rdc_KElM5wA%tRGFh&T7qiyK!kWeS zmiSBU;bHV&_4JG!9`kIOi3##xUL$V4ZV8a*%L$Wi$d?&`t^30rYB(0GN&I4{j#G!z z3Uh08xydbTpVaQrM+tWY1M-e}mjlwAipk=1^`9&?T1m0+?}4cBn=&W>+74me_P%tU|ZO^J!3ODA#z|+;!Y$pwEGZ)%uvCOrN_Rd&>nzr z(z&HJ3v}Vx&mKXw9wj8>+mGS1!aQsZF?M@A-QYi#RJFQ2u&7F~Y_-i`qk(fE$Wr(; z9O1?WPlefXmMwe7W&KRtLoQO{m-zYhNvmMMW3SKEga!cnFt&I1XoBC&$6McKiUY57 zZ5^8E;#n;f)kme)jm{3op6H)z{e!@JwkZjzOIok_^wzh_^Uv;sJdj?)=QCe15jFlG z|65+w`kr5*qd#Yk|7vJ>g|fS+szBklh?UWvY617t1%VEGvPjLuv+iB%AfApVQaU?r zs)fVt>&Q{em;R1T-H9A-pPSu-1cS#dOHy9*$E}9)&QtADu8=maGIf!5-6uP>*eTe$ zKGOCUL(Ez2jYRlFosr9wyv=lFk<)c1?vu$b=#ZK;Rdnywx83o;<9a7&<5!;l-9Q)oAH?>aiaaBZ{MtXsXV*#zX+1Z<+|P+ktglPc z_x(YCIF0l1dMl?~ex=99bwmqd4m+@Wxl5ZQbpCxre^b}R(OxlPUQ?wkRHDo&;wBYj zaNWDIEl!XhmH+7bog$adZn*5&%Scu)tYzlH4103k{;owmP>@Bse!5I@BIvt%Zj^>aT8 z&&hoUsT}&|Z#<5!Z~LTZf9+l(=+vDR;ps{k*QkcN{*b_1p5FL5Gp}Dqz{xoa@bVU~ zk!Wr}-8dy+LS&yBFL5mGv;1!EhCD+aLbSo#^SXIF(0Z^vdkFq~P$u{2A$JrIGuEgb z9Wl0wt^K?(B8(BnsYGnYQD^rDQQEK8J zC>rx%bUNhAW$jhTOh$iB>-ks|h#MzrOy#1QNzgW&Uq;kkdj>HrQh!1Eq(cWG92mY^ z4bjUBL$=ly&Hi*pMiqg^yhOWUpsXKb|au&B4Leb~ex4Z0g8XBc8YKtQ^Y?(UFoQ0eYY3F%g(JEWykl$P!k6s-9J(W(FKZQ-SyAbp%FUl(j6$; zBp%r0JoV^w;42&gU&q>f6hA0#R;5o@FCC}zCC)hoYe9v~+R7l9!75kz$xO03aZEh5 z5>+Sb4Rt3Y=PxfpbkJ#Oh#y^VL$GlVb|Rpy`J6hM&=Y&B92|kf=&S(yTsZ!S{YKV% z?VRjIG~qEsa_U;ri9R+Z8VsBEFu7|RHSS|u0l{CM5fat2No|R{`4&HeWz2IxztfNp zSEb}J)iHvYs>oD{d29NHi?hAL$CVE5!s4TQdy8H9__OsP%{+(#Q+EpFwk&U;yM=8~ zSz!r#EvP~~3ntloq8YY#lpQ}egdZJ-AMH(!%#0jqV0y4se~{7|JtDq0WhojF|8aBd z%l<;nUV~H0(xiLVxZV9mr-oh=pjsGf$s2DiKTeDSIMg`%nc}G1tm1Oho}6|W66m3c zM0*`jW_W`m8(ZBQ?t2<;V=M|Us+TYBAUY7f#HCTONky!%t|i7-oUYV>*%Z13rk#fS zB&xMhVX(AXkwkRVVZ+!ib{O`$_N9H<#siU;E*QB5=JY;AI`-7ID_mxY0Sz6Ab4Ov` zZm^KM8GI?q5KV&Yx)1kI;F&K`!^~|*ui$-Nz$w}7H$&ms+lefQ{$NtE)UYt3nDga5 zd1EGvJ9Xt`0MwxpUp;I2*)i)pg|tnP*@>)f;c=r)@RLpA-7rYV?u<{zd@=mp)cIjqC zQ@MT7LQU1RRfECYRuEBL1eD%k-Z%^A6zQXo6@cG z953pB+b=8v$MXKxbWb(uih)&2ylqXD!}hv+<6-rUb~D=bhj}`IYjf!Agbfmd>ocoL zjcE6aHF4=PS~Tb7y{|BJ7C&?Od|$+dV1L{ftHK*3X1fu1$fhiD`1Bm|@0srAG4oVH z*W3W0)}9e-zmjUL4a}?oRxP`QxsI_Z9@!&ROI-~-Ayp#{O#@vc;0K(hnyTi(eNZ! z-`f1_jdYET9vzca$sREQL}4fmE%^8kloldKLqiID0k0D>*7(Uw0P5eFIO1QL$@0{E zoSYo0W||s!j3=_B;)?%y(J{~PSQq*PgcJVpU$j}E=j@__gtYAJ?08zL24ZBb4c>K=X8OSAIc5BE=$e~}YMOEy8$K~MI@V@j{5g|z zsk;XL`GvcW*!PX=>FJ^Z+7nP#FQqz6DRVzSi09cC`@EdDo4K=9!2e}BJLt&T*mOq3 z(Mi+sSzEZ`b#7B?T1>)7RjMn5CE=02fo(LX&jUwW+ZuVbB4BHHmo>H2iD=tgRfu-L zg`gnx84j8tyT~E5W;io^wC0L710M~y5+t7~B`tbxaGk>cuiwsuR{csr zi@9OJHhv32i|zLgeMsBTF7=$V9v#zn|6y^bY~$Z=ai>)3U$VGfb_6cb3zr}6R6&kb zT$mn4=La<=Zn=swY7%eSw^Mx%x^7w)p(X1*ie#kN| z5->3E1~uN|mi7QODypf=`+)ptN;!N$%eOH{)O<`_x{!gt!v_aZ)O`qja*))0%IX`7 z(A2S1&0W#dM~Uf+8qg-MCz02qO;Y9OQ#PXUpef=5Z|>=92x?@k{d5!5So~j`C~w)d z8eMxr=pw>7E4lw4BX!FDK96Wk{dM?Gvjl+M;cL3U z$^RbbXsGHMnV&t8&;>RZ?UQG~g7r1E0x%33VE+Ier%;^z3#32DJT}*Sa`yZtwd~)Y zo@IEP<#iknF!1MVk_RK8v`bF~DBLsR(Lrdb80f*Yf6K;TJduDtPNTSaT1LhCBDutM z2{MUyh`f~i!jxq9gxbW&TCUtg!$6BdM?)ifiU($fO0$2U9T2S{#!aI}x^TH3(fAzj zj=AvPgLkSpb1qB$|0H;fU@9mGpz=dNU@9P4;8;E9KdCH?C#u-L1|IJjcx{MJ&H?W@ zdEg)5{k7E@07)o-#Pace@<{V|X9G65lRf?amgNE90XYqHcyvI@5IsGF@jLMT+Kd0U zE$`a{-`SRaqCozG{D}XH;DJGmR6q_9BOZ`XMFoM-eTUsyO4I***8arsjtAu*hIhI- z{V7Wxn4WxfEs&80r3Ev52j15$@HZ@Z-yX96GQ2-*zkmRVd-On28$5aj2o*ge z^gGKt5!nB=CGRKu#kY>e8F(kk{eRG`1wny)NE)DE5Iqeo6_^3?o#mYrE&4U^ell&p z^|t;3?@!w=0E2@-fJ9t+dN36refRfSds2nr*RcDE;hpCJo|K3BqYUqO$pZ><0D5{< zj6ho9ci{cD{o*`l=A>ZO9|RsPErg1O7C4)pzh9h``ua7?`|q>%ufj~nL7Bg1?H{&Z zfEa*8Z!mB~rUx@n(E!QTf497o@+H3p-hZFAe-*I$7QBzfar0s>yx> z9`sD$=}(!qARwYbOAkZ^=zyRel#b!=TP^fdqUu+``|tb3iS*NV=M;eG0ECwRsB_A3 zI113@IzH{u0p%wDc20qw%6R<>ct5ecbKDE)nNHZBWO;z<72w#OcX0+iRXY0>@P1-> z=eQTpGbyz{20Y+w$3O?1ug>+&pr>MRzXIM*EbpBA3+S2J+#drT0|ONZxNSV&y?~zT z<^2kHKe4=X+zaTLBHy0_9>5U*1E-Uy-rZW4dfCoOl z=LP}y6z5X&pr<;yzXINWU-M4XaQ^|`pB9p$1wvBv=SM=Jr&7Yd0lM@2i!-g_KgI57 z!2ll*0>~KC(=t*)0oCU3R=i)ozW9mVo#$Vi$vOWi;6aX8JP;iafv2ShP^9?|yi-By zU$MNOta#`77iWsse+qaY;FJeM1%NBta|2SRn%%zw-cKy=JpbZM6#P#C4-5rU0p}DT zj(qO4J(V^874UvydFS~TXTs@!40ynr2L-0fxhxgvsq*`;VD}TlJI}p1la~Keusin6 zAYdT)O$U^FV5Eco{q_fXDvtjv;Qe>QJJHtv{+x2AzW=9y2Vw;HQ4Gf+mGdY*(9`+> zzXINWx4e^D1mA;qR-oWd0S^LVprWS(a{SKs%}#49{0ewKvAlEmQ2C0!2)27rKD`g7^D(Ep^)|1YQO zova7nA5;Kt<)1|sV59|t$iR)&x%n5+(>(v*V0q{H7eH|0j{=VtxW1reJPzfZzvlg} zc+|;adTe=6z`D;AFTP4={KFoPaR$gM!gxTkHv92}HaZq_pnjxjsjIFj&ckv3BKhrr zyM_qy-c?0wIx6(Nk`L1re!byc4Uq&1toWs#E%L`jntg&d)M6d1VzIPSBi~bU5x9Jc zu<)UhdgSgQJpO_+mFdxyNDI$|Brc?@N(4nm%)w>q5|uQxRW@-)pY1E^E=c-|`>At5 zR9ZU9n#Uq6ZOsKo4lpFsxbG_5t21M|?RhaiJ+yO6e~a?2uB={2e*b5B`%KG7BvHtH zD~-#n6gCe&P6km=#Xg|ZCc?av4jIB{DCTSyUZ-5|H}GiUj6sRJDDnDnFfCTN2?6t4 zN-jcjbymCu%i&keD=92X=#P8zKD=ds!VVX&A3hwxQR(saGHknyGkV!_K+<4~uDauv z%9?1yHp^Tm&(Ky&E0*4N-Mua}{e98<4!M`jmF5>KZ7Z znI=Z+#az@nn8G;pc8;@`gw3ml`Wal@&%MCFcIh+jr4iiAo_Z>2$bqc}48`jc1hbdS zXJT{*+JvWGYbmlNTCD20_G@Db!OOK2Kt4?C=B&EN-<=~7l)c(9q&#Bnf78x7Kx7-W zgs6P^LsnbLW5pQasKNf!SD)rd7y?$b+u~SFS#o#K-)J+cOh1iW!Mw?6+EO&}05#pS zcW`noSff!|f)qD+BjCX-@-@F>O65ms7IJ#A2y4DFrRwGRi4 zlth|i4!xrm6i3n8hJo5>u2(PKpeVw&Hs@&W za1}H#jL*uqZs*R4eYW4`6CxfcD7DtQw{K6c0Iz>kn5oiTkhwbL8$k6y|HZN-VupjB z_wY?2mX}4DhI*(U{4y?2W7oxmdctOnXl~uxR#A@{YvGgD^8WatmfGzoMM)KQ00P-V z6e=$9(Y^8E)+qfG_mHDH<-*JGWB<&3KiQ?v=HJ(}_G59F|A@c<6VOckSR@75&;fBC z)hB1_D-imdz=ZtzGfFT$ApHWQ$ZMP7L4XIqJDh4PPy%E^N)W*J1#aj8hRt!}!|_i~ zYHpq*K*MJaNYSXX8)*Z&L4eW=puJ!yb^Jg`)%rw(1`h;g1k_q&PCo=aE#24m15WFj zU_9u5^c8@f9{1|2V$Ja*dEl7BfX4vb)PsThisQ%Uegh>EX^&ZG!0i?t@c8%}0&qr; zvxdL`R>vf(bGU)%orS&n}W+zkL%?f{zs_N-x&{Hs6b`7HlU=;7N% zQ8A!KuZ{-k(aOFT%S(5>RBd&#dlzwo!k7*(aA9Dwm*3Xk`&gBm9CFw89ebfIZDDuQ zmkRB8UMK#%%eQ^wVpVQr%DjUQ*0!)Fo;BRBkZkWDxgR^ODt~(>uIZs+rpKlb)b`OA|kjO_zv_us(L8&XK<| z%^k`3;Qr9ZyhrNzZlq~Nx~1FZ^LGaiF_BXsP9#H;MDD#?dX8&bKC_7RNZukWY)7T) zP3PG1nM(rfZ2tl5yrcH1l*B1<{+A_(PB$bTQ&k(FcyjncbYy~(OwC~&cc2)R=w!SU9`?t2vX4JR+`gTJ7LR&xV*O}RV+t#;M z`wMOTuwUoc#);O#Z?KIMRfX@y>qMI1U$pfj3>nVCf!|8#(k^)GGXhi#o>8)xP2Pc$2UVU79`h9}9A-}UPx=kQ;Q*N^&jl3nuV;__igo?iP34{B)w*Hn(`U|%4qkjFB zXZek7{4IU(7ux!f9iH%mzwg&?S~q|Q%U2=2Z~OHx*Nq=y_|H8B3MdEuN67CNF#KU# z=d2rlO9S|Ywth5TC+x=W#_Mmy?_X%^NB#PX6aCG2oiOT-+ds|${)M)F*spVJ$Et#^L$}41d(GzvxZhjMoVr=r{E1g!ps(zTdX>FV~G9 zVR*un`M#~+v~HXbOTKUGH?12dJdE$!`s@Dfe|dhL&=$UL>tDvcel%VuxBTC?^_y(t z9Z0BOA^;o+}hdBDX41C;Uj zc1QQ06pL?f8TuTwRTLUZw%ed1b{|5ex|j7*LZ>8G8p8VL`-&)9!winU;CG(;GGoKJ zAeeAGMY_Z%xN2*dCwPMd#K)_~as6V@g=f(md@&d9NeFzP)wa}#bouPSR*AcFlkM{Z zTJ4S@+LiJRVJOdYQ4WtlEIjZ%rAkMQ;9f#)g4r7?BkSI8uKJJKPN;L}fbjL|T7)wD zj~0|!NH`!pH@Z@DX{z$zBbzW^ww)3du?$;*+2h@YMds^sqWIXOGzE^El$Qf&$OoEcJfAfqF}UM&s4%A7WE`94>#vJdpAe%Trc~Yc zMYvPQo`CM7;Kn0j0Rd@FpiNt4yPe&@wQJOA4Ora*C_!8rAasH{jVoKq&roD9w<=Q-g^b2B7Wgmnv?}mZJq}TcGlP~qSMZc7i&Egs;qrDcnICQz zzt(IqW&3I){H^bl_a;0lR*C26BO{VG)wo84Z-SZMhL58v6I(e@?FbVekxvg0RiF&u(XBBv< z73XH#6_-P*Xw$|9K4$QOqF+!O)3xBG>YM_GNJ0veJ9>>RPE~D%7gzT7}F3JE2akv2tn|mCp9?EUOE<8d93`tU5W%Vw=4OWu&cRnOL7;O5*MB z7_Q-|^3!zMT(Ch5GJav~vxI9|13n=!$IOY%Wdj!M`s=n9nEFNqkJnDlK#(9s8M z=I4WJduD#bxuFr|Eqv=}Hdr|8ET%UDXFl(WOg-={PYo(b4HbWI=&*j-RPJ7bpCfMN z7U83`_<;DJ_`vvJ?EqWhy#tVVXE5qp>gLv7xGmUq1lG=rMEyl-b3rc}yipJkHai!h zN0_y@v*MO>I{dba`om^kHb&;V?W6ZB=;>!<-Y56E3A=7aI3zpX_Ow&;jchx&vr=kb znqAW8Kwx5ZMw~}d3$B_I?3QEK5fnwiZb9U1(%?pc zMiK#W`6o<~N&&bAH?B=;N7dDUO7pBP?7PjZs?az}b+LF!afP^`dx~Dyz9Mg*8SQMs zgk|9QMyY&XrS*v!J1dJG1mYUa4S#iSDy` zXeDHvOBgj>{n%$>2Z=*9@|#`ScSeN4@||^$mY?XNG0M_ko&#f0Xmf@{D_FXv^m2xn>12uW;5jPQ5%>yVlNO`l! zn9#!Ah5{c?c$CFsL-G6s<5;oWH05h4>zbWVbGI81DPU2ik~Bk|hD;>s{jN=#YFH1g z_xbQ}Bf3S4aSjHxVR|%0;j0nysTW~UQgQ4Bs!FKA({ipnEGH|!w|tYqRG;uNYO|4S z4?{vst(p8p&PzsgrML&=O1;m`#tA5|$=2mzY7E@mL5LyJykm?-iMa0{8fXfByG*#O z%aQa*4gn!c1|1RZvvf6^G|aVw7uE(yGnjCQJ_rR;H%BIHj6W`{I>ShGaJ*-gmb=US zdUDu6@yWyWR_CnO0k;eqc#2J!5C$hO;xs6S8Ce(~9zMET_l8J-#-hd|AfPaM*aVE0 zO8@#Z=M$sp*{Tv^w%iLwggMdWq{v1b4qxJSckIWr*SZ(o)}K=*wLdmmeeO;0VpL^a z?`V&eSj#&Z^aPfvKV~Tl;p*OPb0l{QlN(zS1v2FO&rQIjj7T`}h;HMY`OwQ*CK1`8 z+e`DXR$Ek9qH@f0#2Zw+YmcRy;pDzeD5!{L`m|!xi{CW@p%@(%A>Bv zx%7$j2lnmh@u{nPNG#WVlRV9R6r`8Pc(e_<65!tWxi}Z8EYt+%dtPou!0~NBFw#R; zQuH=@LNl5_p;BzD!Za*Cw_|r$HYm-^i@FpwAQRv}*kcV5%$;MwNE+Cr#A4K~E8mZ@ zxqQQuU#QO4nWylH!AA|G8pY;N8LCzduICgrIS|wvvEpM+VD7gUr_=bGMY~&@$i&vI z@u$QJ>;)%m=*5IN;=E=XLdw|>65RKsl5QZm%ReWV*;qtZaCl-JU_mv({&)h{x916q zr@;7rl0U0@K5tI3>Out+tnz#lt=`6OLa#?>6`>Jyhqb}k=;?N#l z->q#fF6V35A2j(BRl;2i@8i|4jipAMe78Q1C-;ymY^SEr zhJr57lCy)1Bk?{sqxz!=4pEkzX;GJf#{#Sg`+@qfj0fyQyd@I1YN)ihG%4)IGD8!> zWioI>Nb?;PY^-^eo##%{lQXhisY9B!O>ak6g;4=QatLpHT{JxSCQhQgk(loND^?4B^xlmZx+svs@;$CkC z@{G2(mtI=h(YX`I8_-cV5z_rKLXtRAB>5%1i-?4dQNR+m`m2xD&f7421n{#;Y&!~F zB?FyIdR`sfi34Nyhe9KtJBReWTE^_x+Jn^e5QmV9DT1UHx?N~tQ@mn$HDzUWD!P+-zjzJIOr8_QmXpgqhPzd+xQ#;w`{0j5ZWX2KAaV>IbxI`0D_1m+go3uiy%C1$AY33=NVZHLLf zhViwpoiUS9uz`ND*{M2uo$F+&ktd(~R>XIKhkcG$!*d(c5SSW_^dr zFP@=r*(eHlxr;s?+q6`YY!c+Cb z9am)$Qp5&>x~=GWVl$KcH)(H0KW(It7$aqkCe#+Q=b1XUn2f5-M`-wKYJ^4z!r%_~ zsBo%d7?A1EBw)bcdZEc+zpYP~xtS>{rJ36`ONYA0f0ORn=-9)mB;|BTPUkv#b!yHf zB|)j&UL~zbWY>a$HnRKVh2e^#vox>Ywyl}z3_6Y>Wuwou|$~bCo)OnHDH>~ zC$E8rJ_%cu&?<22mix{t)ZA5mm)^dUi-4lNw`uMkrKBkc|46)F{!qBbrYC!UlRlfB zJoDqFPYCWV_>zc%t>BcIeKvVKwg3=iLz>mgGF5rcAt_B4LvlXa5@?tz`77x;(Zl;% z@%N*f1ZD1_6jfvh&%BrOymC0w8nM1Q2WC@hg!AvUUVQA2y zn27~(`}(`sR`8h>d;*&nac_Eyt4i_+`F6A4ebXEWJH6^!1RH8wjt*V`4Z{sBY+CEs z5Ru+yzt^uX!R<>|^G<*VejT-YW~HeXYNc74u|rB1*-EJx4#9 zi@`C+Mwp*-sQrVU(iqxPsKx!zF|9=6X;_TfSw|M#Mt8GIdP52%bg^j1~*xllpDi@zy;xpze>)UNrUhd zdE{P`sxiD7@8|k-o(M%cKTwn%Ma4jUY5$P8dCpGg!*#)4OC~R!wuAfTV`Ur^7=@K6 zYR`5wL&vf(tAsWg$qI$D8{O?)JF=wHg_(O6OGQ@VvSz@sEbVhs&jPpDJt^WC$r;|V z;cKFGOynoL2ECK%CBxhrGrhAf0$t#nZsTb&l)_x1!cD?$q#z<~;!pFWQ6_kuRX}#r zF`7%%)#TFT8#RK7&QDkCPyR8C2W(QFuPt0}8fySq(La=*+qmR5;w zD~(sIZU|Z+GIvmb((3YuGBkiS!RkJu_*X>8R@Dm0^;$k(7x)B9l>l};&Qvu21 zr3qn8N+PnlnxUgA0vo9?6c!9SMTSe1X&<(;>Fgd57wT#Gn1@7|lT`387{^o<*iS{- z1b#NwQR+fNi=j1}go|%Z?urnE#gr?Qm+n{`>y3Ob$C_Fjk0U%VB%XC|E`8iw+wrK< zCbi-!yiK-)@1U%k17b~OmAG-^@*14!G~x9)H&M-Q?CKSe_p?x{hHkHh`%RyCKvm51 zPi2$XLp%ylJPN*GXwv)p@wr9B6~l)j0`M<;zErdhaW-g zPV5@d=XTd$ja|TpA2~RGq@&5qu=}Z8*|qJAaDcB$S*1%h+%+7PWVZW02jb4X0Jksx z96`}Y+RkpdU;$-{b&)C_7q-7i&NONV(uXLK^6pI$n#i_59v_+K(JL%+ED zn>n>*B8+G$;(Qo09r8l=)Adc6bl*o2RIZetQ-@V8OgNx`8PfNEnLpNW>Gm$X79~9x z+a1b_K#Pg+G;|C`%FT!v_iFV@!5z~^BK0-}jTd1dZ!UqHOIQNvxKk!Og!ej$vu5Yp zmx%Y&CCnrc>tgLdEp8iR_C_A^%Me@jIVX&6WPey~wI^(B39amW*+P+HbfOT`CY^@1 zc6XShigsky3U1SgY-rDCeXB*p2Dg_3ZN?r^GK^K7acT^y8mY``W&Va$>*ob+z1VTPZpCRAA_@+|}Prg#KEKzK}-0^L4dd z*permGW|_sz5DD9s=4@s3rK46cgyZ0HoZiaq?a(t3W?3)fjZ{}_n@~l$-E2hTnz1m zi_ColwXSROhw!ZU^BdUiUSBYo&Pe|J44L|IHzRyoU5uA3&E1xxu8Vy__vb>qSaTEa zOUiX+1`2;Ds|yoCX-;%v5HiVsq2V%8&gD|nJ&-v19%((%WB*ff)Ds;q^%uEu{!a|} z10SbHNRZ>U@Ik}h>b&p8l#+@G-v&#iDM{&;aO2%8pV zK$|}(!OC}O*mAu)Y$jV7`-zgJyy}h)av?tPkhP^* zs4eM?4*6{y%mo+z*$rB@=QU{LAXpCc$!dO@jXF2a3Ed&}JDp8f^vp{g^fB260=_Yn zMu?Up!{ef8ix{FupXR`t)y&wGb#1a&NE;MK`KR27U$!A3Er*UHiYY~MW+rD!=*4m` zbiCcr4!=g(Iqzfpx^6!U;o{9Z4x>Fs zF(_Xu9g6f_yZPC>!y*OGT8)_R`FVPY$Uo^5)wAI88z6X`%@Wb#6GWhwY0DiZwidEp zBB`w7IsPJZe?vkpyFY<80*)r=2CU$2!v_h(8k{7JRh_J0c$t@7Pa;D6{i5WqwOnsA zZBwUh=eXcm624tO+&ZkU&vI3}XPC)zE-O_r$t6VG`oe>_J&tbP)If^M2F3(4-5Wh| zPWqN0Ym*JvpfS9X)O{bYwFz!PTFBnB*qp<1hg!o0P>^=StAea9Rl3H5G`OyDgji>x zcI;BNd}wIhzLaJeDRX-^7k(Qa?Yh?kLvpn_({a>dzdpDD6XC5_;jeV?LdTLFJU@>X ztLmhWB}mKL`)vwFbLBQSj!LR!9(b+EPwP+P2HR$Bh6l~68}YDXdM_9% zX~AeDVO86p%DdfFWBi~6flf!8v$0L;+EUz-w5<0uI6I7s8V>POY^s`;$8&J@hg?c> z(R>_iavnUw%ZubN&*@|6X(*Ysu4v19zc#g)H5PO*E_+|sx6a%%l6n=>N%4Kjr-7Ow zgRp1)`i!kJy4uPUJ-#|akvf~^z4DJ;;&pocpdL$tcaQSGGq_p)Nj!EB%C8baF?YJwM--QRg<1(YYxym<0(zPr+neMf_U@FsQ`4o|^eLzV8;qvc7u@YY zxD>?USjJ?jJu%JJH)fvQ<+zbd;mjpNx*$IWM~FG$Yv2Pe=xRxWli;>&d#J|vC~v<` zP0%bcfi{yaMZO;Q+RLZS(@gP70I_C+qRiAfIwsUI;|A(|D>`eG|D zGP*vbBGb2JEVP>zsWfE15c%Rr=H-p;#!nkvCeGQCx>FjkM@?aeJN+>R^&3jeLzeTi zpzs*ZG2cCGdi&VmtvZi(oy7N0*6k8qD#O@ryHGoEThK&ytI{` zHWL}Um3_4j`|A5(_KP^x9B(3;2Z*e+Xqfqo?DNssBcuiAU=8>j*b{c&_-GiLY`n!M zA)lYMxnMG{u-EQNCoey^>m5szO9eE)NA z=1akp1g`q5sIp&Ju8rVuGX{>OjdZawzt+(*;@g0batJeEh^-OtDZNs?S3;>ZZTJ=g zjP8c)EUcTVu{rI=<5bqX&0Q6yo;eEkcH0FK%BGy;P3R`(qj!TPvbnW;~b;CnT`q9pt{+Pl_eSO6%yC_dc ztwowNTlHGPmHK;ZhIobcf?8FgIVayVS3NfzRO+}`6n-ZILc|G@nMjy~jl+a%NFhbbW|YDcx37juY$j@>(|5PT4te1}_tm**m3u**U)b=zwBzSGH}vP-)7^=Zk<%p6bKr5o&LnBtA+|JYS%T@QWaN zJgzV4#x^oL=)M%aXc}74vK;wkB+}7BDRtJcQs_Eo-0K0AB32D%{l`qQ<}KU~Vy1=e zE4*aP8TY%Ic6+KhgusV;+6owRB?ZLc?e~@5i7$fEAl%uYVVWviIkR*&Qu@>?hOl4; ztDVuT?coOuC`#Zsy-&2{%w8`W)<;Y7OAa0KvGjCh-BEU478hLVkcjTb-DIu}9SU3@ zeW>-y@yn)Hpr3tkogu9(3%#9}&;s8YV_kzT6uG3PO}A$jbObAOAS9Q&PnAyW?LT|V zuK4Nei-IXM1~;XKFJ(OfyQUwyZlF-q`HcS20 zNlFNq3g4r!$V+!EtBp7gvDj8FS;2gUyh_`A&9GO1C6D&1cajy?V)Y4!>~qE9cV7@+ z22_QP*L+$LszIo??h3i-m`^u#=Sy$ra?GODa=QLZfP-oKflX3E&YS!S@x2>9TW?fS zU&UaU$xyebR*<=~TyGVdk%4AWPbYlwU$?%)yDgqKf&S4yFE%>j!RG8nud`ZFYDci5{rc~u33B4ex75`F8oU&%0222q@_MDM%sbY_rJ2+Wi z(O$h(zE?@1s_d%#OM`F@HmJ~W7n}ZmhJH9-q#B9&GHziwy(Z$Ozz7$@hO1x}r&S&6 z-qa2$pYB5Ql!lTwxjTYBFJB#bPYw9dMDHG@VvuLldW zU9t!88Qb0_%SJ-#H8?%ATy;d7;k&c&+Vi`;IU)7*H?}OT?8rRcy7rEMSS~4EFQei2 zqI3=TtkmYB?_$c#(b$VXhzp~lthvXL$k}3##{{YWB1R7qMR*kG$31j~op~>helOvA zCVFm<{Pa{(N_jMY0mPA8Q@FkT?OUPzw8r?y>FFKlt1sPSZTpJ(zev;~lzfO*9cbA} z+k^?;E;PoZWO|VK25sspiMvu`kVvij7ln*wqC-Cac5c2V$C3-%IT5>$9Ih_D=TKtf z8%9djPB68`d9Iz)_sYw}65rQFhlrQ(B1UsUpm|gOFxsgpOQ)ZF3 z)%??xvOu>#QN?9H+$W!s!-@BUTvDskS<4{=ACfF&I~lyqot2!77WTLcN?+L$4qsn* zXO?cuGW^zO{95al8EasWd4!jEko%V|*X{cR;f;$mx8>@ebK}FJTDbOJ)3(1`Fv?TW zTwT5I88rREb|$0eNkpF6%R6$|FGIQY;A&HSv)FwagC@%T^19;2@WZAlBnGiVR=(6_ zgviDms^bpfOhZX=hMK*ggn=#h`Pb4HyR2iquGu}vD;rHVo4Eq6HAy5^?uNLFDkK9>{k-+S)M|mrk_qBhl`MbfX z1-Cw#=%y6JMg?{ECMb3PS|S(7o}V(wPpt%z+CRHyTFy(_+5dpGBfLzLlx$Po9i zs03R@fU1MMm?~`b;xLE5fNMA0fsxNNV;4r}gev03&v0#V zaW*pNnxN>@q&)Xl5yYRNog_V+ zg_(7?yLA%QNv{C2?>2pt^p}ay0eWM{tpVz+T06N_+;Y^G`6AezO_b$(k6MIpU&9rk zu_W67HTvgCi(?JeLK|#v%^V!yB&8gX$R20~x|BGkBqb`ec&-xX4@@Q)r%3KdwUCrw z4vjK;Io}`tTDGY=@5** z$hDzWXKxy1YjN!QF$HF*d5}55UE6H&&L^b4M#c%`m^zOyQyM48!oN}#)blD4)YW~d zh-_|nbtxm^H8Mnwo&3p1F$!hpG%DD78t6zA)3eq9wL1;H2f+~+Z#-UlWRlPHTw4B4 zN6idqo;5=$YE)2r2^-t?mV@IbA>zdQW>j3NiJro>V=&DW8o^Jt3wsmxy(}E0e1EO7 zVlZmFu-`|CS)uF|sC5yZk;=hZh}~obxZ{q59btWmpvv>Y>s42)a1cMeXDw|FKjgrq ze-&9U4~r`=#xyYLde~#P7^f_yr2=t@JZ-$i*SD6&~N%TZ9T_V!|f zdRAa3!+yFtRmxgJG;HeNd>Hi2`s%A&Z!l@|nCMU@6DiW$?jgU>C?p@B_igK2ghAni zN2cw)Ix7w%-yy^VyKNFIPw)h7yAG8Yjejr+73l-z$M`n85Ed4xC-aVc$SbSOL(Fz_ z{4*j~2WLFr6m)xrSa*ouW21N2xQv=zY{zM6G~gCC=dJ!CXxd$hs?3BezM}tKQ9k)> z=;nN-mj&h_9qdd0oanHjf{YT?IiKoKX{_QH%g!=;)$vy)%ywE?F&{$Fb>U?5w;Ho<0(m}{!2Ki9el+kn<`VGHJOqwH}OK(aCF{&FdI;Yj=O*|_!F{cEo@yx&w zR+*vHtK_g3S4Suk)jKe-f^VwXaw1g?q7#BgRz2rTxC2#-*a=z$QSOzyr!m&wOKFtX(dvG4W<&sz@z%T7na4Z0p*d|AJn^T4BDr?SzdjySjw9 zQnAG8ii@$=(r_qw&n(AD?R`5Ni)eJ;D~;CBJQ!lcq{*?Q?TH=fBed3*mIT>32)VD@ zA%r|sE9KpFH*4zl$3-yM25Qa-?xfyr9~(kwCW9Unfva!jsfoL)Ist#@6(qN)8$Xc) z+bu_Vvo)Yx<*nOgoKz~$U##~whi|Gi+sMo7!|7{tekOp~ zp}IOPc`yhvyE>6Pj|a8u5Y%(> zZV_DFe(Lqm0JNpG31`OFa3eI~McWEB4Wc~QVVRh@UE|>0eQJ`ilz#cG+4~emnNsvJ zLh)2Gk0*IEBOd3JtGUa*yh+Xac^-y3L*BGb^hN4YhOc%qIJPfs+597=RyJkbWXq~; zdvD%uSZr%zSKM%0+o)hHVV!R~jyE&;Vx~-aW{TsEFHcc zYs_{x@>$Vo@>o(SZU>cFh|4@sY4UDfG<4j)%M&S{7tY_wkcgR7O}RBvY1Y-&e)+Xj zEO$}F7P13oG^R8}oBK1>+>mckx1JBm;Y=ePHZ*;@0{J!J`xKZW`)aIrvLjWXqSYv_ zt2O(s7DAY_ci&MuGvs8Mre32!kuGH>r;NaE%UYq%#_-TgbS{p)CuOK*kaz!05*Voi zJ~P|Vzfb=SV^@dkM$wygnI3udkXOiNG6&R+rHkR#;SLxCJ*oL}MLJXo&^-vbyB3#@ zC5G>=uFMUwA=ap+lv{|t#k%!eg!BdvdnoAI#kP7`be^ie|+veFH^I19FIFPXNd zb@wGr#Qds6byXxG8inW_X7Gy^%CEALUM?Ew>YC1>3N4d!uhl~BqhPE@Hy}i<#Ss?DYH9R z=-wsR$9sR*%cqLeawJViy>%5zD_*WO^eo%ypukP`Xb7>cn|W3b^eCazH?i~mGpiR1 z%{?G9VdVC72^^$m{xb^GM#iG}jFm+m~PoZS1MTZotGHl;K=a zbokIHXXn+aR*=fH=vaoZf^aQb+M=J@@Op%JA+bJL8V_1q3wD(vrKAtmqiNFm{YTx^ zoe@jnNw`?gmM%|C2U~|9EJf7dB)+%Ag!8Drq`uY_*v=dZIk@HXhD)W(umuHsl*uN{ zH?|>Yks@!Mf*Wd}G4gDr%WU;g0sTUl(oTYwq$Bcrw}iHW_*f<_A!tH#ZH?xcv#Axz7fX|;_Lpu@=D6oRU~ z$GzUOdTUEFqSmmHO>T43d+^~NqM3^3=4}z1l&-dZ?_p*s1{jWZRExGsvM}2UN{L8p zD#W3faj&+~f~S#1TZ@JIve`V*2i z&ZU=DVy0q=geitY7@fDZg_nETA3R4$Dop3QRV0>(<}2VuYDF4yp^bhL+=n6^)jG-0 zvTF$Ux?#zx?2tq@wP)dVL5GhJLj?l$f*vIm;lhWdJGmJQfU3p%bT16$)0D0MDnac_Xkb(ZEnRVyQ-K4pZUPLM; zY!qC@4enD<<``pNpR(g6$zdm=D|tN3FPFSE#jk?8yhNZv^$y_yoWVt@iw)Ie)qd31 zWFkwt2Y6qbnL)ROAe&OQo-L_v%;XF7-Mle-3uc{(|V{ z;I@Lf!XOzX9E}>STrjG+C0m%KoG(;(7=8%iDVtPng7tG^bm-9RaM2%h2umT%dZXm29-+zOsp5WV4B&_IuSq|X zxpy!}cqx;isAFl-$eZ3bOTN&cHOfV)aem!v(iV5grC7nE)umX%<1)u0s#-jfo$DZB zy%E0U4HHi!X4gUd`UVaIRJCX%dDlUTdJ=s4oB8Y>TO3(;CJ6BRZ{~A*^l@a}R!c!j z;>bc$D?w^?LA#|U#^{) zU_k;NIQXTmpKd2U_CUZNcGbC)DCvQMALXiZJ5kIdlB3>52Psj>1D!(XYp-7Udgf(A&i;1=91xH}BNEw~RFB)Gc` z?vUW_4#8bNl6Swd_c>?X^WAlsHLR}cqN}UBSMz^Lo}Z|sr~-wg(sx9P-auZuZZlCY z`ffT=FUD>OQLk6s?EyChfM>w^v8We$_q}KfUH3}BO)Phh=6T%bdCKj@Sc-jOgM?5V8wBxMvh(2hBs0X-dgd_#rBmh{DPGu-` z0qc080xaEQfo^gk9HI{&LNbv~u_!Wd*84;sBtyuMP9p#Xfj54D6})u|3OU5nc)$wQ zx)enQVBMaA6l*;fU?d6xtSeHGVyrg+`T`^o>{UV<01^RiA486jPNMjqKh=$>VY?5fZ%|eDu64JeK4RN***1?1?2 za8qaonq%Z>gyb7p)kSDHQhpTz@;Op=p*BSnFv}WGQaS?*t{mr+`dKL)S>%7N)uc@@ z%Oz2do8|P6ihE$0!xx0}S?~1KoldIBX}N80i+fPX&30Q*6`;2Cd&nK|>cmT0z8$Cq zP1|XXSl|>Sgw~j16KoaYfD#=wdo2PcSPSw%i6`elZlBl+-hpr(2sb&w7LWzEpgX>i zjmbU><^o+gN8XWb&TwV)0vkCU&>O5Lw8?CLWzWu)P!*zr>40|R!o+}fqRHXHP-QA% z?zl|6jY;rW@eZf|gp+R77iA{l)*xlB0(!Xw5dBThAYa01al8Zln#wSXT6bY|raJg_ zrgHoQr<^;;fp6>LWj&YR~by|K9ypDLLSYm{eqMx$g# zwY9ammSQ8voUymLxoW)AX9X$|nCKiB9_WrD;3MGOyJaJxW1^F#G(l_ANtfJ%E#w^# zP+osM82U<_jyICw-7a6oUBpBINNBB3XuB|q*SmjD5A>9BGSXFU|46lV0R5O=AhdcR zRB(M$*?u~y$Cti!f#-8L23p=qIkxjio6rJ1b%#I16g+{I+jk0|*Dq)bcy20J>^;)W z+Isg?<=VF{h;%n+1TK*ZlCYLxzYWSD9(#Q+=WXrh@EzELm1|$U5MViTlp8x8<^cKh z?iGN1I>QBq_WA_QB|tv?djxU?e2>7S2O;^Fd3V?a1viz)_8zfjLLGbda#8kg1}q|y z1Ui(X96SOh?B)6}GvHL-#GEifk!)e_I0Z~}f!c=lDCC0qyy@27P8O_etKZ@lz~5HF z^LockJc8Of_Jrj0cAQuWJa2lAUUm`|G~ZN~JKP}^h=JOM_`E|WP(fuoH02wG{-ClgC)9#sKAi-+sH`J(+QlIeb-N~kHQmrj6A-g( z!+p$~Xgi~d?0c*u>F+{vp0|6RH}1`RKcySgv-)WsF493Rc1_6>E^-UJ)>}!-o$@Qg z7RsHi#OibXEOmZK+G7?Z1>wAzG7M|bol$I98Gl*tMjK^|CT`1IU#Ylf!j>2{T9{0wVN z#FKG$IKU?N7-qS2L_Au|8vlZMzS`5_=>SWzFSXR#>i(%%Wsh0;0S6G@*w)NpM>erv z9_m7&HE;`XbhU5~@t$1C8T1LuWjg8;uPWW4wWKP|A#~PYfH%dr&twccDv1?4RMqiG zj8d~2Jz-cbxY1#}IA;^cH$0n;VQ1m88}WTCi9@f0l>?MrI!8<5dtMKhrwo)6tm7e{ z6~pkFoScvI<=LM(N^ix-R-mq>wgp%t_NP@a!MgJ{@-_1E@$uaty7+vKG}GkM;7#F6 zag(BAu~<#vmOm`DF3uM-8{n(~G+1mBup4cnJR!I!0Mmi{`tK3k z$)KL0o)90PZ++o~z?IiAKIk_@C+e$=XU|X%1bxfz?nqXxSD9Aj6IK0$HPzssARb6> zSXN~>TOprFPTrglj+cM-MSg(0;W`Ps%>fT>$AV>6^-^YFbvY%V+F^8oPl0@dZlpJS zC&XVe-!6|0A3zHSJ|SLIe;4L1M}6pTp*;~h-v@JStNKmwUc)ymU;7pK&33=`5`y(Y zcN?$aI|;CmS+$>-1{>vD`^ACr?VxU>prTf1?TPt=T43z3L!c!hl3+-=kC41(8t6`< z?QK^p?Dbap!S#N&kmyk85G$OxFh}sd&<*H2UL;=Sr#WE3@2+CLs13+>#SPQycBNts z(@8O|bawD|{B}fk40gz)%>*;e1FQ^oUkzMVWr9@wh)`Bgv~As3?eah*4Weae+H%Fv zNta~1?H4D0PmhnD_tzxL3$}|gk)Ds9%~wauo^Hps*S#K`L4uFXcdlg1Q@&EqU!Kx~ zT`%;!+&tSqHCx`-{X7${o9J4wICs%(NtZTmw)V7Zwwj-A&+|Q4V|p|m0x`kYb=QB} zU)NfmrHo<1woOleQ`eLEV~|w(XwI;%*5+tswterU_X(9@=DNJcy0lPts{QVy=qX`} z;Z6d*d{|SZo35{(v+eU@ zSLePD)z&bosP+&wsqq zLT@&lramhzz%BosiUB=FQ1JZY(ieBaRK6sYSI$3A1E@;Xcxs!VZ3<~t^Shsd9tE2Z zeFm=_(~N7Cik&;@drDr})WR@g-X~Y|v&l%Q7Eckg${ZSXGI|=CZdRm?v5ln6eBy$O zQ1bP+uTu;oAWGFV>ixW~M!7M7K{E*#JEz>fF-c;ckST(DUkr+0c5>3yb>mcLNX)s@Xm8VD8y%J-cisxD>JXoAt-m(T4yF7~{e@rCV zf4!Wx%sY!C40dA7-$l$v3`2RJWVO`BMYvQ4Lnc#a6HfmeowJ~UB+Lu+)vBi$d4i@8 zye*<*I6W3_!5?H=3M1QMm$ZAj9)Ff`*nN(@e<1TplR&&zp5UO%W#~uRb690xRa%9p zAe)6hguQ}j_R|5=faUbz?bs?vX5p-0xuMg5kzhD|!3wkngpbH2kZRDyzy$EC3MlaN zs95LojTj+hkY64cQy<|Y3L_LQls_1v0wNjx0{R>%^r97zhapX&tAV6hM7vOL{Lr#U z%%L^?aI*-^p$Pp_L{Q8j_WcMTp0E>D;3uKDM7R`SRiJQ0_!Qvcp=dSAuzHV1kWlI2nbyP%?(ES2*IHb z6#<0&4*f<1*&Ko^E0xbro*)_m2~hQ!GU^NT4sZ-8?y#jFr-G;V^ zya>IB>hR;5;y-zHkNlEb<|w3v@G32AB>;TQ$_@uRxtevV#1d@AyYFM(FoI z1O3+(F!)fo(BZ&9FgYs(Bg8iJBUm5{J^5ev+9nHm7v>GnB@5LYRugEN6efL}JqS>C@GO#E6}uk>s4#mDzwn=dvYe_$EOU)GoZ!-|vq z#h;UxoSl{Rce!8t{_?sY|7GS$&Z1)C=0vXZVr5DGFWXGM7sK=47A?Ok{$oWu`3vKV zhy3@?|8Z6O{M5%K#|2(A-($U)`UEq|ca!yJ+q_ad7E7jv^*o*n-dQH|rVKK=QgUfe zm+*irDms@Y9!HjI$`}Y?5x@=PYR|>UoHI7aST}?E$AFVPrUYFff`D-UdEDNEd_hsO zA5rM{l-G9$Mam=jis`9T6b{C}CjJ*$n|vLTpyWgfsx8`gs->2$Uw^mXLmraO(nf}@ znOHOGuO|7hoPqX~x}0%CXM?5$TZmz#oYeFksSfEYxRB@pSwi)^$zqD|3aAm3$7wZg z=Sgn31CR70r{XciqxE%d>Nz!_?;+A__J({(kOGrRyx;&S5A^|@0_0T9{#O01eoC7% z?N0Au_L;RYD3kY{^lm?ri95B6ETy3`vq6H8tf)jct&N6YvCoD1q9m)j zmA0cH&jo@p4OzlWD3Lk3w#FtZVLBl6v#%M$iv&M|$hOuJ_375dZ*)n`_z00C0U|5_ z>dsb8aEkbLmYQY;0FE}DCNPe3m~2W{R%<^ygFZU_ zbNqVEr$x1%c?2@joL2#XHCLH5h!&Bjq651kfe>%(CXr%*9o==L;S);C8Uwcam z2jWjtW5|p7xbhh)u&0Kdj1aQQYA0zHMO7Udp3{UB)1IQB)|}W`q;_jSV9^Tr zSb6QkCe#jeh~i4#$~z5~LN2SYgx>0Cv%^S2HJnuugYTn^SJ!Ghk@V%x&6I;vQDu-d zRn@w}C8^#MOGgnLfHg+I4}w)&<+1vP$b~aBw*Z$d%;gj&U4G9_Gcu?Oai2{T^~=|F zqC3l9pT(USMryQ3FAEuGstj`~&8#Badp!~1c0c>`Q-N`GKC5S7?Uen`29Mk~k?%5p!t!zAeJG>r zyhOCIAmIHxqmvDN&`2(PTIX0Rxg3?9u=ZIQfq11dp7clugr=^?TV%{SXaimZZ!^yP z(ar6jOZRK=YUw&kXu)z+GBtmGQRfvPq?G1*=k;3mGAd8RaSyGf*j*f*4NhPj>5wV9#Em*b#oHk}V z2HQUmxIL&x&{dO19T@vLLP9$0W;g_gX2ORa@5&{H5x88m`%U^xe4yDF39x73$n<|3 zI0J(D_VbHi0^A4n$XK`Z9f?DP969{nQD>=%ixL%ail0HDj#EPgA5h*N<-wgFhT&Z1 z`(xXL2u4aG$DzLU|1#~QHEa{jnh4>TkkeyZq%&H%QyUK}dJ`C(kRLq46V}S;huvW& zmbQ@!VQ#CM*AMC^i+*3=*V~s-48lZYX1%INdGocN?4HxH&?T)6$dmj{%^|7AkKhC8 zOj^^_0@sds@F6R_KXQ(-S&*sm%DN$EBe{DOBSXN6nEVZ^^GbsQcNxaAFvzVY_JH79 zq(^{2^ph_8Jr*xsblO{DDpq5S^@uuab*(_q1nV?L!SoL_m#F0LM^~01RJ6kAyLVKO ze*626m*nTC6_QC8&D0mMCbzqCF^>(|@p`;u7Tt%%^lz?>{AndhAX>_VjG2ad*WYiN zMG(mZ?#O)kD3|E=Hrb@l4n67ZVz^hYAoZagIzR692Z>D$xq9Q7pU{KP=n(H&AXueQ zU}&ExP##2RaGam;5&Wh)c(|9)MSv=Co|&{_HrZwUxgF>&k)N#6KqZPNUnUz_F>;(W??s2ljVu8YYT`zm}yJ0dii@7zE4x+x07V#rMBATmqUVm z9aX`Q8`Hx+t`CPsvh9h7b`zvNfR9H|5@7teyF{&E1#1D`0aA5|jxO!T()vHvrXnd^ ztmyj8)--vFdu)1X1AM7vP&3pm2C!^W;Q{{T3pSJOKYh02+$;=>UNuDVqTL9IvwTI~ zc!_}U`mBb(KDWcUud?E4J59R?056at*`iv4YPRVzSi?ap2WXW2`{y?xQ#1y`uOAvT zfY--6o#0OPQIY6`8rSGfL+tLiUxXAf`2Yn6*2=HyzZK(F(OVZO5VP}a-)Cj#z=T3* zMd=5III>)E*kd#5GeP545PgQ-8<*QB>aEVgFzt}B1J2r5jcvln_nP9X3#(L`EWkXe z1}@)ZNs%k(k`+b1%kZR>%PGk6j~f`0Qsd7mm&171d%1B!mMh#|k(Gs)%evj3prG#5 zE1BhbVE;b*11vCChQDG@5E~>UBlBKhEJ%Q}nAM?Ix^AHtNDNXBmBjb81)lo{N7#G`r*i z(mU*P@jlYuF9Itl9H1LIqAYdjz=VbZPapu@W`}UyMN{^O#mZi7n zTgk%HIgADV@iQ8=r!?U0y94W7OC1vm^UI5 zNN#}%Ct>;FW3RR*sbeH!Kmj4vn`Uj~V4#eNIP+EZ#A3=)F-xtVOvS)PBQEPuQX{Uy z4)@I9Z2~IMoqA)Uq$A4^)(>dyVljCJC0&Owpm7xb}?CWs@L2?{Gq`I8iYL0)VU9u z0fAv|g+kH{KBZ}_e&PgZTaG?qQ7Y}(yFbxXDf$Gm%JBF7Im4rhk&DL3Lv(?;-sj1N zNdB?6`lMRQo@x;01>$>-9d4(EB}??Cv0DN}mv4RI(n|mb>)*v$bC-!$b*@k+>)#c7 zp^kn-8PXHdtJtEjO+wT+yMA)}MvP&w*`r~DRZ0@{15LpmYhR_5@k6W#F_qY^mYYK< z$(iQ8vkh6@34KOV$j@q?(NK3-V|t-v`AW$<1iLqEW1H|`~?s^$a`D!pzx3+@Ec%SCkHA*vRY>R+>`4lLnK6CyU@cxDk|HstD zHfS5gVzVm7u|IQ2_={%8RFs@5lc482eGBDb=L!O)Ho0Sk2Yt#1BU?q$0A1pny&v=x zd91;{9!eENhe%N4SvosYJd@N^%~EG(s!)ImX^5MOKq#drgKUT&9Ek767VN7cwJJ<- z*L!xdC5VYq8&=l_Ji%>xw7I>~%i6Ll5AdQ{BisLt7WtR+*6;BB4_<+Sftkq*k>o`~ zyx>V3U*I3VB77wz79|r$TW1F&lV4fCy#HRZWKE1M3`A|+$hCe+2JRO-)ED!s7k7UJ z1BYK|lb6Kra{rVI|8fodPo46&IQge!;eG*r{5ryKo$`OwB5Z$JaQ#Dzu)QEZ*pOKM z5GL&8Y`nbef2Mv>K>kX+2%;AW^}p0CKb74DR6L33_Sxy@ssgDZtBCH$W#Yz3%JO2O zw;hIwQ8*lXtxN&05%U7-Dsvm8xhOPf<17zM8|S|rO6OT4NcEq5X4V>+Ae%v?X`>`c)@9L&yxnRtjjgA2v(Wk$P{|3Pzj95p98OQBb3pCRlH`tePRumL}q5iY007xD^7@WJmX zqO`|3!jABQC8PlcJ+9mH47C!&G3!;n+pbLi%6*+P!|)fb${P3&j3qt3hBg+^vzlqg z_dJvtQdnt5UK&#N*X=#o;-@9#A*gE@f>8!7MoQg#MVqlVKLf8>Sa{+W3DwfqG!$3d zWsdZ(5v7#u(>&wXR-K<48MO1JsD>n*a(1}(EIv1+law7}ePtgN(8M=@jj}VkNqvgb zMjw^gzmtbw8JJOXmPIV3X(dIgOEQMXUK%BO{<-9SEW6;+dY7%Io*$eSurW zGSNBgQxjz_s!hesyXZVc1-BTjYnJVelt9+&>U9Qd}+ol!%JgUlSA>(?@hX?I=Jb;>HJ>WCrI!x#da zUB!>;lqPJ*T(x)4iFR6A56t&q7aGyG6w8;8ScP2VXRi9oWD>kH=Q+>?!f)PP&P6d3 zXj~M-^s!pk-dgFXk+ooO%MP5w((jBotA zrUZ8)Q0|+8(gC`dfXac2Ig;g?gK~W3lK4A#p=~7Qy?G5j8HReMD@C%2cN|MmSV*5} zk(=U7_ZvOUrT4u8+dg+f6m~f!<Qk`*N2D>3dH`F*z1DD)kJqXXz!M%Wv*;hF3x|JYIY;P3#%-g#On0BpsMmSs%C>t zQ;C;z2qeSD64$O(DU|b<<~^E=y8Xg6pB;(}t%ebDe@0YxCH-0G8*FAxopw6gPE>EH z+-K7^t8<|EAS~)tWIVjt4ni|#?bs)eh0;KWhg*i7EnRw9!F1HM_}Vxl&75#9vA1pJ zuSVUeM(1@ixv&-ZS6;f19FAOex2IQUmY4R$i!YL(7|weX&9=i5YwiSEEyT0meTwo( z`Tk);1u||&v%pWdc$&@-NeT&9e8er|CxzY_zc8)tZz54o`S$e-qi?Nm-{1W8;m`tUo4;*ueedT7arY+xpp z#!rir+Z?)bC)alEbj$C9Jv?>KA72Y!a=2#(<}66GQeL4IE>hW0+!NV#q(cs=?XwgS z4^&*|Qr#_*JW9=n|z~(>Vra1Zh`QodY|_jmtax?f%I7dOJ_UVCpvl_V+&=A~}Kt+q!6GY>FCP)U97_ zn@JO)s83VC;wW!{;&cn)Sh!C`ys!nszhauxc-V-`){qOPVZ+&`O_kqwm&|&0 zR!h|iiCT)l<0VYp-;B5_PlR>S*34|18#gQ<|gYG)`8Im;LW=)v*nU~@ zFU}cuNtV|q`-xGrdgJrGsW{#FRZ=>#mQ8RHjuZZv6W`T%uyW)x9LN$I++@9rNTwX( z*?zKZdz;(9-<>6*2-zh?ru;l<5LywnY*r?`@JU&Tgd)}A7)L%fVaODzB;ebQb*Q2p zgE#gfX5kUo#Lr1zC8g}l&@)g=`XcD~UNJ$pIcr=I3E91~h`;r=tSRnPY>bY~v*n!6 z`iV>^ZkWp#vvVZ~m9)m+en()jy)&Uw!8Kvo zy4>VET&%wkgMX3;e>Gg$#EJYBi`}nK-^#?)>5nZ33o~;k77r5#TNYaz6BZ|P2NM$( zBU>w58x|9LX9KI(e^l{{EBMmlKQ7Qe<-xy(F_5%4Uq&H*egFC4dSM{^`m+A(_uu>2 zf0J=ofAa(Xg8Kb&ul~G#e~6nuZ{*8GvoJL^c{%rAf=27*kSxqLwob+-rZ2Vrw~cyX z7yey@_pc_tUziXg)a?-(Pv$Y=2w~a_+y%{c}v^7lHRb$5dW) z4ExLN`BTTRzrYm#O#O$B;e7$I{BL!PlDoj<0cjmhWEHLWokdCDiw!9;fsvk4B2r;y z3fcQ=)?Q=ezSu!sBjMC&Z~2hl+u!6PRMD@(13wKLM8I(FuFKaa-4BUh57kZ zU?U5pf+}>h<{QFKZwQN6HNeq_Tk;*vo(hn#Vm-%{Okf~_;>pKon2&xc=pp@Q;LkAN z#E2d-6<-`MPy|BGYh?`@1oR?DLhURBE4+dT?o)zP?mJiLBUSM&6se_%1DyzvU0MgW@X5dL9)IJJ z9E6$?b_ua4@)^CRM~r%LOzPvM^_Iv-O(RA&+F&2;!|7qT?znF*Pr3l$gG@`HqOXD4 zJM0#+)c}>Zl!}ZL2hT>%+XdATk{{X8c702~O*{I|d#*`Qja<*)mjN7xByA||6-cveJidu;7TVFp$ zrc;)XaR`8r*2%GV)(_)$k!cQPwJH5AWmO4CO~U^0=lrfarB{H^rpxt@c~5>zCncUh za$y8yqFovzXDR{ZPs})QL|aa{*2)(#ABLjLZ9`h(@{8F|)zrVGIn;Nd#irs#U|)3O zAydn1#8cYY5FU41qI}MPnWv<@hs`{kFHKIc84~nQw{uxDH>u$~$KojWBAtEyad4EK zGINq=pxIUDFvJ$GR(CV0TGrXN92vNJPBFHEdXm4sni*?ghF_Z~72UOK*I7L!h2?%L~vjB8EPb)hYYaXxpN}vX6g{_vO-IC%!3XJOL$W}4^K8{Fq<-Kl{nwyG> zAxPqv{;o`v%mc0l%S+TyHFV#vLo6uNx(okHzvlsEidW%_LqpVKS!;@_`r!H+cZ<}9 z6w>vfjgD&7Yv(!R!_v8_GzmMyyj`;73w%Qrd_!sq0C$)Hcr_G!1D z6Jle(%5UOkOd{!jYVMq{ZOr5(fLoz*)WP<5FzZ3vNA}*b2kEVI;+*6Yw<@^teiWh? zoGZB~!PgiGYNr;WUXX2l3XHy>*4qi5$n4b-smIz34UlM#=EuL3bq+z9NwF|(_(4iq zmNS_!O4;08FDe|Kwe&^L;Y-&?^t(P7WQUGK;Vt=4ouDrOA{~(y^(C;FRb-j}B=O`o zj(XuEUa?{mD*g!Ey*R$k2p2DY61IcozA0}ny^T^L&kz?0ZX1DuFdKeHF2>E9=5IS; zXXw-Zh?d?h4@Nf$0gP{})tA)FX}DObIRd3T3trdNKF)ibbvRT)q-gvuu;P@Ib)q5s@om1lXBk@N<)L5kJQ*8u>*PHu4myWg zTWgEUt`E3m{8bY~08OpH&Dq^v^uFXuby2y_tixy&PG};@UgN0KS~}!*nmw^HF0v8- zXiL1e9t~xh)$a1oq(@r4Qt>1=0h#nT$2Co13HTOaWz3FtO$(0x_xb8SO>)$8DfjyZ zjo|VIaZ~CsqQPwIqwhk8$W(C-2PfIfL!A*L5ekRW;h6iU6fZ$39=t&@U1vQ764*J# z=u%TU2kUd{!s{!>0lthLC&LjA2gAw~O~-d%p0?1PQaIOmV2;q$XT`+eEwR;?%&%{` z2j;FaH2Rc#c9J3j%T9wOUukGc=dRZ#kGFP>wPV};km*LRcTGVU|H9SD;vT-dFk?Bt z0=iIn%^!zw+|a7zUuFGyfTS^p;#8~C3D{=~wDZGnR$>Sg=zUe06{J!*RHCL^> zxz=I&2#fto>INm6g<1DC0B=r%b|^zC7Ty`}@KmqFuH0I(^>ERyk*vFS#&Db2s4PR* z(2X+QbrF&R10e2PW+&6#C8xAbr=s27r6}1!aU1waP{1%1$jG~|dARkhilZ;*fOhMM zuSeY$$^nb7D*opH+AOACi6sNa5*6xCJHh<7Zn`sB}S!IzBV$?P^X^%r0ABP8DNB;cdg zsQP8xhO?gQFhlLT)@$(*)ce?liK1y~C|0sBGdTD>smAcbov+_7e75n$`YIJ8K00X1 zSvWaanCZnaXZTJgyqc|oyp%!L{lFs?+wy^t!r#07QPtV5R#$fZ{u5>FrUG9sUAtsp zeeiMBkv19An%4T@D zE(vLigf%*wtZCii{^G_K2?fXbx$xpPP~`Hm3(F^E&p@3jlRz+APfUc(t6Ki(BCdux z_j6YST3HG5^5fBbYagb>V;!3WMix?8_FCQ2EIz;3)~I|_Opu$s-2g+4O|!{qVxeruSF{{~8R8z&k4q8}-wK0FUH12A_SkjiGO(njUc#If-01 z-G4$bX-+s9h{71IfYJSMsc(-VAK3Y!xcD>wW5Ww9!NT3sM)JPl_AMQAg?}eiZj1H8 zdk4X1he4PYWDT1kFjCK;Yj%5UGoAacAJD(4kW0uMF)S_|)vgfj9KPG-YEjeB$71qc zKs^yDv&6cRL!bI(QU+-kU{s$u#{J@lF&uUy zxeM{HOQM7?!*~3s!d8wJ@EI**;6v%vUdjI}?t1CldWAj0~ zXCH}X?%)cX3n*Ie`S&~RA>HYKB98&ixroT!ibuDV(W3szYe5k6GtW>w{px{ zPqo)o*or(VC6F3quHNjUtv*$b9tbZfTm%=9Ge-)U2Lfig-2+ZHS+47QzJF>=CN@rH))#sC2Wy`9 z<*fe)q4@&V`$K24zYP8Sk2=%H*4o;DMV>{8#gfIE#qr;CEah-$dz;~%hMehM zF=xO45C|nJ>KcYR55iuc`%F!r8*_bmm6;U*>~1QhHwEGVYz6$;-?5{+O4 zGH&!ELj>6Kkzp&i`xcZ21>>`T4KpfBS%EL_3*qNP0k7AWAupEUdAm|^DQ|DxQn2Gp zcfoS22Y)lOMenA(=V_FH zKby5}`$<<)^E|(QyWSy}p=%@8-q}v2 zv<@*lgnDTk)DNl8iyQf*Ou+yRM1B75zP!8QB#Q}=_C#R;VfAGDrX6Ngn0}`o9)jvA z2mldrN0fo*`G8susXx}fcB^nf7SEg1`G7j+dFtDBuG_wHvoe!g_N5i)75!`Y5NXkF zU)ey2D!}RLvl2qzhMi=@@v-ol*W9xq-sJ702&FB>+U5q;#|F^`&$DLFa?zTqd!!Ip z?^&huuI7D8dL^9hX*29Hlr?(Kkr-nB8jPBwZ=$KWsQ#3!ov`eE4{}W3xW1zhv%O!C zc2+&*3*jISNk}3_XHJVR%r|q#fX=`m+(0X za$7vgAS#f23rvjd|H<(Q1uG^|&(w%Ns%>Atx^kn@I>JT%dQYw|g{S~tApe`v7O9B{ z3t9nvdUPoAvO~%-ZIa~qDsjCJbAc_b{2(ny)yi6h!9`8$E(iRNwa~pV=X=sasU_ac zWrO3~1oSK%x~NrVrS@ExsQk!BzuBFe6mbQ-gV%zmoH|w(nqs051_`3!S~{uUO(q$5 zkewT^6=8Y^Y8S?ubl`{jQ7kx|LGoV-)#g~Dk>h#n(D6%JpCEG<966zE4e);mZC+0Z zEnK7K8P>T&P0z6-ON|+47cQ8mJ6Pr1{&1VtkHS3|X`n5?ki6O}owt)#yX@pwz@M5k z`E(a6eZ+HcZF?+OV>-s~0V*hXnLN-iYNsH%M&fX(s6RNnDNiOnaRac)RXg6uZzNx^ z!ff1+YfDFR_F6vadE~$Bd!Jf((ne`_8lh4@t6*+cQ=H8W>J1Hnn~`XQW4x0EzM12(vlt*9v6YVC%(M&c;FpLZxY#( zlIzfky-dKo@)2`!;MHe@Wj?cd>U=dXroFRI)g0gEC{mh%mnizn?%u?!_@5?8E$q1O zPCxJ}eryfa^Gn5{Z`u`7RTSFyE0Hz zBhs?%kU}bx9i>V=1n)g1JgHYLwedmy(T1rTm@tP1QufA*Y<$gef=c4zvVft9@6lpF z;#3UgX{r_3#&n^YzzsN(f9VqA!5E=hc4FzQ@rcEc7G(_M=vbo{_9cjlT{Fc+YThdM zJzCUcpNLHr9@$UA#)g*4@KOM~`SKjYWl=KR$ow4A9NqkZrsCEzRRmQSG3!Y?18w$u znYW~!kbA5+ z&2rFWX9^qSA-O$9-2Kc-5!)y=MoE(_B`RfROu*GCR$tQ=6zmP3{hibPWNTqj5B==p zw6{w6Q|>l!Hbz4PM89a>G+or!u4Ls4F0B>1V#7duA6x>z0v%H6)`)lqF17HmEFXVA zdzlgal*+xX(F)&lq~^+y+!n-K^npK#mZYq0w94Ca3EP^Sz4F@lVajoQgZa(!Za}eR zE7u6~C*2{Z8Fe0Tg{Lb00ZUR^W;k&SdK#Jf-XLZ?o#TwqUKmOc%&n@Td<^kP1amtk z4zaXmjPJ5tp`N_4w@{&caj3AM+ElF2u6tF~H?-Rg52uRj^bemULuJUKgBqqGJ^&(j zC*NdH(T(ASDFm6tPz#>Vf4)~(zM>)X@CO{JobTBOj7vNo;%%n4!P{q8VmPlv>Kc_0 zy0))Z5%GKL4~q=#dxcR2Rxj#V;|BS(oxfZCAnw45_oiC#x#YcgM=q@O_;Bf4Oi}?Z zW?VHZDo?Qtug$YgRRv?37rXd{uAw_FB?jynUZq~>1tp0&&UU#xs<{j9iU#)y*vFE# zOfPZOvc|3gMUtcsx3Mfzi*8uSW0skH@K$?!m5WR_vz|~F)uT$-yA1jDb*9<^3Ho!Kvg5Aspm6Kf@x5^q^_Z}92}Dn z)iz8)u{YrCY(YrL+RM z=ca8u8ioT9QoFbnEO;RZV%1*ERw%bf4V$#2U-nZ4;jTFQ>b5-t{RPsq5_#oShRET zXrBdi8){H7jw)BpZ7R^XgVFQ*dfq_jRyDufJNEF+5v8*DwjF_v5TQ|w`h#2pxewad z+TYDcxW*HYEoBO+Y)d|0B;YeyBDR~$vGA3gw>AfJ*m_t9S=_}W(P+nfo3@z_KhzTK z*owf5x{QX(Ez+f}cZNd`MMK0;fXBT+@R!RWxD%WR?YxfD%TZHmS0NiBe#omh+qYBYI)I^5rA?dYh)UhPR#^9^8_5|5wjw=0|eut{Z?AFWX2me^DJ|w z*T(@KHB6mxcTys_lmanBbXE*3s2&6JMFHmh+2L=+I+eC ze%UxD(IqUGggV5u*((vCj*$e7~7eY6%j;G;n$Z!qCkc0IC@KE1pW zH;{M9M@sJ+iMtMiA4dDZR0ikx90iwHi%|k*4VdoLtV&oaja*m5rM zvtL!je7%R_JKMBchBtD-s~X*TX|ALPn=o&ZtVToZma$z^(Rt^6+FwBsMy_OdP4ohK z2pFvqmGnUt!(yMWP;(-W@Sun~?5ZP^4rs;HC<{5Pwn|4_QJ8fLTdtb!-pvb=y@hXT zsr7MhO{f^k6d0>%7=?(FnNN=G1@0kPs$wkfvPxVWl~vS4a_DAHG%wsc!B4Fmesq~F zRs<@iD@2vcsFgr9x>$P0EoCQuS$29{?&>F{>h5<{D|s`c*G{E@C|`%7vi#IWRmI%Xmh6)bS;5b?!5Nvj)O+%!C{ck7 z4(#u%IrOyG^46!Lfx}e|m$u)9DKu=nKzmqbacnt!otGS=h0o&bL@>=1C`==}Rlc|1 zz&3WBNqeVK)Fk?Ye)2P@=WBR@**VjU#^Y;|Ukea@7>}oVag>bfy-GZ<;J#H|z4B@4 zUSf{6oG~jsORXj=$cVA5Nj<_Zq>tHoji{jCsB?C9Xo4L>S6_TOZlAyv?C(QEeZ4jZ z%Q-OnUFA6N$ZWl4^XHMrFm_dn;^Fre>*I6??5``AWPI44`ZfzM@Vno>nati$irR9nrKZ8$gGtw1&P1HA+>PzjRV35yx88-H@S5Dg1k0rCG}o zY;l_xU4>~D^B~KV00Fh_Tf4#WT3!mL>6pzcdmeQL!I9ZE)xEAI1p5|}1)A(LzWpiH zYO&oXHOH~!lA6&uHSFTt80ZhaE@6mwVli60{U2krz$!ln1ve1YKYa89GP|a=RTZt;vr-J5k4Q{?~y2F1OM4PW@AMO+v3Bp1BCIcM7xK4RaX9(vVOmK^qIaF>+1B!$&Vv4u`#RPoAlOkBCs# zl>}_B`M6nNDnOw@ue#q&DcEZaILxTe$qYtH6nfF=In}CCA2tdc6sTXkm^#lyzbY}< z(9ORooATD-qU0v~DZZ7y|DMX0zoQ_iIGimv17+~DChEy>1-v_P8Vu7nb7_mP7oupR zzQ-Exz^eRb;bc*Sy(Z~zr{q6p8R`6$dIH!baHqqah6~ww#@!p*LVF{uy@-2Vq(wei z!C4pLv8|3O;K8Sasz)3YXxcVOFG8nce>8qmbNvwx(e)#&iP=hGoj}7ohuCY24!!!7XMO_XGPb!Z+o z!Pp2oKHbDnPTrB@nL|J<{+7r&a>ENb@ll% zO?ca|!;Rhl5#F$F2XCo*N)0d7G#s43y%)IJhgokbfNoV)>I8>ItkP2?LAq~R9ieC> z?JtU|g|d(_gBkz5?ka^K|0LAINF_Oi^B%>1f(?BG?MgMmdVt0|@@=wM(b|CF)cDbie*IB<+%GI%W35?gL#qc4e-wB(wGkDctVEs%>bkGT3{ad9-3{^@BBQN#AY&WjyHy z9)2Qk9DU$dpNY3?VSQV4Z$r^(pY#nzP0f-24Iw)TIfoBxLsCGLDLnXG&g1O#_g3t2 zj;^_@B;Nq)p>5ykt~|7{<*Q6FN=D)W%|{z3SvA5u>X8Soj|Y~%BH*`-`Fu?_TL)nb}E+k$e9 z^XC-Wi8g5hxMp5uF`wUIDIL;;uE}j-{NxB9GqR;NOLL#WoH>Y>=Hzh1elvWp$ZsSH0Zc}6a4 zQL(Ua{}JZ?MFRLU%q^lVrzkJ;E6n{LkW|dSIM08ExqsdH8wvFP14;GI{Qmba_y2{b zV*QP$;^O$<4$ZB19d|Uofk`gVO)|=OcaNe}DRaKlvMf^?#+}lfiYU#Px)|hJz5Rt|G;?t z`34U5r*JyQFBZtt6E==VX%03HGB$9fd6+rCAgVuQz|VMC$k@So{SkV96#2XL|7#o= z3k%>^W00}@Mrncbd~6yrHkQA`=8v$he-F@e0_4cJxPGVke+BHh*#T-`p33j^JX`>M zGM+!f_sjqza6tcGxw0^G0L;L5euwYD*WjT4lXZZ@`hTQk;d-W)k@@(exwL-x`P(v>RA6&37iHVpEb%t#K`XqPJM+^@(AA< zqz9FxWcz6qU_x`(v%m1c;JLjE+LVL|fQ7rV5HrALz>SDc(8N&DipYQGqlCOpNPgME zOxIhe^nvpS8#6OB9keJOJm2~K^SrJ5Dry_UOe3rC{_h9=jQ04A@)hlQ)cGrf7#X^i27y0Pt>PZr0G z%_pkf+jA3;F!&cWwFyw9%~MAmR|$)POx*!O3jJk*@s|09%MH9jj8^hQL+IJH*7xH4 z$cm1~3EYx%#a@x^P3DbXRc81A`7{y-Q-h#xG_*r)Mbnkw+_Z__dWJY;y#o86P6lUs z3Tw=-hCfs}8{*ExkEUMcbfx8Rbiql@T%8tdA1*UknH(pa1;&g-F#_FK}*0sI|13Xz7T?s?C z&UhGh6bnkY*likd&Z%s_t$f@fwh!2c*CxKXZCDI?-@0vys_XKyY>S>_Dwt%~{aj7r zhqt2Bt>KDfH~*;XwyveygwV?D*2*+uF#R-i(NI;w?$#_r)qYM`q;1nC&HDLP^EVvp z@|(7XgYUTW_OsfoDbeSrG<()_4xME^yE4Fv$zl{|UY`2*KfM%@Y!Oh`+*rpzd$0Nu za2_zB>8#V5FlfJ>9a+p58aj_=au+2P6eXX>!<~8DESz2}-)mku8xuEpnMU`lN#;_h zyZgD4gnBITe;-jHuh$jtmeJgwoq+>wlZsfHBbjbL9AcPHY~>tbeTEvpn{u zzb7`}FTa=X|DsX;Yx!PVMO{@z5j?L^)#CcM<$Ja#BIdu~(!Xx}J+A#Vs{t>d|JV5N zf9CdYvl=$=n*G!2JrB6h|I6w%;2&8Kf}Zg&Fl<8K=7{bu67Q8 z&Rl+tKmVM#{KXIj19e%z>i=UDe^l(>wf*l$aW=r8d6TiQ|2@q9ISle}{W}l#zgV4T z0T@|3=o=b>$*urnGk`G&U~H#v=wJp$yPG;%ndsX&T7vW)9RPCnAbopN0O;w%+5`-Z zw*c5Z@(KR2Bo8pK13Cc#mS$Ft;I;Wb7WCNx+J^de;J3OxeLVdS&Km@@w>Nt%#N&lI zz}Oi44_pp#LBL@4Ux0gnnU%4bm6?Mp;4#V5EfYJSz5^Kh{s_o_#JW3}>4S{GaCm^d zBN$}ytN1o{)<%woU{Jpqz{E};Tqs*d@C)t1MFs%@_BQ&4KmgFi5TtMU^uWjfoTHeIl0N6`_c4qb#02`2_{a-U+ zQ&$^Ppw;8c%&d(7Pb&Nu!NA%2FOq>Vn4Ao51aML9&0GNXU`2u{2fx?|R%T!(!V?F< z9%yOyboHo>Clo%og1^)OE*#MQSLO8`03rZUfEYj=AOUyXZ)gDoHwBmsVF12-D(YW%pDL|yZ)j%rXpfGT z07ok$uvQGM?fz2kFFAdH0l*ME)dvEM0VV)b@RZ;D?`a*t8ejvk1=s=X0S=E-I)F34 z1>g#B`;{;7uUze(zWtG#gBi#O%(Y31xCUUZ3fPXV z!N&Q!Wq;iRfyWrNmsM#f;<`(=ucDggm4ADtF#DIjZ;M@@kJ74Vm(+W}3?9Kp(L&eryhzdXY3$^3tR(>HW<0CypdkAAHWZd@DFzdYx$2EX2E z2qx`=-Sd&3^IHmBJWH@`I)ZBl1pF@FUq!ciY#uwX@S}*SKFIhf%fD{g|Mr_-iV}J1 zE<~QnA@YZDh&;8A$Zze4JobP95eb0U-$jym5|(%pmiR+h;hk^Y@V z!od`v@RXh6Q*yVJr;|CZ5udZ=b< zZD$1l`-LUAmoos_10Gcm?uzuE9_#-h3+`XR4haC;|C7}L^na;AAKXR#t%gUZ1PcS7 zgn@qugPZOzDYK_EW>0DU>QjC>q1o>=K(HFDp0cxkN^bp>-1?7KTK|>cx0I2YlNq>x z)=x@sd=hkg5_J4S(DAo~>(fK9>w}fx`uFWW$5-&r^?!}sfB(#6;baHn1E0Qurw%Nf zk2uHw@I#ZEnVIFk{h_(%Y{H+sFz!@=))*&lbc*wFzJ9aOxeE{3@KqOD#>Kn^nlffa z=w^llu0I+hiyIBENJG?v`=G1W2G3C3MzZ3;K?=bBpz^#wTlFv3oDoN5{`Ls(d_(vz*90^f2S3~SJJml0?It1~yL4vALQ_=9+ z2C$z=&WYZZprDYULG&U#v+-#ogODJ8%f?}e4G|Plg)R*9EQm~m*{3*&7#R`PRJ0YX zhR+{!(MR~%J8wpachIvW*L)n#^EwQ!&Jgg6`>>E=)&pd^?>@{}j~V(9LT@2DIyZa5 z3eQ1)l0qYL)Pcf!1`+UHpX9t5swS3?>>heGP<(dZrg3b}Z;O0ZdH)^dPZXG%v;2ar zTg~K`G-%t^*3O$n1U@!3b7tWX?zakC;rlr28llfbmi8gAI*`t0;)tQ&p*lLh_ieED zT=1)Xk?!4gXcN>%{D9tS2!XK-FFM^$w!dG^Ts_%ba1zcB`9S3!kwn;k6V9!I?XzmZ);yhsPfFZ^3kSN&@A=3eZd;mH&q=JjM_olDyb(K&>P@(<-$P7M zEHYdB2y{TEDH8hDIU+1xE|m4(q)}W62_Jd;FFwFGK9JNt^bdRUbUf_4-kX>LQSsym zSKVeHya(`F_97r#A*=0SzaU%+n7$)h^)83371f`Ah#nI<;Pk!4-hY6|34Av9S%PHW zMHVHTyCecn=@tO<^DX{1OxZ+0MvDRj9NKP`mG|l^8+UjN*Z?uBt2_etu8OEIxCbNhr-9Hub3Msx5t4Po3UF z+?NPpGWy>w;5I{IW1;CnkdkhdS~&aZni3f_|zaP{vE@U>_7waAFO3ma2vH}s$9(|xSA z5?|JgzF7S{a~8roVeSpb@v%{W_*#=gx$tGwG)ac=Dt3A#SJy0i89HXmhZs9ykx)dEv!{eP~^vsn>Eky_%^*H!}WdFL%rRn z(+nSx7FqMWPH)aeyC&UPp7(W3<&WC@ey%2{k(8j(EhtAtS~0ay5p3Ir-H$gLomOIg zy_YXTjb0leI!OkKOicK1w^q1LjCGOVgm=HFLcTAV#UbfP`D#SU?r5m`@0z)G=kU-y$8(uIN<(oiSxVbm@`U5sNMZB&=F$h>s0*|j@vbt| zRKEqiiSZ*2ak|It6@SLt9Ipa$cq40I5JfjSZ?@7Sfwb2V*C)D74>WqM)pp0#jhQlt zj}_TX2kq{tN_t+w^ic>IlM~vXI_ipfOxF$h!``wE)H1nFr+J@&9TO_GZ~9sHh$MMF z^7~7e=v%?NZ^WT`>&#sQv$q%ccd83-{3DNdzbRU)E%41aTe?M5ket{z4$!8a&Ut90 z9bBNqR%_q!=`tW2kAV1wEYryv{bZoVOURRI@hrs_(y2?LE}Y`oiR91M_ZIL7D!E@1 z+oM|)a{)<<6klKz8_+T}tuOF2X3l39J92q;^_I0{vWi)!YC5j5&dXxy$kj|pG_=BsXP!TqqiAzQ<+a`G(<{`XteG|@n6O`179~gE%+F5YpPq-iwInxO z$=P&C1Ha3We$9B_Q-?DXSR=gMq;ngQ@~h zpb}~6skMQxH=@3C97!f{vSc%Pn|e`duY0#fY_bfVd4+Sc>ui47pO#G2z2Ry#d}VIm zK=b{5OrnAnaH-fi=Ox$LLC$zBA1`AP#ULTwxdrh=(D4~9mu5L#g3rD+W&}nLcH_nE(BU3lq?ZSyUs@SOt(H#eK3?Pg) zxCPV@*FLQj(XLZUZn&?k7nYtlq|?3B6Vul{&W6+>IP{;#z6`v+omzr;&C$wK3-r?* z3%c99Ebt;$U6lP$bZf-0#=&ni8@tS?ZM15VLUSxw0-aTmTUWBGy3_y?&3B~y3^f|M zua_|5r602H1d^$$-R^j!aDG@3ah=2U*(@Cz_$`!bNhAm4isg|xdhuC1fG&4Hye%qK zSL<-TJ>L!n^NfVxP`AlTs%Ef5P+~=wt+A5{1G`x| zFNjgk*wTlP3rf?@Hn8_zvUW)`>XP0j`jfkB=z7hC>V#%Kk>449A&uW+n!(n*@-lam zQ-8b&0_8rAYp-(PHA8|+DSF@s6$ydrZ-KB~B{Hw$F=;M$M`(@`uYJ2mv^R#NxoC*D zj~iMoDn2Nr^tx41ygG4d!sYGf%vNwxEue#XUXU>~?naB?x4fcasS(9@E$Z~`T88lm z+R2arHv!7SYEwK*KPNJo6qGrLEwmW@s>bxv02;PmvR7$sMopHjgnaykz7#|sS$^?b z4xsPRoXHfjrdN;S@w>v%H^)^=Xr6_yqRZLaL*l1?Z1Jv5nE`;qhq_t;Bw>d%MmfWr zY%U7BX2XE+fcd*9)oFsw_bV1SUM9R_=25eFbx6Fibc))n@mZ4>9-MjTa4pZv@R>$F z2_DNDVJh)W6atkpW!=kZZ!zsEzTHEf51MR{lk>$B7fK{!QTFheN~V{p8kyZFKbw31 zP+-VYP3F5{1;E$d5&1$_ShcwCkwajtGOkq0ZbF;L(6kk~X1m2YJ!m}0#B4c;|C^I8m9*_v;p#p8OCh?}gBeYa@to!p9{x#ZXs>9L^-590I-LBEY z@rP;pKNY?O1UQeW={wf|*iz`;NN^x>81KODS)x1BlEzsqI8VM7u;mvcDNhTE0{$-A~FCXC;y zP$&xaY6qn^SmonMB9k9cn)zJWD0O|iI8mV|7}b%u*R3^df1Mg}Xs8Jq?{^oT8Z0N} z^NQ7L4nQz^HkBx*%Dor>IKPSX3KyyAYe_<2Z9Dfjp`#l1M5SAwM>2QiDEVZM@2Wgz zUC`8Eb;&!N8Rej#f~ZF|6;n>&q)P6AKEgC`f)rt6C*)FHuYoEpG9k_x2My#BkUBk( zD*cp7G1$g4+GFkV@p4kSq592hQeCYz1a`LRSvyJt)~`~ChG*k`8S=JG7ftIi!`g&B z87q@;J#YC7&AF?A%lJ2-&kVP1;wxK?x#)ea{nXHDX?)p!Z;1oziiO^qmcQy^-;%3@ zo4OW+pGSIu#Z?bDVnZJ?73@P1!zU9`JjBRNz z)Vj)pZfKfUo^7Y&EYZaX{SW2Ty=^uaLnBmJc{s7KUTDX8Oa-hn3I_X2-_}9|CJ9W` zhf4?jIujdH(yfu)#$5rTH^~0EsUGoLxOa|T$^+I1R0jr^O`q%2y~TQ`UCCuyS3|7r zr;SQG()4A&tE4L*t92ts7hSl!og+mKG@Xo05IyfEr0&-7Dr`qL9|Lz2ve@>BQJ>TU zhH5xeO3k-prn~1E_M1j*TV|}UnCWat=7lWHqY^{F+XciIV*{?7G+-O?3Mj;aAN;-O zxR|pFqxp9~?|ZSwyZJ4?4WBqcMoYauC1d^3O<6Bk^1yBqXq8adWPn+qy}a)A?G@(t z{7x1R$Tl@i$6FW@!`(?jz%>O+*3Mf7LA~zPF>>a#W?LkXWJEm^Zo8XLeMvnv{y7y~Lfcr@4PE=fuUfd_wQl zdIG=W4_O=7h?SM+N)oW8~nwOY%c9&vB6UuVz`Scw;hbRTbavmX{A`~@- zjC?)+(XFQGd*Tr3S3iq^A#xzR9anx3)ublXYsnIbM;(t*R*_qq>u#-+~++r;G5Ec?x>aCtGaHOq>K`EwbPXK_g5LII_HO3;MGPU406#)8f+Wpoc z3Nd9HCng%4#XMfgArm*QJ?f5m7#~E8X%weS`#WEypRM{83(fitjeO0QzoJEXpH6}Y zK^FItPot?D)csk_RhehT=-so+4GOB8P9BbRY?NbMzdp$#4rGxK1z6{1B6tE#3@4IR zL>5VT#M@9ar!sXMg%2?Y8q5kr!7Zy(C=txvQ~Yy-lk9@GKZHUvr1qn_T@^kz{usZj z!oUrPI47~+;V0@dBwFc8w(rDb-Z75~r;;b8lU;}|C*XL?6v(tVzk+O*FmtGlL0@>t z*3b8FynWn`gF8Q=CQ7x$r*9gtS)KBJlWcu#V#2Hp*KQNlrYKmjam`{Q3TF;9$4q4( zq!BtPT8X3j(YK)Q+ptf;$|9%_GtDNbTwOkYWR)}P2&Q`O4mcxPdN!L-g8=85+<@?7 zw!p;`(t)K!)-hFn=ZbmMoZSb~TjPr0IP?8Y7$b6jCcS_s@Zjy3XvmygWdmG;ltrw?E0_@wB-PWEfHz%MArSAv%)0XTc@hW>VXxyw+)f`wlK*(~z zkaCM8d`B@7!LdQ5NRy3C5rC?0UQ7`f`OVYU#K%dW-^u94EWb%t`p9%5`3)a>B~HuUU351E>vg7%J5!D0Y{OtI})Iug^B)b zNNGqEFSYhG<9JOgH$j(y!w-)LR>h!75{zHxNM|i7p*q*Qo=5Jd~ zF!{h|r8Ss4#yuN&o_@xW(2*cUkBfxCZbu|m38U!AW+gRyxEe%Kqfy11jJ(7xiNh3T z_BLZ8mM@wid5)b2HJC4xNY1~^pkAhM7s%Wj&L))AGIp^t49Cg?r)Qhj`E_q!>dl%H zt=Dz(5A$5#rrH}j@{r^$)v_GT;{a-JOq5R^Q-O%{=L3>wW%B{m_&SR0&qCs&gK6d0 z4r~j>vrv>G*S^G+7qn6x0ZVVw(epK%g0E``HYYIB0rh2u@drKmowkl>wf#122}gKmW+#U&H0;0sh+aX6|IX`9cQ z2t?IV$pasn!vbEpcY-nSDycVo(+Jd*0ElGw_WNk&Z>!fWDCH^fhv^Dp*{ zs|I*>c}H2wiV^0Zcgt+mMC#B1_2A>M6UCrY*+0L)jA~ zN3li>3-tkf%`RMdn#a|IbC{mF0o?1)tUJ{6rX)B#+ zmL%Aah(W8=UQ|UJTPK+HRgM!OXI%*E=C7%!W z4$1S9nDLXtpb+xZ-KJ3|(Wj7J)460GQ#GNJuJK=Bn85g^#*q6x<%kx-ZT<54N}282 zwwLfw<+cqbtC~YbFbrRcMjMBCQVAH&_nwno%wL$rFlfXJ4-vxQ$8j$smNR;+t0Puo z%UlzZb%S-|4r9cy>FB|c^fVx7IyO^71}gNOu;|U`Ygb7pjR|Xqnh?6|v`xqFv_%DK zt{14u)E$M*#dA%?7N&wXtAWrG6$?V&c5JbYHYp ziimGrCtR5niKmBu7a-A^45X|Zb}%YKaYU3TrF_SmDZxEeL=kl~$P0I2RNGQ;*pcC1 z%b0uFk``jC%Y9FEi5rDJS~0 zhe4%fhx}rdV?D4j{LM;Bsygn$ECzWXp<~Z^Jz~+H-Pj6QJ}%r|-xc zE~IS%6pV>O;p0(wNOPYy)-?c}Do3VEouucxs}5h|rs7^UlDfv2fJ_3@STbO#s1dm~M%{jq;WWDDuTwO=)ND)wEtBm*yOTm3&{c-_R&ZHYXPO zWXwm@Rs~6g31@T#XzT6+8(1Vn+eLvo=l*flm-uE>QFe+Z{PNSz1SNhCZYqHQCx59zH`t^LuPEz1*G{7qgM+tNQi4Vs*y_!pa0bNg)Ap7rVm+jW`?)I zh!J@s86~S8>~Awc@altB#uDEpti_gW_;Vp|@vkm%u5-3za&P#>|mK6it~s zn(tplk`Q9_!rWeBfJvsupTGLds}z_Phk=Z9Lu7HWyI<7fmL_k|lrIl{nc|{pH@eAc zwwW8Vz#g!s$(4%jju=KT$9)^#FuN5+ALg=cwDV$6N9lcLrlP5?L~G}~3+nsnlL6wD z12$4P2?euGX`-30fbBpmit z=o^X5PkBB+G;`SfdOd!BlDUel8E~BT@keje^L+f~dEpaj&+aRaRKxW3lhrwm&oWL? zO_f2Db9>*&1e9%&vhO0(k^w6;(5?A=b7TB0Q{2OnUveCRoD@*5Cr{2Ko+b9M5+6HJ zH8wYDHSmyJwkaf8->QVr-_>0zrAL$=8l4VP(cMe@2k_*B*dMhft+E9nhMABEtQuNe|4w{uuX7KH1Ly)%Z=LF0ux?2BfOGfs=0>a+8&O z5_%B8#;FO7O*Bf~u*oHZ2@u7bYbs(8ZV<+?AJ}NvA8-3SDm!wO-a9#%OIe>VBwD-e zyTXS)4yYoW&zBV^f;A_pU*&DcvwY@*7D>>C_|m@lmOj@cs7ja|puUtUP7)qWdLB3M zaY)9nLmBj%+o$GUj@M;bX+OsKUDhc{_+mk{*P993^i#Hr-3fqgA3>=*R02ZCKvZ6#)asJqKr~P$yF~KVE9oOL?5C@`I{L^RKwcOoU~9 zfOBmfOm(U!J#R@lq%Q! z%vT*#ZTIz9qH8qp2KPXUo47O$eYL#WY<2tf1+(gSVu)@u%ycb-btsqp!c40v^#SzG z=Trt|%L0Oihgcrx=F?X;hw2La%PmR}OY{aEuS)JMeI?mW?O6ugrTvOFvBU?_P4>!| zAqCH6ipowhRoh3Jtin=OCh;kEOEswEz_})_mF1khoSs~UP?Q1|P?|4c)Ia>w-g{*Fv+sBW6+K^#3Gs2Su^f z^yVn<(?F69+U8p$JDiPl@vL~#>(^dgEpDWexQdd+UuIT?!^`3a-n=IbDLap7NifJW z)Nw1z1+IQl#$Ma&ek&NC@Iyva;4Jv+Soi@oC|otvZLKrxqbC9VRqc}8lxEnzeNE-!2)VeVX7S$3o(EGbbd^^80 zwvm&@fM+=y@c+IRw2o%V9VkHWAO303r%?DRMJjXac@;E!2*zl2?HlGEgpV9L z)V6JQlhwtxe!&2WJ^!E>x#F+cc8s&)g5IJ1N#u5|En?5{*OEB)^Imy@sMiaRMv^#6 zd7mRjt}Yv}D(W5qD()KM-=$GiiCN;ZJ=lH27-bD0_o$dqP*Y)9P5h>ONbl{EMgBlL z)t_|-^`$O|gl=7`vsBxNZIWg=uT&~+dbewDE7b~NxoA8(4d3KGXXYylk61cs1&N5Q ztccGY@YR` zJUI&&ci8F;=7`7I6z5lwtgFU~s8?I>psq@-mPH_X@}pPNJ#w_$$3K0OC0p`A?z;o} zky3&LWY|WnP%V?F3LW@Td8PH&w72IqBTZ-eW#=U`gx4#Z24Jn`9!J(2MCH*VsJGX3YND2^M`OG*)DG4h&B^#_%dT^7h* zoO-4<06mK7ulC`E`i>S~U??Uw{lnE-sG6@;S9mYJ`rdV~Xrf~|1;3fO?3DdZ{)*3i zd1GmX3SV6>c5lRljW92~h^L{it3}f^wGBjkCr8Ud!0EaF^`~*5+Za3tHtH1;%B~sF zIG6?JglWQwK7`~dw2q_FcY;O7Vy;#3+=GunFt5mqI4z*0^R8=0HpKpv6TGut%IUW# z=4Azx_L>D8Tt_E+BJ^6pxA{5zD(5GOjijWq7Rx)cIa{<20lPZ29Xse>&i%#C;`lCm z_IPw`WjEP*G-pcRN+VqRF-wmk>KZOKU$s9xKs+cy_~@gdVFcK~ym))~fO?hhgz@hH z$bZMh{XYSaPwb07m>q0?ZeYX>#wY#;K>l^K#J>QLuaw25G)3qY%q$HY?NzKT6|8yW z7*&8Kj*O}xeJck&7S8{Gi+n;{{(+196DjyN+k*>CDEVXG+{aTPe(#&h%JSD{Nl*Lc z{#S+g2V4?d!6&5TKlV9#gknBw>#q%US-^V-GqQ4np_0sC(gP1G`+tT?{z5uEL2sTm zJ^BT9`-L152jkG>080M=P(EQu|5bS&uD>?#LDXUUgE#TGlkd}Cj{m^8_)qs9Q*-^X z7t-Hv;{IRAyuWc!n3@dv~M++Ke}JXqM+IesHP{s)bpwqa^3Vi^ z9s}cV@r=gCrSSqT8FYj5^!C7Y-C8yU<;bt*%)#LEej&3{ zh(zQ-{e`y>Kteb+XD&w?I3SIn1hwOr*m|PxKS>UKZC@xUOV>P;7vWU+6qQ3pCL|1J z3K;>N2sJqc3G(ppfLDV+pfLex64G0s`Dn<#4f^Ekdz8lKodD6_a8G=7=ulo}2d(7I z?*Ti_$HNCfEJBL)F!6~%m<+-Q1^V^$BorhDUA~)LFDryLK9JD|`3L&uwX%PHeL`ax zkMM98(dH&>7SwCr+Go2DWf1XvJld1D>WPFWaB=a3Em(`|$n4cuHc)PfP$>_7c#wm_ zns9_%)!`;SVT3KcV?WVPZDGl1e8Mto8|ypu5IlBuc<)jo$_qw=0@~ruMRK-RVeQzQ zD{WyR1vBzxWF9CKBPwY(OD3&2Nts)Ej@w7tdS>rRqVBr{O$C)AzJ_HILO`EF-(mM5 z!H83aVFTe;{2rX(C>r3h*-huSXl~JSL^x1!{)(}_n{E;FfE_U z(W&a z_n~Gt)n(g~nm+7}$-X|`p;?)$Mn|Nf&3PT2Dg2Ova-dlc2x=#i@$kM&TjHxp9?u6< z{Re7;n+@$AtX1%}AV9tAUTl*ktN|bB2NwOf(6j?&{P{e2X zDRpajub3W>lBkeg^3~WP*(TPG%aYFR%>%t7GruTx4nH`TIFX` zbY_GPk$OCofEr9(!uWng15ED0D~Ezc(h{a!xE@5mPO9CgfNb@o2E0#U zh^Z7qL?fUtvQkKys!r3AuXQLbOO-8>Mr5Mrp^TT3msZ=~&h@I}^Hic13%_~!=^31U z+wfJoiCf7Mif|tRE=0zP$0|cn$uSqjCpXjW4QrEy_Upz$fyOK1#zjT)J9*i~B>l2=2NU*_$SzwKC1edV z3N3kVoO(^8V`T>3uKLg2Fnd3If~*XxG!G}b^s^m8-kDVIk_|0$YtQ*cov~gOMdv8i zh(YqZDQ2^73oy+9U(~*A)xrN-t*B*ST{EVA(d)-FE33E|ix!;nL5% zY`mT?QP>5cqP`nZBfS*$GnE^3h;r7l4{nY*4w6jsU#+|LvjHtKoff&#Y`>X^Amdwn zJ_OACei@R*Yswsj0vOnkqYXO294LLgpB`EGih_NJ^(wV@z=?+Oo~Q>3L=ZS{%amx^ ziZL6-Ub62TCVcVHceg%l!0qzc&;oUenoX>$b5#ufkAdx*_BnqIPK;=%b(HVRhcfZ$ z&!-8IF+%E?I0pq6iT8>aeO_f21CVU1*LyQ65|=@F3^Q(3R+D+FiD_QtLE~>WbD~#I z1Eg|-AI^_yRnG24)wLXHBo9yRf0U_{z#0!@M4yz0OyR@IlfasE_?jKBo8Y?fOl?#RHM=U%xFI6ma#rRy3k|6+CKRQPp7 ztT>3x)+1IZ)sn=VU$~ z{?u~!Bivx$S;DDUnkMkzN@c*9ZzMK4(UuM2jn)FuU_m05#>V`L;`cY_Vv{rUb`ZMW zQU)!b*bx%6U!gLTn)2*=b=Weo9oq*_5eMUhzR(#XDn*`@6DB{es^M#67fmJh?*0_H zEJnNwdM_1yuMw0?Uw+QWpVpa4KqvvsTv+r);DT+$ znMOYO1wB{$TIp>pjxSw2#x={4wNs^xOQt0U%x<2h?B$JUZdYY59{j0`qb9Wk+wvY6 ztOU1n_M6hC;frJJlrrJihES_;l^W`Vb^`ec?C{c&eaJ&B?%p3oD|jwqTY@Nb*WC~T z$whA=_hWh8q+}X2oSvD=ZuIeYX<1YA`x1E!j@Jkk$9z+JvEH;F{Wd8TN3t1L0837% ziU+pn^8%J6kA!otIelY!yq9$-CHZVgGlA@KVa3-AW%Dm(CYmsj%jXI=YS^o`2bvE~ zA4#1aqDQ~{2sD*9)_u8ca^~sZ7c=%V*PMc?Y`TAgEw97!<>?a1GCw=A-`7DpN3nHt z+HYNBZ}Cm}{B;NMKZ>%P=wOz$uu(_$2=>JnU(05FN1WncXmpBnnAo75HcyYt=Coa& z4e8dlaPoM5Is6HL^a3esym(QIP{_W4k;}pPaLa0#pT0Eq=gQA4fmt>~Zfw;3lb@Z0 zdiX9`@$o^QYI5VS|7ZQI-L(3#9 zITJCE7RU-UqR}zR#23I42|mgxl!{Wg?sf-MwDUf3Yd~d4bjOV+Ni1?jT}Mi1dVV*J zP6tP?g$=EL68+$f7Vq478OIe5YuS=KRXrKjz-{9#a>*j95fX7mG0;yto^OO2?^NbM z2?pW=48DF;g7$*m>xnN;OjD;FwEDQ&H5-2PTA=zwC)o1{Od95jn~CrNb69fIwj7jK z+po1Wd2uh)y^)gV(%fV2KoLlYjCUy1JG_d1!8^6FrYpkym&p-^#7+LTO>HF7#RIc5 ziG6pXJ_A3qBs(4byaF%T3148-W=MVt7~g?yIiN&*8GtCmbeLy%?E5p{TwY3+>V@Jt z<)M@h&*Zu&1e?mwasV=1^giEgt!PRyOaq-uXC(R=8J}uBt0RM2{uk%CleoUB2!r5G zzbn&P@weA42s`wdsJhpg+{vo)D*lTFli%HZQfHHcB&NVcz9vI^exHQQeD%rENZkoKLQ*I>YuB#ZL5He7Tv)y=9U}P4N ztegtYw?$3EE{`mM`Zp4=25LoTg_Etr(4Awif{Zb}_ucGgY$zNFKIn-nU?e&kr?i_q z_p9jLx6e;H5nUP4tuSaWZ|?nmB5j*K2%|?|ufd1&qQ5!q%=GT{@KB}HXDiXT=;Pq4 zeM zc(c+5RGb!pf|uNeuNpM6LznzoDs^x>M&hOts24D15>3@}VV#V6;%%>wnFTPa-;ZMT zup;F9D!id4heEclRdHK=gULA$Ax-6U|7?|iOV#ve+!=c?pJ^)0DE(n!!@YtQA8wyp z60efQ!bPs6=@pBl1sZi!_m#Ai$-o{$##s6xgDxwL9CUv6eBm8b;<@%7!`8u=1DzBK zy+S*5LBb^Ik7azyI6wXCWkUN@$ze`+`>L{6MXj&|**bLg5?0Sbn#E6u67v;OgBM>p zcn=%)JZLqEs@EFTxh@v~bRqe|1z{i5zKNX3H}@g?e&amq%{ zXa1S5gwWlh*hPBa=Ug*{ISwzL>1g_=$cw`jtLWgk9LkQMsmZDqua{@Qv0|BRd~stX z*>Cr13Py%p3{FCH4i9rHQrDn+-Y}`qcrG-IRyw4~;Q4 z3AE?t$0F?0X7D4>H$-%3Yez^jIk7JN2D*0p-OVG=WWi)6h5N5z7_5^nWpGQSaGNU< zvJ1yqlEoF3S^meyp%&(sY!lBNg`o z-i(1})hq)>{0Es1&Lvu)?lW}l51})q*)^Gh>IJAH+2^xTI+_)F@5OqvmOoLGTFRhO zGCK^r#KE}=?CI6^dpnuzr^YiAFT8i(d0FC1&|fQ)k)KKMuD?{LYo8?9^dq|Qe9205 zV|A)sAN78(JO7S$;mpAFq3?9#v11+VC}QOWfd?s8mw6dcXu)%hc1OXzp)0f3W5O#u zPUI|Wmy97oLQareExRsNTZ$iYKS<@l^>vje>kQ@I9YK9g6hQ713|LO!U9k)xl75Jf z+>FiJNM{|pIy@KW1Pp!0=s@uDUwB7^Ytz!gdHG?^<1Bf?Ic>o*qMp_-ZR~w7{=5>F zeJnGqZ&WhHmoO+uN5hY4lG{MQR_@}-$HLuip@m9q+Oatyq{(u(nb(HrXs`*ya4F zyq_T?bH{RdvrX}NO8EtlyEU7RbIG+p%iyjD>HU%ARawkv{7+F&V9TMq?2-AKEYUYE zxPCsgvlV{5I9p37ke=d7Q||Q~37UHKsTGq@JCtbBUu(1rujB`K7v`di=6FA*?O5b) z(&tcCwMQZ~#>akGrDF>&ne1}B84ox|deB9V9KKN{NVrRFjg!n=VyU9leXX9W$1Bao zu9|%MS;A8<0(abOs{ZRU=5PT3j1UU^6z3xjxIAC%ZJ%#1Gbyx*0^?9aEP6h5e3rq_3*V2b^TjC12!4Cut6Y1JGQ{$k!?Xk@ z*8@#xf(PKEX|fAG3^n|xC(?i?McwX)+K(E7BQv9N3_jd?3RW%9MmFXiGSpJ z@=16?3|b8oyE50$Tsdue1gHnTaa1#cl0Lj^P%@wNj1i7K>E~ngRF|vz>QV)@Bru!v zx$x|pO8FGTt1mt@d=EXDF~gKD%0IK;;qjOc+8i?|Qlm(WXzikTodm_bitv9(zm^T5 z^Q=(CXN<)U#Tqp-ecs=y>S4GKbq^%Nehkgl1VyscW6o+llQ!wina+JuU&d)o0K1}Atcw>;Mg#i*Mzs-9iUatRE=m)x=N-)tn* zf_Lh4lbbnU!*Sk9_JGyMB16aQs(;-_4BhV$YgEauE#$1VF{+Nobd?;~nV(AAK#`k0 zn{Snpwz09vCjBj1_WCAFDm8MiQ;*6n6)u7;W9HhVg<_H)N3W+_4>;P5qFpWNZo-u$ z)Ek;@YGnH{1k`sl@?g*wU{fJ~OqQG>utdysp*0$eI&EHmya`QaAh&(Mm zZtC3F9Iq8)RJ{wv$%7_|OSxMiRvsK2@<-h5ZERF*aZPQu-Aq{Obv;N>M(A?Rsyo)U zR9<(ROSpkhT39(HFG!feTBRo$9)J<**DRveHahl$ny-$3o*7kTYno?r+IzLd1>w1^ zzW1$N#yJwlMle}*tIH*b0KT2k1~)moqxt$Q0HhI_3#qD`b#bTUL;T|J(9n@+6uv^DRglUt$BV7etVWkGNx za6V)Z8cS}j@TR;Kr3Ec?qEmvOKxBt5s|4|OGAGx6&K~sy-0bEjB}p91S|z|6C6a1s0v(I6 z+go2eeMFhQM*IQ>CkSy)2b}9zE92knnNl{+v!$9+Sr5zZp z7jqg}d}Uv}UFT7}j;ZnG!}2L72+5vTKbFqp&WEgBe}+p!;{T)U9e^wA)<)gfwrwXJ z+qRRA)v;|`9ox3iv2EM7o!s=^=llPE*FE=~x~po`m}3sS3v*SiHEKTZ1F8J{xWp)4 z$p|q*$NcJ7!?K%;UF3xXGz41g+uuc8NqC9!tq4C<2Rx^AislTthf3`pCp*-;`7}@2 z!sPypOzCdhK+tpKU-55iy7A_nrVkJq0?qkic9vl zcJ4Lf*#RP^Vvc{pjT~w8)Dq5}#RI7hR2ZKO9i)?&P^E5uOLP3e>7VS3-hZI+4Mm3r z>rHvUm|4@tP9at`${%55iB$+SdAy-Uo}b=hyL<5A4-VC{Fpu8w@rc*;;Wi{9gCG@g zdUFOL-u6Tfvj-zV%6;9BB!V#Kb1rPAZw?brs>>aY(i`W2mI}l>m>WF)xuD*zzH-oP z6F2UQ>rS=qOy=N*f5Z#vF(!vc)yiGg?YCNOPa~)$c&dU@CTh5dq^3qh5y?si9<5~9`qpL(+;|-47+kpS>w$p{tCU;p@OijzKF)@bSV1M!^$;g5ByHa$l!!?`tq~s zV(@~UWn`4@Jqf>f^?hWkiYO5m)dE^BV#;W3hNMYxi2ry5!Z?$QwLNhU#>E?hEfMR> zt7VpuFcv`Wa`BZTd{_CUmTr#Ry|;Jb+%(XP+B+QcD!sD)x5xUv>hA0Q70ugWXR5ve zlfJV?Oz#SY^^4-BiKK!iBNd1p2$Z|y@3FMy{u(m){3pnr({a|()p3094Y~SC`swgy zVQnK}q)?USQ*MV;J932}Bp>BYTxYI#jFU0N*y)?ci#A%)r4BzIH>6QHtUuBS6{eL_ z*=4cYt{c1N0UV+fCxQTdy`QM!J2_{cRfIoia>S*E06oUE@Z)oA1PFU#z}Hf%;de*H zRIsoceHW`Kl;zeIcD7mI>Hihy&IKHihSZS5}}3Uz|~j; zQtyB+YE~&_Hrf$B@AT7JmO;Z0ix+i5ZubII;;>c8y~7 zq_%>EDq&YR5lIzsYiFm)gUEcCV_49qE>ceu6sqX@Uoc`@YJ8_C0js|L9i;4FrBI> z#qkxChyXcvo#M|E2rI**u@@@is1Wr=7d7`^?8*=mt+dxBmiAtqaZ^8xyBn%^1Q73? zd{vwmvGyao0(j--Ssu_6LkU^M-vsnd-%;$GRVzDX4>OL_Po>nV0t@-`(7>l4-B8xD z41CNPfSc4%9MS#Bp<<_G5qKzQE8dnLAy7=L38>SqL?=sMJlSmYK%)RK3$UMTYJt)o zQk#5Yia?%R8e#zp)nBZx5lS-8)>(OlqPEAM{@RPs^b=KW)EN7tuL(88Kl_Wcv?Tj^ zlow&$w2u05W;ty--j!Jf`S61xT|UHV3p*uCXdpkp=eBBjag6F{?~bXqnqiy}B3^%e z#5Y?*{n2`mSG@WQgMGoi{D9OGg-GMk*`{f}k*!=B|x9i8CYic;jVDpiV24N-irR7pK zEBy!7(5&>}%CS}SQ<|UN3k(N@q8)f3Y6XEmqiH4Q zY;(=b?#J>3Pj|>^5+YUo#|j_K0q+GfZX9*zd_xAMthwn@aR=LzQ0BduWi$EdUy{ButVy+1ll z-p#O%ZtM`L;p^SAo}fq;+4ql^*b#0~ z+UCnV=3+xbs-fMMo>Yup^Alb{l3t+j)kZl!I1(n>*AM)Hx@Ck}=UN#@Zx!y}a6U~4 zc(JVzPGSCX1cPvpmTDrRY6Rzc%Jkyxbl1YaJ~EG9j_L&s0D|hlscG-nQ)wwSq@YHC5_c%`C7)9R{Gpp-SCTOfe&E0FEkroyhe)84Pp)v~t!! zG#!8mm{J8cW)Xskt2Wh;|ETL_sd@|YUGJv;yfOIX#-0GfJE974dA>_x zu*@WeqApfWux^+%*5eytdrt@B$`HSCer2Y^SWH|b0+H-s@=uyvO|b`AL2qwLPdu_q zaxq`0S;g_lrr4r1CPfdrt}W*CvLpP?*UJ5fX;M}12x%JYLna zCr>PrWD(r7;Y5;n@F+5=LR>Z9h!9WO81i~DWi;d8BDw)XMB_cMWU@3w4)`LJp`m)H zoUs2`60tuzoDTWG8^OvaIyJA@;K9+%kj)5why+HvSYIlhZGR*^H;{A3)IFq_3-l63!ReM_}N@%bzf- zm;#ad;CyYC_BShyWggL9L@|rz{TxL69kUiDNi>w5EyXKdSYLRQY-23lgnf_uEJ9{> zj>`h;q_A{T10+9*A5Y(@3pMjhj7t;(AvT~!tA1g#kBAyb1C>XqZ`FM z%*W5OOTn77h{v9-8Bv_it1`nGY;wfnPK5#dZHp5Y4QQ?taALBY`Un%J{@vXEp>;cU z5hrjXagA^j?XzC-)IyGV&5IYRfjI}CE1vN-q8M5B!N?!CN2GC@egJub^aJ3~@L@la z_fg$t>l&)v7AEXg(l5tpPxNs6`NHKO`R{X$h}-->(EqE*3E^QSIlHUm?RKngv;KEr^|pUFgU zEke2#5(>0M6r>NRMQh;cl?-4)txQ=B3$#TRK0!){2F2|-?0Ma?@)LxLld z@m^Tt=IX$9q1UFE6s($18a?{}dr+h@)Aq#wLeCpf7sPiEi>zpX1l`a)T9h};z|-li zSc69xOf-cP)SzOxXs3M}iJh6%OzY*5{KC!>m^xJKcv5l7U&0HLGe?#xRjcD$72;{CO%ztHh+HFXRkvYEIDWy9Jy ziVJejYc(z6nOnNyA^d0c4B(y<7)3Bwhj=y4sjecXl{yg1xHE4<9By-#xv|)k&A3Rw z7zu4IIEMo3JKK4uR;azjvzGJtTd|rLJn^D8&3Wu$|2RaHL*8&@fwDB|=D8Oc%yaP_ z0W97fAQ?lSKN13*sgy##zWE7mdz3wby2KmHvc`OLe!AP9LU#l*n_N7H5m3Zkz*A`@ zYY0W<9g^-P+c^5OiP)iGg9$w#(JZ$W-i%kUey|S8O!oa6kjYJvNZF2PIe{?_HOk-< zb4ETD$Ws4`0(`h)^Zpv|ACT;Mc?FG};%QO`O&xup z6dzdqwu1u3-7>Ti-t#!=w53E;{wP0+PvKeB$8pI}_NZ1dRPpxJZm? zDgZ1jbZ~g#nK&zcpRn52WwPxYAr3Mf3ftb>ex@etQCK{pJO!yQ;9<45c? z1wtfcy}L>566QRDz@nhHG>#m*Y%x&CLOZB3Hy4ilqA^dm7@M-c_ZRc3;at9}cUw?&vECJ`I2JpaHLnVs;7TC%SayjQQ`*!L6e{ zId~$gH8eyVV`FvjjDWe4p>0o?H4VGu1=rYQ)Z}UqT$t*qaszxZ#V<1I}eVq^7P^Hw+&mC-)G>Q6n8oCSBBG~uY+RJ*RI<_h-K9L{B(GCI@20>D$x zp&e>FeH!VkZc!qkJhA;#AVP$Xml`}&d9W?XZ5>3S4r<~bSQwxuP2_TLMVmGG6Lv#yZU#EPD>!6nn zhyA7E25}hvf&Rfx4rD}WX-0n%ptX*Ut}-iX&z4x!+**(FY68$C+M^2t!ND@Mzo*L@ z`4$Ngb_!1SbPvatIUFloTQJ5tV0}on&mu1ezCYnI6yvESmUjDeo)c4T{opcw`olyG zbp<5eBCk!ZaN6oH^t@yawb!*g30_?{&_6S=H%x+hqV-P?lD2)4(ZVfQ&7Z`+^AO5q zZo=#!7H0x<1@$KBvi>oa>G6UeHP}FD{`JD-#ppYh*17Zzr0WU$NZtJKQO_DHruz+V zyhIbY_e;)Z1CC(Vk&nEW4Aot%;jh8on|6!vyZ2+9zpq<~xdw>>V64lH z62;u_w?OwPnjcf^;as&Wh2xzk{pbGum{1?n^l!<0iMO>MRIF;TqRSqcKklG;X)idj zuCz<$`cIFzFuD|fcYhl9GQDa_HA=_HnMZOGQ=bUq?64*cl}(3hQN*O7kGtHP)mGsw zT2|P_FEh=nt^kYGq~YdHXk#455yH50c<3>8sR|i6>-(u706K(#Uba{zcwY8MdqFr% zU{$`yEG7|M&&kw=zghzNCbcttY1+6%i4e8?-bG~T~_Oek$zvDE68 zO>=I_>5*6_B~8$25ijeWcI|TVwfmGYq?DpDpr5QIB-GKFB1)n%)+ZrP(im~hqP!O| z&Ro1~LRvpNq@0=a?mltHurDrxqN5f+$A}eQ5#I1zRt7^Id)`%fdaeao)l|W$#I{uB zI{Ubh+5Y^)+x@DV5OYlqKl1J#V0#MX>N?cB0A`f4=<2^}|rSg)*U z_%YN=Ceb|@shgaaM$)mPZ(_VdTk&}RkAOIc3QU2))iG}LvnHYj@F`%%TT5v1-!~h$ z6Oy9NK}7P+Vs$$`!923EXwvo3@NwvtY)yBqoN%DHYSN(FGzw0=3_nPJup*%o$CiYO zgSwtFSn1?FX5*jaijox6^-&8?+>`9sj&W(>iyxq^6@c`TUV|=&oy;=(szF0wu_v8X z8p>e{Xi0ox4gNX_tz^$fsvG1x%#v~n3t?1Ep}DCRT&(|G%#Rco?z*I-xparD8WO)$ zIn&OvM?A63aOmj&lGTa79)`pIm3tB^ch&O8{C@6FTfBv~%`THI0e89T;*AudOv#c7 zsvYZTG^5)G(z8uIATZ3YpAWeNEOE&WoOMl0#%IXf4V51l)9H1(jnHudQ4i zw{GbrY|e4(Bav+5hJQdWy~gW1MTKCK*l{Z~oKrQI1)IQb*Wd<;3*P)d^C@HOjnYGV zk$(r{nAyO6V7R)|pVR!rV5&O&pe_Mh&?EQ2GT33fH*ybw zuaQ3+d`K=f%k|Sbq~m zms>?pxtmN~H}^}m4-(T~D2#K*Z_US&>@$=h)@e{oB)T%|H{NeMI^khSc!E_3k;aZQ z`mAITnRm*hUgR5EGsyN0QvW7qvrf9etDFoh8e&->OK?;zUKuZ3`vs_a%L`Z^!1 zQ5@9;Pf&jp(+V)ph=y6(KQTYf7LtR3Ga$kV5jU>vHZJH*akJbWPweU1{B1j!3N8{MYw`F+-9Y1*wAzF5dEf8=w7X8CYsG+VzRi;eal zaR4oHu1m{O82R_MS9a1@p>f-lhH4Xo(L z4-j0fFjUa@f#hSp>`zVd5AdevhKXQLn}VJO4P3sJ^@-ka0nR?F4z8N-`(fhv;<{IS z@SCcxJipO%=ddX8wO@GIeC*A7y94rL&gC=$!p2j-Ua1Idj=EH03!QfgS0Ar?4Zcvs zxI4HeZ#eZb0wSO#$@5hum?M7v%8R@d>6a8vO_|yXoXATFhi3Oa0wPfRIOou>`H!c0 zL1(^@08~=M#%D>p(vtA(?+wQOdcThn9TPe9)I=r@y_L>Dt3RrbX!3%oNd(>Aw#@eF zMKL^+8QtNPgubzEcT^;A+M45;4SH0oQp48E37xj5{&J?EiAv2QeeMS}9r8afR`J?^ zS@Jl3Oy_FhM3A^p2vK9pO@W#lutDCN_h(jx#g1;q z9@1yO5-8p;+tOL?DJ-mNxc<%QO2=ZMqnoq|)&lH*p$wQ`iW2csGKhQgW3l&0N=o{>o#_reN2GOuluKVk9}SX`y0Y_pYGumTN#)3w z4vQXCi3Aqw$ny`(NTVi#rZikdsQ~YhP?L3?!z3*&&m=lYBG~*GWYwrnT@O|8PKar0 z!6AZ$dG!m5yU(EKMjo5XxIh#gNvo*?o*V|MY)N1IT5e$|B1SXZ@3bM;ns%-4SR782 z@Dt+HtygLkdBwvq&qsHi)#Vue@;;Jo(mse_nv7Qkg?^eFaKg~Fs-&QEAny<>IG3ha zN{5MyE3HoX+j85@%CPW8pBOV&#w=~aHqmG3_Skm|E@nsT@RaI6J>Xz?Nec^i9LcwR z_*$1JS_t{7%!*=_IEgmzt9QeBcA^V%fzC4S@0L@BZYGQ+&TfD^E_@~=YM;K!Z)z`V zo(tRrEbNPi?Vu~NRV)N~%xT9Vd|7qAtT z$5W{DQHYHcX5msc;IjMB6)Lw!g{h=m#~HfLN!-|&75CLy2zwpz;DQ(T zVO!pW$4{+4Q&iTJvto5j`>E8st0)HMF$~S+lD-@z$e5PX(`Y%YHEz_T` zE8mI}hn{$24^erRETufl2j#QRx=UMw>NXrGPxnMq?p^Irz>P?YqT=*?8}xpco0CRz zE}Iecs&77kDNXmKl1eo#zPUlkcgh!JEDVUy4#l_6L`jkJB=J4CK_~~PAo<1sC10|z z_`&sU8}N;OJYjXCh9J z6D-d=K!!=}e47$99Ri)h9u-zXP>RBi2SGh65dm}2;IMV7EL2wC#iK6TD5_T|*Amh;GJ{qvY0QIOj%2j;;Xo9kh zgCUh82&6gWJyCxmBW0+62>#j}aAZPzJ_mCdt9Qku0Rtox(7o0!`*B=Fi=^6jRPxgo z=f!vV~B-NQY z8VeM33D&4(m=GX#l{Zbb9g!rLBIR7!U=D#XxLBdE#9l^bjtqJDN1i)U%>=$bHG7k6 zrqGJXBsM404kb)D+SJ=bZz{JHtT)jD5wm8?=_6*Dx*9N4j8cJ4H(n|0tIT9;lwV5RB3EtKJ;t$RpOUfI*=EP^OD z9#I$*{DyZ9Luqds>2i7VMPLyg4$sD6t}g_Pr)ILG)2%>s%P2PApxx2nK@l-&NZYem zA0?5!E34yW+qsk(R9<2lQ{7It1O(IYfP1xl!xSNYkE{25s1`0)5EcFA=$r`f>`w~yHndcbx@OTtRV#QRWijvllOG2s(Ca% zRfa)RV@{xUgd!=&C8zH;XTbJ?#cSe3Nw}{p>?yw{9r8#*CRQ)?s?7iLbtN*>;pWh6 zt9Op@F5#x-nBA!isTV|vKPM~;&>)hdUSq;Qp{cx#_jyiPSVK__jG;!Wg#j_wrvdbe zl%D~~HzQbZx&i^U4qjrfD2R3G=K-Lw8m8ERTHA!8gnct+KgR3Jse?gJLwAtjOXU1d zo47i;yL6%D_Wt|*+1K6DyF~W{Mx1QW3aNbck9iV#Eb^3}%Vm=Stw~bzary??O3nQ; z4wxOj?AL%bs>geD)8o4Pk|-Q?YLcI3X{+8gtOuCU^ThQ$yKX%l{#@7818N`noze-e z+A;6Brwgllnj5hZDUYG-Bmi{hmu+^gA}r}|Mn&>DR;7oJ3DTfFsnN%_8e*3Ihn*Fm z2!UTi^&HtU=BN{)4sS4EY8htpGLu@sd6E_ua z81jz`J+F1tQ=|2xvdgj+<{jW4U3t6K6G>+L6pu9KvA6&_O9&4J?Qg);rKgJ%l(0Bi zV6<(~S_4|bI0x_P?0LSYX{bh9oC%B&@Dnl>A@;U>z?BEk;p%QkcbO3LrwbTUJ zMWE4=VVBm`8!Q#TMjv^XYFHpLEtDQx#eNq0b2J$xE`Deq zqOly0VcTS2u^}iCylws1ZIBM%`>b?zKUVkGEG+qrIdk=}Vw3sM^&;^61@a|_kg^6W zqb(o{S5)N;@dd5Im~!#|hE)HT>xzJz8;btlW{Cg)kSf#vlyoqCxBd%K{i{e){GawQ zQ6Y6j71939HkI-Jz@~o7CH@DV z`oC2;{F_<*Piez{=o$CpHn7zh4{Oj?3ss7)XU`J!+jEg!_LRVX8*}bYB$jfO2 zq;<1nFf0pGEEj)Jmym5)TL`pu9#;rBfdCL7NY4GY!*z$H)K;HMo-Pxa>W4@7>{XSv zvMg;I#u+nnyAfY~Gz5_pV*iMkbTyb9K&Kj8CpTb+Y2PrQ)_Fp`5-1=ec-MZA+LV<2 zZ3F}$D2D`aLIMK-p6{gZ@U_m8!pKE@a2oM1Jz<}xk7lZ(etiGr)a5Z0V05yRe{<%Jy4m;laadv>d0CchlQpbiE z{e4Kg_u#uA>;l_x^61G!E&%hOda&ReM0i&KfWZ8?v=`bvK2WX=KYKo@h9TiR?rmNB z@kW^S=^)Uh*ykYuUB}BPtDjvmA+Qm4<*d<81;Ee`6(I&3>?#eZ_i@k(f;+r z?n@>A>mKn-uItFBP}Q-qc?p1n8?JlH1MIrRlt0>cNE;Xc=#vIp4ZJ(s3%K!}k4OMc z-ec;E>QT4jfxriy7P=n%i~5nRD>DBfpHs`zf1Uo5RY)5p7Z0I^3`O4zxCUs2PiI}% z8CQ$}#2VfykQ?fKX@eK+=Jpf1$O^cz!QnkWaC-}(AMrb@Kezd#+6y<9dtF&DfAp8Z z+~+~X3p*l&l^i+5w$HCwr4YZbz3UK3RkTCE>%(0inxHe#E&zUIWe5T)lI=I2kymv1 zExxH!0uY>2K!)9e!-E50?$58im!pw=T~ibsTK#Q4;({Om4uAaOOFkGMJt;NzcZKsV zv>wB~FZM5%FN9F=ek2PsJQGSh%k-qw=n}V2Z$0VFlH!P~6aG*oi4JFd?{0AQVjs=t zKc+!1R!$HueSynf5l8EOa~n-mZ{ITCQXZ*aQ2XpLqse}iT-ka-tuiTw~1cQN^Mwpq9 z@OebWI|~wBfIBQY>n_*@#g$i>8E4SIo+fl)bm+iAEpVQc`Y0g=Lm!dovB_>s2fMQ) zY9;pZTxrypbRL6e;h|6m94i3V4?GkS{`1Q^YxX)e1+W#jX`jS31#}KuU{;$-F`Web z(&MQ70#qxDsz%5+9Lxqvw!BT!7t)&8bzJL6tWB%sPl-+wbuz8Yk7RSNBtfArs%4y7 z<`v35pv~)-0l`_I;=L0d1`MG-TX)M{{6JOp`1LJT_HUBhWf92;EcZJ%|kl1iUVWih?PqKWg@ z2!pjFavHoNvUA)!W=l>jY~A?qc7Cn&4iKRuiyH0K=QVoTf*X0Pq9>gpt_Qvb z&@fy>)^lmpn0H!dtYxC2?$*0$*UxX?UgwBt;yDTlhd&tkmeh6-12OT`Q0VpNgeW8{ zn~(4#SJ+QFp%vdw$1JyVz~{yy)&%J&YyM!WO+`l+$aUUdKq3%!df}tLWTDgCinCvP zNxBH1^Gg%93h=83QZYIqzukI_E|J5CxlOSsn4T z9JO9w^lAwTV`}w-D;_BFm@E>Y>drBrHr(RJBr&JENw#$Q!!Lx__#8*(ogNfY&L@pSz|W z6{+58tG{Gs!1G)CM>yDwWmYn0i*z0hoXm|#YgX+1aH40rVn|QM;~;1*}8 zYiX<@74fv|{>f<&b^)=8b45Ql_@QC)Pw*5e{J zB$>T`GAe!HzmE`|8OrZnehN}hyA~u9qRpU8xlv~&eD7D&G8FNo^jIw;cO^QhwNb3^ z+7&KyNbJBO?+6RCE)6{EPno#ut~evbocH-^@!5y`M!X_{ov zOmn_~$|Xp9=#ghp9?8vl0plFSs7eZFsj%`{`l?dERmPP0r%ogW_h5D1d*Oxvdu8J` z78H=H_I}3U^dZXvk zjdE0mbrjq~Bbim{%*|pm(};WNnbR$^K~q~s*5yEG&oAw&A)80(X`v<3lRrV`h2bkh zAw&$P6^*st`w^1hjTtY2(VQM}s_80;{tVZa^-s=1mjD4bz!@|a)Yx_KK{2=sN*CGn zfPoxt8!W}7q?Zbt>J@|T!V$1$mcoS`w;yG5ktYI;wU-Hido?WiL=&~4*GR_1#^MaZ z$$m5E!TVWsOC4`e6MfslsPVLu#e&oB!_o0?5jRllIY2bKCs1`|4_Nt)4bCznn~QX@ zm)qDgG%;)2Qh6$Qxi%xI{TdqJP%rc)gbkOD2wAIwOaVGM znshy|OdD(H&!fo^py7AnHw)se?0VSD2fDiS?Xz_lqr|c61C}&tT0v8BM1is&tv&b@ zY#Qe6(Yx|-z+1Xh%Naor8%694`*yMl!-zj_ewRLMhpr!90qkNYWURN{j>ds_{;D@n zl7uhT{9u4E$x^XQ2}yUn(?h$UWT!mP)7`v*sZ)9D2_f?sLauNdh^%n?vTo@dNtMTOi7v*F29BCm_a9rSBM#uk&;AY z^x2cpPLWCm>Nu=z++>I#K^$-V9nmd3)CSN(QY-~lv_FMG1xwNX!KMF8wK{xp<+|9Q z%esX`0CisHi#SvF;jCK<(}<;sgbpr4|GLl$(K}3hD6#TCxna?Lkq=T*@{USNWy;wwP`>CI^zU{_S6RJIF`Z9Fr}Z z!?-Q5NQXaCb0jDAHo4-G3Dx@2*LsgNUD3n&h=ag&KOt^z&5B)pz@C`e6| zkgT=rNJkL2^vew)h+@YOQXBO5`+3T&8-LP{&SvvwO?P5i(!idngum2)4_%skXf6ue zuicX*r3p-38(+87xV>C@wy^fF{NaBpUpDPr{iD-yX747F&B;`O1;;+mk6Bkukb3eQ zKswKM*6du=!dPRi0h)f{7dvlT&)Vo#?yL6Pz?A9Qz01*t%thnfdSW=+q(4%`t7Inj zPU&1A?kwl?`;4gSvQv39;MXBq=mq4%%OKj=(1~dX7HhCIRBPTx$K^Zwid~K?qp~o%=ROA)QEA z#=hM7g5sg%_@A#NCbg=un+mV`c5P5|uKYp*}J*PpP{IQ(cNG=lzSaN5{{FqF%PP%|u02pUPdDWNvaE+4!|wnnyhB zxQE9Pivbm_5n2!>Ya8VVZx8P=Ne`nX;2X^a9kea*ivg6Ngde!$RbCiApo2rhg(_yU zOi!B{qPW0_wcPVqBUiZVtWPg)Ee2RPhz*=QA?n^YLCv%m+2zc!$_gG`h?V5CA@0Xq zvHjXGm~uoajYvgp>r!O^;?+@G=j7bTsM>Zzj<@)35D=C`WH-o`BsP3(%hR`Qo<64Z z(H6w>We#sa2V>DdvEm9Jw>?JYCyjOI+*=Lm0KXjK1!`**akTIE*@Au5Sw_0=&~x;G zG0u39?Oa6H>yzEJq!S zpeag{;l3YBM>NE+l#LElcnFO0Xz5`^0xEN#p1jZmuv-g6qD~KZ#W>{XY5}HM&4X*0 zS3tf!kIsNxba-OCjGNX-gch2L?PEh%!xByg4#PIXP!*GBfY=M;b$MYVieMBeAY$O| z|49Y?8Iid4)Y5@m#g(|3zCzkGcyIf<~7yvhv${auHIN!=w&)f7>ap}cw zR&(;T#c2!&)!T{Na@~pc3|dvsU&b_#-I4`Kd%f>{L^XNVBtr!yreIJgvgzP;?L%PH zuxL^%oIR~s_suDq`k;T!*>NBSeOY0xH{O*>o4hkIH%n>vNU3C@GwGy<7L`$jI*4*Z z1!`m8ICl4^?pl$}5q{!DMn5(l=apBYW-(dx>vWgpyAh9-H%GK^g#xoMiTtAf*t7w5 z%IYYOHWg$a@B+9#dpmAB9DA>I?zP`gx!0)Mkj7^>(sb(C*(W#Jm+DB2F+&cL2Jf2G zE;xVu`?j)3qf?2=>CVSNvF3o~PI1yIaAsEEqy6{ZmHXna+1<|+%E-@liA>8&P;2-v zePVPp{&9kZMliL7XHGc01u#5bMOxr4&Fw<%S+H7}@e{S4CUXJ$&l|{l8qdOdT&4L! ziCN6K1dEefy{$YMJQ5-d+z5n`dl)-a%DAJuvYvhy)?)7hKA&>R4(~@5=%OYT5Gl|r zdadg)Uo5nhwqC?vZD#k`F83RdNU| zr#!*ei~pRsEIh7x2)2<=zztgHZ7mWtQ?q-c>$@jD6vOJQKvf+BE9$h}xW8a!D;HX# zznT5nL^{s|k`J<9VO4sraRWga&A2)m`?Ec%;B?3RP)^LWzD+J)_IL@qyN zYdM&Wu!f;{?D0+C;m1%>Y6=6O+)FU`SEtJO=n*77KsydS-_e^|E56|I9Zcd*K z(L;myxqJx&xq-H)@54#C3xj_(f=Vck2;`(o`;sXLHF+B~ZsE@ks(5u}0S-BpX|k*uscLrX<^$PR1S zmt7Dp4W?|QH?0IdImYNZxdO$qf@CW3qVWgykUdl@oZ(bhHPJzyjs)M-neo<#A z@!V9Qox`EbJGd^KbvvZHe!vwjv54}iL@-l} zaNAJA)#i!Xmz$+@`n*6Q+qn&BS@2B){BHBOp*F%&QF()MNwx3J)ea_MXO|6cby>U} zeR;XykFnq>uc(JMrzwo>V4f5{jSMxfhyj6gRU5@1AF`@b=F+axbloC{XeJI$^5T;x zCt&7yOfDhkdOY^U8!1X4B~P0+$ho3VJjf;7#hrP+3vR?TRAC%>)`$I_Np&!WK*|7Y z6N_ZH+ahohQtBI1v7w!Kersc{#Xhh;cSku{bOU;Xqk!o@*0v5(;yeXzG)<9&LWE?4s$X zH|gGyIuRP)KV;NCq8^&*brdFd_uah3=~7D)&P*`f7GolP zuJ0aAdUxc66y(^@$UHSu%QlK(@;1K&^|fOfhS^+IVeu^w6RRc5b<#H6M|z(?#n}c{ zTReMJ0@CR7^es3*;0@=$zJ}p;1y999V-?fNujLhPPL7ZjGX)b3D^(geGs??Q&)=J= zExnhq{cds>D^Zt60!O^fbWO~v9b!P0v{-RkeWifn$w0Q9;udanQ&Dk(n_+MC;8RG+ zUGLT{w%;DbR&jIB)+#%^tJkwN8_Naxyo(Cshm~CDqb3BI9Ua+Em zEuO^5F@h2V1^y!mL{r`Hk?u6Nnf_yj`zJ2orB_G=&qubn{pr8G4oe>EZB+O;Fsc<( zAJ~h+{F!8F6CM7DR;fN9+T%;t-7@drT>C@A&@&cp_ZqEsE=$~_sTt80B%-9wJ$gS# z{_Et{O0SRm6;)Aua>oJjZgA6FrSaT0Cx1CyGNB1bF~T<|FY~!h7nP+BZ!!5W$f}*- z$IEpTjSxeDL>@zGNDs$ru0m&JO)Id8Yc+?? z7t>G;`TSw#JTIl4s*!SM?o%PLaU8#f|ZPEbe|@Z zQ%XO%7}k|S7#T6*1#JOLr~M*fY>HaQYxiTAdn>OqZ8v}p>8?xMd8T#4KGI8N)~ z1J8OAZS|JRsc|_^!}rblIrUk5uWeR7wWxQWb-OK}-r$(TI~6=EjQ4c|Nb!aj%1zD> z2pziO%>#gF7DP^=i4iij08h54>~T=FNH5~gS-`Wso`!OD^$gKnkPs%-8T)CmKvhnh zwL>()1BP)ObOn)igqffV9#HO`o7pQTs$^Ttt^ie*&7KAwimOc8^DaV&qr@=WvrtEq z5Lex@wKVO`Sy!xQ-{j+#`TL=O%Wsw^?IPMu;f)wb?DuF7-)N`prQrZcgcXv@|7DtK8^io3;VTCe&UuC+KX)MPi$ubKe&dUj70zylxOHRmp}WIbvZ zVGcwp7!S>@85Ld2QaM6~4_3e5Op*`l(h+_nb>)UdNF=iJU;PMQjjtn5_amKFQ5;vo z<P}c52kU!5YtF=oxB8=2=WgepgSPIo%1>+Cr5=! zhUDcX`pFKg9&8M~Hm*D1fvg5~;=l2z{L-;ONBU&$B*BtCX_~1%B^cAtQr<|G?;;T? zV(jc8UqIcE9HQ{5U(*E0_%u}tg8@_h3ae`BB_ugGz?V0z?IBOTi#4_k@<+KTHBBb- zlEE~;K--v0q2G#Knyp`-lX!v$Szoik)llo6R)oyM6%q8@H@y8AafvRV+2u@H2%Ue@x;9fxi!IpPYy zo_9P8c4NPya?u7O+MnT8-sz(nmCk1}!6!CRQpe&Q*$u6C!)N!Us891cxU&xSREvmh zU3Nn|T+=TFD#R~mEiDVhw{q~}(ZgoCwdmbFkpmI|&KH@uZ~_n(L2yuHRLc zp>+vC-RGInrtvVTGn(;*0L)>ORVBA*979!|P*tCChoSXsxm*d>wcV|>WfC^peEl|4 zqzvYI^IR?=qg4c9od!N1VUKHVAt@VFGAhWsu|u{TE@8xu-qTPuvMegv!z5gd2T#6Z z+DwCR+kHP{63zIiB7#+_w4SAkZAMl!vrp1Zj+!=N1%UMjR_F2SOvA@XY%YpDzRjU1 zS}HRO@nug_q-#L#`+n&>-NRwqKKPxS`UCZ_);uo*-1d%?lNiw0dZ(`F+`1n7(W60v zW85ZEmf-g;@ZetFYP}-Q>VEDxZA<8K%F={S*SY!zv;d<=tR#2Nr}9?vh6q%f`d_(f zc4L4g*_UP86)tNe>g-QJZjflmQ=6c z5_Fwt=dJ}z%E_jk8I6wEb1d-+fb-zYN3bm{wtM7D7Mqkh=Sy%N_4XO@dtu_R^3HA8 zc$cxq<;Hbfera`ji4aH3Js*Cz~<9i!Q9naL4^H~+10+$p=A z#B3_F!D<=g8JqnVgLAT;>lb4p8OHC5gh=FyQDV>A;4+Kt4^HfcvWwoRfZqjI=?((H zCqQ?e;9bpP$CU-HDju$H^tg2Ftv+V=zgkk##4+5b;nuoeyWL+yCN@y2wQ~U347HTZ zh_X$(d?SPiB}0YMo(v%Wxsd~mpG;K70y}`9r#IWLdm()gVdy6;X(CqBzwERak((WV z_Ss9hOdnS==0kh0BNtZm+IgTcz&~X;0Ue}N=_$O3r>W))quG}SKy4;< zhbDx;`XuV*Z9S>>f-++JBH?HS7$W6oMr9N8ohuv0C4nz%vEprUG|!hHf6KAAz_Jcl z?IguL7`!G@oPspsYv0AXp%QP)rUkng%&{KmJ!Nq2gozpJr~Dt_yUJLh z%0%%R4DNET6coiRtX|!*S?%B?H9Pl4Wp4sCrZiS>RaWIA>d5R?IlE&314Xhr&%C`1 z*}Y65QYL3vr11c}SW~abQX3IL91jsAtR68=jgn>2df%)@?Ty@2fCb2#nBY0~rv|J< zPO=W4BQJfYQ;M4m!S)@;Sz-}jp1QVb+hcyq`ZtsWHu$qS_m{)piTmnlRLNG%k2Ahe!USug>crw)7xq~Tms2AmH%%ugD?H2* zRa|NLCcCgMMY;E6dR2Om{dxm*9e(?W$fi; z4@-jXz(ou+qeAe9#=aV7S5nittTccL=7b!~Vk@e{?{8a%w`sfD7FD~F4X)%A;`Mcu zn5~0c*hAv5??89k@TTWOI+_n^PH6yM5^2>Aa2|)X9s{lPxUCt+N@R8V6v>u(bIDmG zAJe1X1~zY4taZ^L=~HBiNI0yqGJmIc?(J4oY~fvYyQCX;vwZRf8LY_-D@4B3IZwT} ze~*p2loGc$?KUv&JSLmBWUCuNJoGA3_8~#?)yl#I(blqiBU5-%n^KeFmnmDQmuL@` zm$edvra#;%YuO9ka){?Obm|+gwPb-AHw|IxVXK^)ozG)s7a;l)(N?GMsQ9|zG7BML z1qRwW_ao*NsVhPyJ>D6Ic9to_Ow0hB&M}Kuc0}v!d!W*s58fZJ`29})+6 z!sRtyRX0LsLvlWn*&R_#4T2y=v|I+=Ea|TQto>MKPj6|F#u~(h1iRyj<9Rv_*!Y6S zc<_lB0K_+mQ>FsyLa2(@I_|{LDV)YVQcY-qGxGwSLe#F=y#OOtdQ;ZdVg8&)anS zmQihYzwpo&2h_Ius-lG()G2y7%e;oiShb~~{;;d+G%hd_2n(~40Ek-i`~qYI$?<^3 zip$&);D!bhOHh`3&7`%{llhQNRR)^@^piM4CSWyiC+GaKf?I)l(Ab`ON2;ioFKBV| zwK4?#4pjrW%Z+r`H>{c!+lubb(YG#6Yzf|Ya-ti;v=obx&wbjSr18TK2=x=ogiH$r zt;AYE{vNEQib2eXoCpv31m{YNUhgzH5#(z@-AfTqnstY1B!q!zYdFOLCl1ythE7(! z$0w1srd*@gywQP4ie4T`kCkGpFw$;Yz(EKO_7i|??&sm#BcsLcZx8lw;Pj77K^S%v z6~>BZGE};U9)5Z2YlvuaD(m{Ijtrp1q+V|C-+4;kWiH-<{qnegfkis8cx^dK-$Ck; zGKBvV(ENps{Xsnbe+4vuIe$p%IXDWK>e=Jb(SJZ=e-fI%D6@YMn$jx#;_8zBMrcYI z8Jhi9LX-Y?!t*ae^S8hs*ZT*d$@))1^H=jvLX)2M!vW+MPWd~b`F}Y5zZ04tbm#Bx zA$0T~jv;>{n#>=R+}{vQ`VaVyih-UHkByBPkB#|%a1Rln5u_2Jk)TnaQT!V@X+mR0 zV@_j9V?|?4V?$$0^9M8OLgV&#Uh+3w@1MNnzW_c+jXzk!Uyt%HTaaJTUy;8)zu3h8 zi9P(a*B>n5-}%Eon8-ia!w-V;7kT)x{L1#n5&uRW{!TgmcK%6q)bq7dP z0+80t2%Xr7+$;z@E8rS$TaLP1kXKRS1WXKYqSMzk4iN|n4L_(HFYw3aH{MTstfWYy zL=r$4ri{9G+rWUdpCItopajMFb!h>D?FoS9c~Oy2fL=F6aF4@2A$bQx6GieUXyaw@ z(t!lYONIaG#`0-^Az5m>% z{rKl32rSH26fW{L-5lht+8CHXj%f5;&5Hmi+*~lr`jF2a=U= z0{FrNtCzrsh0knR21@ob6*iZ^sRK{JBLj#?R%P#qVPuD(kFAgX!g|saCg(6%WqeFr zjK5q^-2FJs^Sbz8Bc*jy5F8AYajzjEosz!$4%{5Tz{$;W z2|q8YzdmL%D7MtF?9NkY?ZN3FxQ4ULay9IP^wn8NP)LW9bObjYH&srhqd_ABqKy_$ z!GWC{nWHoz`CHVy+m|@jDW;z7cQQ&@`iC)FRTpc3@h%lGsm-^}cDI(jCDid(5QhiD zP42IB`z~I{X047 z5YKzse4VZp#pm|W1>{P;aA3IG7$x}Fwu@m)b-F6EVpTY=ld@LjZ`0LjXwKG_itj1+ zqeGuWD!g_=TdXh^`vkd|NV}j~Fjnue8D`~IV)JparG2(-TKTdbiw9}duKI4EY{u`X zpqd>|&q5~jnI$Q{9yQm&UGH9nnr_u_mT#FG`8d6tlko;P5KGvf2RXiQ~PEaED2N$&V0H+7J$x@BanWU-0j0yHp zd`!qDbaj+YK5-b#8rf|IQ!#>uaJ37iYM5%~7`c}%_5#n$h+}7}+BK1hirSaVa5%Z` zBg=TGa{)-thIvkN`?lsQCu^?z!XHq~*Ev$?e1_>I*2_toE9_>VKpxV4E{-f^%z5Yb zf$0&lqn&5D9!pu0=;Dg{1}}s4$s@Gl!kBJmZ~ycA3{!?=t*cTjOLcpT!>(t--eRe;%`fxAFg#X3O~5Q!@<%{ z`FumK__&Z==al%8ijZ?Z?c&4h?zcDeh^2lHA?rvr1MVv^OY|_$=es!xP9EfTj`NTFvMckd}@&%tvi_jE5p;W2q~8*fa=Ou$rp4UwO1x zg^VjJg}sRB!mstX>3q0f*QPGDExM`JVwucBqpKKYA4hAp;LC_x1;X#eV2wQBH$jgj|f{441GI%z8u)9${{>v|b zPj&D+x;YwQ?#d%>cE8;33Pz)Fjq87 zgwl)wLnOgm(y8@@3IJiozC-M$hin;}<@W?7X9=uDxW(VxXSr|}X~^*KG&E!u`zf$! zqP0+K9frQuab-lo_FWF-h$&hW(VQ`l=OuTT{~Pny4)pR1AyfTODt@A7Nl*GkVTO?v zFO@OFkRwO92&3p}$S0&6?A&N%-DtPV(bgZGRD$1|*PhKY#o7`|GWYwhwvKWrQ8;F) zl>GN_uA)3MCF>m#!l?)h?wLv+mbUII8)_UXE<3Kh71(|hPYsxP>Br=&1QXlUbky^m zxT9@CDnVtZekqdYmF_N!uV17-JasTMR-Spo#mNOi%Lld4sJBD7EDTS28RzNr zP&$|!jdF7Wr78#qsb!+kv>}6 z1Sj-+<-2$(z9b8QOOgdCP1k;9bZ<+wMHg1>K(EjUh{vNbj_j1^b5-4$PK`5Gte;1y zu|Cj!?jL03^1I}rQeiC?PoDS5=AR8vecVSWBYNPkdb7)g*QAx3Z1%QtFaz;V?&T#* zSj~!b&ex+1#;NwJr4G)Gk1zr$jCqEZ&kG7*RSmg?Gi-`0x+0~+i4rn{DB+Zloa#K# z%TzsU!*tAM{Fxj?%E}LWc(tb`j__z;P6yQXmtp5yc?gKx?cYm@og$jA!_F;!DiTi` z?16x7zNMbQH>f*bmlzPNYqXm}8Wq&tI(Sy$tdz<7!ozS7p22C#CvKsDZgOhIZ`BB( zy8p=i;Jv+%=-uuPJjVlO>2?L|)hYV7QV?9cAnTC=J1ipN`zyGXwy&5bmIgyHW@Fqd zU#w%2NP1C>9dm4>n%o+G3|A^`3Y^xmeO6VscLtiW1UQb|JB}x%z0E6;=!2h8DLq5b z{2btpKqDsu!#3S@g-KFAA}xcOo+^_UF$QkkTwm#S7Wq|Rme!-FeK+|wrb~&@$E%K9 z3x52d)oWl%6|f(O?uVs*EEs9I-q%X{y=rd8EX!AF#pO*aPb1|E%ac8aI%VKCTl-F2 zev2OenitK6B`-HH38{Q4X`2L#zO!|#-r4>OkmSk8JM?`j`?M>ww#`7Y%*Az9oN}q- zOxjoz?*!Ur+Pl1$Mi&XwBNx>daG4iJHNWJa$Du<;?TD`{fX>UPtPJ2HwQ8UyNyjgc zi-6gbnT%uYw&$MQ$}W0!)?qoDr>9mPHe(7B#k~=EmL(U#FAX>XM*eOpihR!?_C2Rc zZ4>F`ZRLBETKn;w7^Mur33FoPoN2bA*ba-{jIHCv4jlQL(vfuIPd_(QOz~UpcquZY zYH@F4xCWIEn~Lp%vL9N4^)b_A4ux8Kx`)0;k4KE>86;4id#~a0Lz$y=Z2AttJl^tZ zA`(qw!N7~p%|eZb62fYiu!|cSz4K-KOk(p95j{CQZTHyCaEXIqe^i;W3FWNhFsqEU z%Imtk;^IjdHfasHoWb*OC~~V_Ik~>B6#!n~n0*E!g1!4$9~2`06APu>22;UJ`xIsk z268~!^mwIO+Jo2110E(diILHrv&>DpZhlf@nuFm`Ef>tHWWTg$5msZ?0ecU`lXLf^ z6|fi^VfOWQ`{VzLlKVuiV^tQznFylt$$_WJaq7M4k)`Pe_)qr*==A~;U+d&?ZufUH z(~8#=3&YRw2!0q>D0)7LTXC6tm6=E>9Qi!(zUgedfAdAe5Znm<5Z0f=Jfgz3t_uD~ z;ZOfBFUtQH%1qW@MdC*>FKlN2uUensL&5lG;m`EZ_@nOsu+sdux}Q%#NJLVQQb0=n zUxuE4(_zy8yHn^****^|7H`)`ca$zS>@CH+W1$M|BsXXy{7*t;{W9a`f>E1 ztE9wY`@*OkDfzn{ANY^@8voh z!>?QQ$LH79|7rQN=w|!vvHfu~f1lzJvi`8{G_yAOxPxZK#zyu=)&@oncp4vxX{fDj z91V?(@fetB{-cL@3@m?cXJq)TzaL`6zd~&P=icKnG5@i@)`xW{-p9E7)m!?%>xBQ9 z8K7ff`rFh1+s6#Rf1etlqh(;E{okq)6OAsLMi9v11RtXAm!~IL+R`T+}J_(9HSh( z#Yl(21F^gE_qRON1gywKd#Bj?B+3eqjYkP3;u{iBf;|Dq{5>87EeoUy2vDnS0RTal zmiM}XR1+YD7Zq;?+jK1O=MY3Cs9F=y7r%Nu5y!iZZ%9~HcmVA_{d3mR?>P2g{93y5 zzACh0!T^$!7+c_XK&qdtCKi?OE9-n|W8X35-?^GfG0{rRH!tRIe3%Y>K5MZ0c51&< z__DG#H34MpdWf~twJF8TWbMED5fp{hlZPN-w= zm>YrF1~db{!+-h^6fOhK)%&1TT9{KvP)g9hJ8-zOKY2`bguHj9b)e5- zkqsj1_I7=UE+Htty}muu#J;Ob^iM+Sf42XY4u+%c3xZ_6834n9M!N<0U<F~=(d zFoC!?@^cT|E`STjx2_jf_mkg`_qx=T6#(Z2+J)}TiWl5T3mAZwSP-NGaL}d3H)*!_ z_%{cE_lPEd6BO!7oUfWEKHn?F(mSoGJHE~XI8z3F{n~f_4Xo38f7cMq@df*`JHuZJ zxatl25^zDQ6NTEj1JN6xg#`}s5gQy}0Y9R%BN@#2{OHmn4Q%h!91P@54p5=quaVCO zjP~R86VJHFv|6aD@9)M*rBD;Euqvt*i+=Bu;5cs`+yrP>BH^7nGHkwY47&l3ety&) z9z9Tq!0atuYyKUG3s)!|CVK&8)R(EcRMAhV54tr&ZzKy~at~6pBD?Fr*9xzx4|?(H z9T4?dck93{Itx_UD9U%d^Y5&HKr24`?{1*Ly8hOcUqPL!{CRy`;P2{d-q&ma7oHM2 zAm%VjI)YfxXq~`QVNA+`)buT7LDTMW4V0x9Cpgf!i~D2kXx5{MdGM z@6kB~QDgt|Nl!V72hMo+2CTa@?VUFX`3Cmo82IBL%K2a6yN~e7M>u}K=G*G?Nyf*a z!^g1S)ZE_v-j^6Qd`^f+QO7&B)-fMDY-q*Af(l?MX?)|MoW(9WwH>tqy*u8?YV5yu zQv=WYyjb|I`o9}v!kr8Q19AB&A3)W>QD#rDn2l{BztIaJo<}Ed5L@w(6f!&d9Cv~z z%X|Y%j38rUD4RQ8S2o@OKeAi$+bCFhHK(+^4FHB5*7RIy^tc$IcJNAu)vy*PM#PCd0V%}D7ue% z5o%F~b9qzLZYt9Y4SU?0oOHIPzT@4B?r+-E>9k-w+JkaDI{Rs1-q}nz1+n1_0jA8-|1+-7nQ*kNxxK*RpU)(9agC+ zkc~j4xNcqW!tGWp+H&T%sFFG3z1J0C5cj~PR?fK$bdc|59Q3tOwBbySy1qzW@cbFw z5teI<9yCtxK0y^=agLtVcuTckVC7`2XJn`$!i(jaU9%Wj&7 zG`b5YkdMT(#R*v&L-Cw5Q+0Esil5aK%Ev3 z1xi}MWxlq=GbdI&3OaH>BlUDw@(DF{g4&UI^hxQ4rKIgDd1hX5oEb#Y+ZL}3bZyjjIp{kC@)zRYhTam*bz zD^hb0q5fLT#ij^n%=-#@wlx_`7jcC?)Y!&X$)9UTI_xPhaG3pZP zv;g5zIrv^%U)wt0~=??CFEtCfJ%ypBljpOrcs-j z2^O9}15P5D%AtD2r{PV2^uSg%TV!UWlp|Bboy6p}jreHSejAXtju^&1ta>P{6!ezb znY@td@R&~YPJo)O> zt}5Q>@qCSrV|z{Jv~DX4729z0+1}cEfvOF{Lc5KNzj;)Kyp3+pBTrsq8U?3bx;YXW z{AUPFT38eMIVv_Ax8}HT+>uix6{#LBhHk`6cB3q86gj>hC|Yf}kO13DWUp*lhx3r} zNc6su?#kI`bXDKP@+EeDgFzI!pw)p{y6^j8Pu=pxu~%j|aQ!50KgXEBmVisb5m0Kt zAX|6WJ+6>GZ$$4zVby!35_Yykl&YE&LWss-%__4z%~=_787Iw9Qfy78*rKd#rJ~Rc zR>^PsJriS+2MO3AMc&~Z#4ZM%3xdU@_xTzcN{AAA<^-rj9)Mkch3PU|z7=>rOzTlV z_e+Jq?d=Kbikff2W}bSC%^B`j3HbgAI2y7RJ&{k0v9Lvk>(ueFZC=Vcx7u zyrYvDx0*ka6v_yT3qb)-#9(>RC_n{?F(y>1+{7B=3|>1kIl5_XXBVRp7yG4jjp7Pq z#Ti3?qLZs>)N@9KAKq9A%RCTqXmEpPw8M4(zyhNBoGD4#4;_W&NJIR?L5-?Vm2X?* zS_hP*93_R_tZQ5#aGw`prNgM}Z?kb@a>bssgJ1At9pca>oX(2Fz(dsA~x5nf2R#DtBrVee)(|au3sWY$Bwu_ED^S0aWblsel?sGhjs2|pshtD8y zI2-0a<{3t>W`^03lhf8K{e}1#LMZI8M);s)(Uzz-K&YKJzX+N?ZA7kdBwadjV2lf; znkWY`fdxo4O@a!J3m@9X(ubiMR1oxipLd6H?f_1;A9Nmc=a8MlDy1mJnqYYvgDYc~ z%0FcGOdd6MnnvT?#X6ohFTwjDsmCn$dNCE8YIw1UuwpFJ%8VU&vR3Eu)z3VcfRarY zCk?9*-*V|Mt#r&Tpmk&TcX9;A8EPYV8~Nt>WQl zj1uPMJDTv4f15$2kV}7ciJ_< zc6bPNjryGJdoF=&yMWa79C0V;fC@7RBi;*j7UimEvB35^T`}ouyifMk5DG7r(J9kI zto>dw#o@Tm+j{CpS>BJ@5YnyhwkiaswLj*#X0+=MARjUS7`=9~CzU_j#L>O@iSOQ6 zSU(-mF<|8zrYePe%x#l2y&n(y`9`PVlY_3Q>J-2M>Nx7gXO6gQ0Lw~F&?cEVP}Nbk z*S)VM2pMBKgVc0!Z$W{_G{KC{zCoQpxSywCAWW=R$to&K!s!uGQ%6;UI9EE6&%NZD_YW=)BF&bAEWFnVN`p^S# z9rMT;WXFZ1;t@5O^QWEYZ#B8Ys|igq?6A!?i7c2a^~T^|B_r~9&+`^m2V=t1g`QL1 z$2p#LV44SU!iFxO9Sz$uFcmSL7N>A9y#ga;UZF%MJ+)O?P^>@c^(v_^F+P3fB2|!BCPxp zsFyAG;swx2sqDkEYKgNUzJu&YRjsIaEi#CPlYLFw=NC{_X;Bf`vmS2pr9j;-s87qcd=$t?Tjt0w5tE`+Un;!>OfeunX=;W zB6}S4+Q`AsxGSd{L$tTr$EGjRfZunzGPA8IzmyonU+(?6=jhhjxL*=s_T6e-#KXfM zl+X(ZO4Q=mu5uJbn1?XqxQLg(T;$52I#~g-yQQHO$Mc|PuP@5EA#=aSrdO&FXI*q! z-a8cGkPVxoXZ7~6T9=M^xcRAc6Lj~|yQKV{9_LbAt9Yq}4a zc{6;x%WM>4YWFcDKKpRHh;ro3l?NzuUivdLE8-2rzrPoA{<(^vabaXx`u+PY6G2DH6DpB6?G+6*DUy24R* z1B#4ZRboiWb^F>+t>wVPTYsK*jAD09!i7>t%2w4VD%}#M6+`9hTZsKtM4`1{08fK>(T0%yF7wXp*DJeaQ}?)XLMg>J<(Yh=k;*7(4tSE8!`!wn;zjr^S&ldHL+FeR=z}H$TduY$b3af4I z-7_`$G)qi-#2iXUb#JhV2@+u?vbxhR;BW@SKi`_Mxfpi0kF)GQ ze`*IP29tesMg5thhA(q@6pe^dX1C;#!O`kohU{82S~@U7&6t>IR$bOV*8qLlpmrdim0X2%Uo_)z66goXAy?u}!tk%6GyXPhoF=I~U(u_S=Wy?sk&E2j*NCV-tgggc#ccBhL38}U z6?<(Cui7L4ISBPUZRvLDhexNF@Zf_y5{|8~hw8yq4Y0Bncp0WEU40av{mHZ@EaDZF>}=*G zHvPOQq_S908YJvBgXQZ7#*z>|t7n;wlqoZd3o7YT_e_JhFTa%AYX*G^BQkJtz**k* zsDIUaWM{6tieDUKqic0$e7hGuk|W3qbgDqCdWfurqU>QjBsCc5o>BjF(|hBBwH6nc zKWX-Qy=P12pyWxXlpxx-~V%0sv&k5m!ZWW}756le}tGajdI+&T-IcGGAdshI9Yx$QdWgrQ-i#w_qnH=LRaj2?2>Ba4 zS*?BfGxQH}b__Xm5_0xNVv!p!dgqy$*XU833Jd*3R4_l-7$Y&<9LE>s`L|`eq52~) zrO7>wEagQhV|L6Sh2mhYhy)%NWi=p|McSz}L98lmuPJoOHl`M*M$VwiTdyW7qwjb= z-LZ>F<6+uOnsH~sL}l#8jD7P1F$rH(_7$l=8(wBgpk6t^e&^Cdq0hXjw~y?rvXF!B zDKIB)gxIC=xLkv^f6xXK4oiV16`OG(RrWOHR|>b*PXxMi z6>_UuGfq1?oZuh^Mn`P5Ghsq|)>{#%-K3jk79YWbrgKymPYt)?3>tSC0}deSj;CM) zn*!ZO+ml4~sef!IIh~w+b>LztNv1gFdcrGQj=zbOXWcuLt;VMpfnDBe%$tt9t(vEk z;5KU~HMH$k7Y}I|NS+>sW`!=7Lku&Ra$8~@Mn$+*KJycZrF=HM2XT5k36-1n=;bjd z7f(%(k@GGU-!IMi?3ohA41yv9sY6!BJ&e{Ac1ifcn7s;Mh&l8WVhiOYP#8079cLXo zs>9vZ2RYllAj2oeOLFohI|!cd9=n^P->@j%@5kVwqj|}$7Wj}uTRB7LS=1WI7n}6K z77Vq|q~WRhCt*|8NCgy8yN!Lkge$tv^lkk7hvwU=VyND76g(zY%TyTkKM}024zD?m zs#I>AVwkz*W|20tC#C%Lp^^;u!tQIkLm7x6Opn;IK!L}TeHF_A)Bp4v=Mz-v+*!t8h zwndyFtfT0Cclzkw1Q3;$;SXNBTsJ=Hc&{I)+emYln35^1ucMoeG{fvFzmmg&BrTXJ z=eFWT&pN-w?U;MJr>xCoGu^k$iA1=LxhXOcP52(g%)#?R)l*>;#xNLz#*c=^ey-@w zV+m8b+^9~6Bo2QL*z9vEypO&oJxs~6d})r}#q^ekj?85xia?muBlYD|%_(mK_3=<| znmEYUF|?@zrM4(U{o&7#qt9plsd_i*g%T*Y_SUIcP#%;m=RX>8?#_72MN#J?KBi9v z5VGU_D&p;G4z`rpv4f=0`4g!Q^H3g-ia;0<5aWzH62A0*tDQln3PylE^^zGpcD&9e8bA@{`CFM2DS<`MFdqM(6-s@=%3tT^35Cg$;9sN$;v( z@#Kx+Nzg54@57fk)IRY9`0uM8lZ0DXx=_)=xjl>?J1|mLxqWVlqc3^#58B0bU+B6s`Q0-OMu3D_PDEjTJ)^VSae!4KxHDr!a(V^Gr zm1S~H@xmh6jHqi_o1hgd#9hDk(Se)Q<_<(uERfqrOd^wcC~Au?s0NyjxY1*djU}Hp zY`*5s63iKvf;&I$B=(d=y$X_kNm)-k?XVrrLwo3QlCAmSDe&`P!Wj2MRDY8t)j*e+8gl3b(>7OEZ6(PHA z0tlH*a*OcOl`=|)U{Go|SC~M61R-_Ym3XH!Dj~+uT=TB-`e&HdBSP_WJk3d^!kNaG zKmk}y5Un$U10Q;A^gC$ny^?_6J0Fv#U2v}Gr8oA|g)pAElvP2WLwPO*bz4{Tj){9? z^2C&=!QPm7sw^0d@f0O*L0Uobq&$DCZA~hsfNN6D7S_Uw!lCF9DfKPc6`4~jP}RQ; zVKFN4Y_XGP=eSLZE7D&J8l;k){T6d2U7|8nI~MZhw#PZur{wWO^z}Y3XiDVku@}+Q z@J8UH{ul4`MC@Z?+o(h&EH+03Tgb2@BiSQ3LaOTql`}f(KC7L+2JO+sl-Kzt0-Vi7 zx>$v#)qeS;uQ$kSgoOt5EKnju)c%Gt>Nhxn#}XsMoN>Je zUqH9zf1qjM%WhE0CvWHQDxIFRI|lqrYBSfv#iQouQzwT2{Z1tv0*4@mQ~>A4jEb_t z+*u$SK>yV|19LYp*BMQXZ)UkN!&wVX`l7kTp7@$P?1d_hW_iCS29L!hX81l@i10*T z$R>nHPmwi-gam@)Maz_I{-L$fSEB(iZttZ=$VT}{)oB2wVrbXwF%)8`6PJU(c$_Sb z&$s>aNEhW8b`z|=8vW7FK-u+AN{J}F#qFPrWD-D-P3_lqUo#+pvK!|fEsF;&V8XkY z&jTY;EV>;8tM&|tt~!Z9TlgX5_kMmUqV8Ubnxk-gEP$m(DDl3$vFld@E=hbjQIv7W zP4rBwC=)`9KfztchDDa+g81GJm1jqGtJZE07~nIC{Jq3nq6d9&@Zw>{HbK1mT)k*L{&a6-`5{wSThdy@{*NX1WeipWM)Z<{&av>YwDtt|w6z8pl;&mL+ zl`{`r8~mKVON|;d`pqTV7|*-(8U!vO@@UtlQSIQq89{=x5z8lg8uvpzcd@6L?BE_fx$mOlss-$@kP-;V(~_T6;q7im_@GzR+aM2!VR@aVUP`eV) z(Tht&Vh42^krc92K#)d#09YC;MMw<^|JeaYdh9i1ff39zPFYIL5H|$A5v-`dL`5t_ ziO{p)baDm~Al9hafP$UJcFJDWo5|U=5Zu8WN>7Ap^43I*$HC%VpXXS6U<;OpoUVkK zam4%iV2z<;U2C*7Y45DLX#X&N=>=J-dZDuROB;yZW^Q7r6Y0CP1-+oouq$C%dPMYutSK(*_Q@x2% zd)&$fmZ@;RnJVbeaT2k8<+JY7g>C%!L9ieAJ%6DTGVwx%9v{432J?J>j-C| z{mQ0D6=N9vXMX}*BP2mPznjrgTDXS?F}%xl`d;_7;?^<9atSfZ*iGh$kp18td_Vtj z6Dfr)Sio$%C~S0^E8XvxDn(6-=} z-C0rY%@tWwoDqrUyfp}c!>iS+4M4Nee6m@g*zOoxu% z!QCY@xDFfl2e7F_4Z)Cn-d;{jcLzyaL2u8@a_Um&{UV522v?nUfq5of*n6Yac2%q; zCSRDED!13Cgqn9-g9CT98JJ@kNS92=@j5t4oA!EavDz%jzL449=S8s4X{`!s&haXI zcG(ySQP6Q0TrPBzEDsoKKwRFkB}FQJtSSez@mSi)a|z1)u6ACFilqZ~mnes;3d`(# z5Io=R%`Gmx_wren{nDwAw3zvcWBRp4?vuAtlvIlr(-9qD3mkVj*@! znsoT%<<@);AEjh77eHLNr92r+JQaBrObxa#Kdm}C;r%TBIk`Dwq@Y4_)0a{E^UJvY zi_`EjR|PKzP^bdvC{Q`_p)yoF9q*6gugP?=){P4-CQw>pm@@}mh?8!Jtp~T#vE*R6 zq`M_^aLum!C@FzU`7_ef!=OJt!GkL0I;4Ad3&@>Cq?cn1<$y(w3+SM7<7~e`)7h-s zHTWL#wi)J4?)C#@Yf%1N3z#29@_?Eco<(W29Gs-XqeiMHt`UT+dfQ!78XA zVBMAFw1)}Z=8C+cK{PMtuQ~185qe8R85&jDQ;|VLivht@pxZQ*=;k;~odjivPj4hZ z&4xDzPB(SrBEu*0*S38gU1*BY$TPu&fCKP3>Cd5kjb~C|K;tWiRu&J`Q8-0q~v5*8rH5N)SG*y@JX1oYXOj(FEsHDIj? zq{9<@kP51RzaRzUyL`O*(sBeGbIWD3=51nE^R?AX*6;^*s2laDgu4cicQ#ZnH!%eD zOhAT;-VV(Cmi9Y;+%k6TNL+z^U6E@C@X1Zf7@tHhr`MB zcvNqCAMUfn;M))KL=0cZzVV)Oqw{XWf5?_(Sbr&92|(DOTU}YvTl*a6+1lGhLx4Ht z#P#^TFjjui@a>+^3Gh4~U{9f-7en-_#N&Z%y5>g^AxbgDXp=o%f zPc8~q>qJXLjGX(nD;=a#4{Bzg&!BAT>UA@AR#1+Vs4SC-&WfZJ`Sok;J>+HwxWQ|1 zS(xn#h`2_q2gAVgs*8aqx%k@SUcba3flvgHrK_w3Dfx_Txcy>cGjZz}T!n$nnU*+W z<4xEO+$?K%H5wvJZ6Rj=#c1rh{Q&t$QBaw#EBA8bCs{i_wzyx^fmG-WtRN_ zy~;L+A|matiQWs{GGJ@;8p)5ZRzO$j@tf0C;uU_m6w+kl;rXp%Yx-E*7l!g`>(Jq%Llmm zKf$)lAFS<%Uj`E+JsvX~>wiaWja&^Z^{ikF3A1 z{So=k@4sKsU&s9O3jfIQ`@Vnd^?&30_cQ+un*RH*;(rfKGtm4#R`D4AhDFo<-y6Aj zOn(vDOsq8j^Ek$1rvHP(#$#suZB&1F*8CM>p%K7iX8p6xLQ5lz$3pj4n}J3Q@BiWM zoueyRx9;KC>DW#>w%u{ZwrzH7+qTm&I<{@wHad3lOP}+ed(OG{zWUz(zOlz1BfIuU zJ-cdD)tYOrHRode^B7rKXeB;W;eUS5Mk|HS%KnefY>dC|6nr-3e{5l=|Kncyb%o=z z|M_#+8UOg^w<{i>{m*6Cng4Q6eJJh!+#Bov?GF2JE%@ofA<%>L2L|Hp^FkI$iJW@7svYuV*Y6_AwCQDi3hxXW{kKs?B> z74TCadjTjC>Ocsat?bov&&z&|r?$<7sR7AgjI%mTXdzeH%@wP!w-o(I%bp(V! z3$(D{!T>T9O}*k*?MA_;p@Fbb9swi-sGLlgaN2_=z}gfQHo=g??e{&(WPB3g->mqI zjwnD5?_I6yFZaVI2MRx*K31nrW3xiWJG&i+0$#8Pf+V)H3EmeVy;lWZY)}+x`xXOH zmH`t2Tt@@vvI<3%j-rj6PSe^JY*M|~R4fOSjlj=YPt6N8$LY#C8I$TfPl>Fzs9L(6 z_WQ(gQLKUq54?$?e=0FLJns&O0Bivb0az<2JX^8Sr}I!11wOs=cnv-P@ZJz;PAD+U z@54c}@QwZkRdo0QC=|JPq-5@uC?2k_U!Aw}yL?6xmtiI9I!O6MLp6&c@Bv;zR<((; z%sjrr6a$Xv(!db8=6ZU(sIwnZSwrQ0i;V?t*FojQ0Gs2l)C#4A_r8U|Cr_UQ;Ll?n z-H~G|-2l275(LH=?|;xjfs?R`eC2&n{9`ZdLC0tWpG*o!nT`O`h&%fYJH%z zTRop~tDD6}%1hERB5CK2pqT{~;f@GRpdZV4MC=#n)`}CRrlMiPTKDUxzFGMUQoKni z((S2K;mITj<@aVa9o8{OvSw(Sa`Wh~?XW-!xN);FGH|DgyRG&Q$JT?rv7qC})qXoEtyvLLcS+up{AM%TZZ#jf9=BuAe zJ`k)>ZR!dV9w`?IHZ&6$ZY4>%VesH8pX{CRP~9daw7RLfOQ{;8r0vbbrgD7yd^6V+ zc-)De$8ac8dk``9V_7;Bo5fN^_en^9cjS2EA{P5LD*)_)ID}sXeU&1M6wrT%@bAb;mawCq8k?o) z@PPH8`gpvrd1k>w_k+{;d~&$2u8^zuocY`Fan7OwdtnPHxmiL_wVrhFecRo@Pfobw zfhebTko-{`LXEVfR>m$ymT}v!d$EF^uklEivZWT4+V|LG^QvCLR#Y^25!@4GOGfff z&9)sbU3c3=agE@VJxj=B?Kg3&D}f^~-|wP4T7F$S!(Y3_r2ee}T2byBQXJ!1A5C1l&@SmX7FMFc@p%zeH z5e8!3L1IW+%;Cd}cZzwIu~yFJ4mOfWo^FVO~#}`@sbwo9_%SleE(kX?dW+A_)HA6*&j2KpLMmIiFAOL z9?gJ@ESl~+k{zQRMGn-J9kiIZTo|(ZwY*%|)nr0oA^+-rT57CnY8cIlYHV^`%4u>^ zX57a>ZYOaw*WT!u|YgPEd4LouET-w?}{12NMB3 z6e_gn

    E@Io0SA9d8+!eJsL`3++Hyn;B48i1qD!Zflw(f5GmKJFk0^7^Bv8$XB&bk<{a+KI_EC-M$c|&h!$Re*#X5^Y(Fy51 z)kx@&<>e{m;+m|qMx^VlhEm(hEe$hHwxLT^ZrQyuRi3X%o_&IG9BLTl&HN+}Kq(56 zs9frPPR+OXY%ie^x5kziLZMm4oZg;=(Rnljw}+|f#bWqI*_e2j2aF~JF81o1&6m&C%6DIuO}51bAUJQI z2bxJCp#+PB8KkvdTg-?0KC55$mI2=z!V0hyDR;|_W zXNfhYA5p9!ywO(_Nkm-a9!_=SymTG#r-_#Vv%IW&?glNjU1VNo81J2>y)s`-bIy0$ z5u8MRE_J@XFVAE>tL@bipJNAq$Jupy$Ek0u+tH{-GWKdR!)nQ0@8J~x@?9~^EZ&L( z&!N|i!AW>wscAjOv_vXkIBwbMFeF{=RfF4nXH;0q&b)#r7A z0vx;ecCrbDtCu{57Z<7B=8GvP96m+Luqbgu=;xBQq~$tpjc?7!S=usJs|l_Q^J6*pwHRXtTGcKLXvDlSjrB&g+9oHU}oRNWOD5}!PCbJk>9lrtZ4 zPiR+9SH8@wP2ieJiBm~f2}3Wv*iK$+B{%HJ%#o&;#@(tkOgv(k9KTaj@2Gf>Rd+yT zQ0BYBl7VRCfx$onf2anL!o;rZkix2)03s4PI{pPr(ErEy-T#dr!0+nyzp|8n0TX|P z62G43f1@bn#UvC(Bz}Vu|7r(7|Ie!U-!}Xopv2!-`!ArxuW8Qz8I)l9KoTEmJ3Zrv z6(1`b%fCkwf3T63y7nf2rRsi*Xn)5J{}JOp?E4u1GM1N}?XMnr|8wGr_OC1B|NE%= z*BJhfsQPR4^dE!;J@ao)j{hdCGSD-!{7=K`nVcI}{3EVXm8sYecZ?H7l7`XxH&$du zA_-hN<`j7SII*;%2N5;0J_IQUbyvxZN!g zNE`yK3m6^(3D$Y}p`M5DMAy5OsC?o_A_%OJY=FM~H5&js0*vj4qz!;^FmP25J`|Ks7XWhdC@4@iZ?X^Xk4FNAB8kpJ zXo;<=_WEvo7GV>pN%&MQ5D03yWEeFNUY{a}T3~r+)X(-;8+3KDtD(Yq?9qqjSKZ-n z^TboSYP~$q5*%Rz0gK+;aX?iVSjFd)Xy$kDp!-v-jv*R|up~R^K1>h*9lUe{Q2PSN z!pY*FfQmk2f~yS>fEngN>ROzjPF6T-RXAFyovdhBv&ZUyEin7uCLLlrwe`Q0q8jxC zK6^vH(_7t zlQp&=@WVfYWiu=V*BKsT0GNP9;a1j<^7gA;KwCg$lS^Pm^u9q)F91(cVMf(_dU2JtojkIX4)THN`AyPZY(5rl1WMWmL*&xnnK2 z$8*!y=&wQ0H6nq+Sf31_I5NqFrRc z;L5%7Af+|Uh9*d$u(5XgqT;e^cAC+i&dq(_963d_|797!0^~6B+OHBC! zl9Nzh9Q%r4A$E=Y%f3PXjpG<#%H#}_P=aF!X+NpMn44*fq!7wPZ6Q7ZoF{yDY%`VV zw};I&4OK}!;C5oGl7*e5x9dSGr*-F@k(PwXVwE)OQKqRd$66kH zAgqpf^~H~4c^o=qbj;rCN_XR`O3&LF=|mmRg*RlZtA}>{gu8{fwXU!p+EMz(kEwu$ zE*Ge%p0N(Yko%Y&EZUvsGdR6B-2h#6^=WE9t}K#DVYSf!S8MdvWaS(6cQr`owC=8= zT^4J1kA($f3YJpN3C2yS7xbu&PtDD}`_^@MTE?vRsWKyzB*)F1-N|-WYo=((2c*xV z9IY-xaOhEn+!LsE6}D3Y%p4XSId$_}DZmt6n=d0U?_&2N7N6~o#MFuULRI_l3ASRq z0>;#IWQ?UJl1?WADiVq?%Kqy17Fy<;)h{(>#lZ1@ufgY7x2j(=unC6mi9S*m!I8E+znc;@6KR(rW~>^?8XJK zQCjI5F1SzSnx=gDGcwY_{jf@ka!|Q$2_AIBw&JUXQjH>NLg(Z_12x}IdUvqwNTonk z2U$=oDJL7kUu{CnDhsp3Aw}65*RO@7mMg*Q zAO+LAzfEzNwfDJ~&mdK06NaZAr0k$x($s7eGrz7gPy+J3ypBwBvHzd z)%(w;?35cY^r0GI2`r8B7|nXQ>NG2*n>C)shISWMXtlonGEH&;_jJzUQ0w?R`Z`Jf z9(Ftiez025XkUn`{oP!i;z=P{>^r0QiE$MY9C`J@TLT^Z%F$(6|;VNT_E4y*ts;^S;HUn2&NUyi@%>YIYcR`1*vkM+EqF< zc|bMi_40j8jyU5Y&-C&(q~Pfo3^e+8`nLB9NN0PF8=(tic4 ze>JdT`YUAp7vpLL2{i=?#a{+iABgD}A@-M|I{iOaVt?E4Pl%P}e_>$tx5fSnSpQ*Q z#rlDp|1+rifz^IDu%cuAaD@Kf8Cd-dwf@c){>kaFv;D(#n(c%9VrKlsK>qn+V_^9! zXY{Wb#ecyW{eSnJ`WtifS4#9xjQdySi2WZQ{)sta{IIJ2A2LU0a$Zadrs(TzSg>`W zglDEaf(&D$ZRn%$7}Z4x1)pcn9WH`K8l9T$`Yfs(%|q1U>nLJ^)k>-BhD+qd>N121 zZ|u~ba^kVg$YsrI78a$9Zx7D3-R{=C&Y!-&3o-U9SDz`~B+U{3Lj`lq1y8_t9 zGvz9epbc0*mei%s#!(oB#wj9GYMpERv^Xip4E{1&f&8nx=L1bVwWU=JO=tnRr6%+J#OeQ-T{ad z1mg258L|Tsu(Gn~@kX#SVh?ZV+!{VjKC1)F5HYkaRIkhO3DbEyefv+7ekaqgVOqsD z+SHq?Zl3`)zrdf(wS=)EioxRiWqM0(Yi=B7c9>&GH0mJR=b#0nQH&j*maCs!QcN8z z9Ze0LwVEH|e-?CW)DS$c4E=btYXQbw@VDH!RUDu?BHw=-r%HQVK48hxrlTQfHbB@T z1-I5_P2GoY9_w13R&3eG_UMMOlYGuI@2M#xu_OzDX|r3^eJxXDH(kn)AzAyfaDT4{ zPGnhe4!{Z?))A%6J~jMkq~kZ_KRTQkH4VO8S3W<-Y@B|2*X7JbVKW{?9VzJr)5IoK zR%+X1tdqzE?=9KZ@^S!x)aLg(3S6=zO)@Rr5pR9*W4fm9@ip-=d_TYYu|wlT9xm(q z^2s7_z3c)9R$%VfXD!JrK_5-rmu1QLkxJp3gpQya`*tt?jUA;oSe?r;zfy!VA&)Ux zS_%^M0P0efW;aS}K5DI<`bylCFJv%HUW6VT?ZuvhM2g$BXT6XoyUf&*0SaIA!dkD? zUS?g4wiJ82HmHAY4<7BUXu`ODNWAclI~HmdL=)EbTfUtj9gMFy8|4|Qse7?%yY*$2 zXI+zpk=`$vF=;H2t6QuInc$*D z2eVI4Qa$HJEVDQoAcE~aoBxEvQnH8`jc{t&T3&5lZ@McqR#hgo?;Zh)!M`e`y?Bra zK1QO2{PJwz98AGIoWojK;l678jOD+Po zG+EKKHeSa8RZlWCaf#Wzri-<(j9}URR$f{4-3q7mA`QoZ6m;!tCi_XfJBvYq%61iY|sjJ-(rT`V@W9>rM1f zM*n=2;>)UsF`AX@)5`f_WvGPF_YNZ?>pn)l^lEOI)*S+ep5}^T2`0;i(<_6vAwP%U z-U@2FfH6ekD>%IMk5~=~r~yeIn2$tH;&V^RG<9tBuc7>3n{EEPLKge4sPnf%)~|xV z2MO}~42r+>$Fctk34bG>1m$Iwe(R5uSN%7k{P!LI8T06WZTP29{=cbX{e88+#`1rz zV|^6W{?my5TOEt}qmK0vc3D~3|9kd{R?or0!tihXVjpgi|5U*G?cDrU!20J<{%27C z_06A!px@5>A7|tLOi$s{e{|aX_B-+E|80}aUm?UF;hdg@@mJCEHe0Gp}BN1q@*?N4>8|PHIH_9Ok(1LE_RgsZ$S4oaVe}4@ z!O`I-1EM1_&?7Y1-QD#kAx5sRxwomMV{{_owM7 z-;B7LxT?H>HpVR{1yF=4uY)5CtHT#*3(_!a=A4Y9hWwC>su3RISMht;>v9K{+DZpP zd$2~%ccc*rUK71718d8}OPpt{(e`^y+S2zFzknK~&gJ+|sWC^K1y$Eh7L3s9CQn{QLeulJkK-lkd_@Q1#fmfW60!W=p)VtPUSRNJbbFyj)aC5F zPYg`Fty)g?qH#`tV~*x8R#hnHKt6ZqV2P0c;`BLLqnHU*XNA$`YOD%G&#TPw)|GO ziC0$@mbb$?^sWZ5q4+-VsBH%a&3rk=J$ zerV$MNA1a#IPA(k6{GVHsDje0-6xAn6}Gzf#iU#g^z*L`Bo|^}8vC11@bY)NgqG2D zRq}WslP4%$`5DFUcg?9uOF(ma`ZAo07|IIMl8eZx5C6OwL$mH zQpFK`=E7y*{1xMz+(hDRp01xS@Gvm351Ro`mIiX(kbs4T&!C`$QI9Tuf(L1f*NswQ zMu=_VE756PId)9QTtD)vrS!T_07at_?ni2_-6T7eJ@~MtX0^}R;eX|Evnr~z3d`@! z{uzu(Caa@@ASC>DecaUP8LkSmtjf90K?PXLDb(adUf{}Py0)L~;@ulSG6}G8|6?YR zyz#njo&l{{Qq=f?`qeau2?HOat0E_Z{0nAE4%(v*{WW4B2KfLv(9n|I0{Rq?$D?3Y zt&+NHWl8EvUYU@SBE1|Pk1Q}`6jVZ!`r_cd5KN@#TO1jm_Id#u149KvvD7CyeBV8; z=5)MCm7xJ)F~n^*1}yWpaN1L6+D~?>9g8mH&$;vLpH_C!ki&L`6rT4Py1xOI3!|gV zkISl~raU^~w^>ATUS#f&|x?QWZDmXr@W`JnNC7rI$bauo0>|vqt~F0q=$rZ#Kx$^|1co{f7gok)2(>vRYD#+?V-ye=Sb*)S6ew=J0vj2 zGC827y_b@5{X_*8Y5|A7&1+a1;e1PO!l)+FW`&^J<4{*Semq`=Avt1}pVAmp^ ziY??II<+&Xq3pwmJ)sE*q6M`XPSOl2DlS~+YC!Bb{Cu#1S8Ztnm zfLkTFwhdzMx|Td{VpQOfh3${|dknfgRf&!E1h)O=>35r&V>tuayjMAo(c3WcoK#k} zmOaS`$W$g&{r|>nSux4XXf9rm4?;6GvPLHZH7$t2_e+;VA2JPKOTm*|OdNXa*A^oJYP z0hD7q9YALyhe}pT(8zPMX%#Ix%0bmXE1$8cM_ZYlWHT-)2oPDWN(iHs%H^e8K|PpchEJzlQBhS!!pn4aUE7JdshiJI525DW6`Z zJLdTjn3QqQp_3=y0OXM#NlcG`uWYAaC8E`s=;Tge1KWmhp1$Y!$*bPH!MWtw?J9)r zQF$#?kfLf2@>LTX=f+rOXY!6V5jWzi&(rW!;0hvsr~uwRb-!!RDt=2R3Rx5jVUGz# zxDUn{>li4E_HGy!35cY+G{zmsa41I&+VM*C%?DK}@2pn4=ew5(O-STX_lW%%t-=hZQi+C=w8A!PpOtTSpo`2vZTgo};Ea@E9F|B^_ z#?(G!ieafg{z(VrBTAD8HK2r4W#N86&I`M>m$6xLXj+##`UC+k8sG#-6@Imsz^l}> zsn=V@gz$=+WE>$g;PGs780X7$8;pbhHM~V3WhRP59QFB`!;(gl3S@J{EwU>k|44Gt z&`m!}jf$W{OcbV9m|VDA@KBmn)KCLx-^2wQ^OI1}(e{tIi5ovgnh<4i``KHiQn@%Z zx9pdin)drB3I8x`eWHCGOexb!hngm=B5b`2NoUJR+(cAMeQ3hs>k4#S58~_)NHj76 zR%wQ&mLVS%pNolRgbSvK!8FP!itoGwVF6&&2mqI-?2^0q?1$lzU&AN5GY4-zCU!}K z8R3b@MGaEcpf2$2Ms{Zu1j{*wTIUuC>nr20%V6l<>mFdeqZ8ClKO{3rQK?3vXip5T3b;1`T*CS@PbX3zv zRoQ1(AF+ddl-O4j>*Z3jy>y=CYNsR3D@VUWx~H9`&1ilFm~TiQ)`MnJmk>>l&!8E- zI-mLEX|JN`y)wqOS(w;H^{`~a1$JI0Pb8Y^e5X1Glk+iU*$%`|Zk4GV3vRSdIrOlL zgdY=bfJ3}H?@lEn^aO9W+H8j+K@4IOIxRPJjXneX=pMXKijhScm3$9Sbz-4l13&mW zrx;Nz6-sGLiG(iX`pCGBHt0_;`K`ft+~xaA27wQDQ?~VU+(43Il3>^Pl-VA!-o<7c6d)2Fx2B;+(+ zA_(An30*$-natwW9{oV?F(5nc!KqkS9><^q#X*UK&^RZJD;{jVXrydZHzRV_Po#*9 zoR_I?*49NS6-bzC>-cuVJ;hT|1Q2!Frz?ZqF$9H-ET5J@S$Ko?NJl2MNtAR(;!hT2 z<8IIv(d~SMh=kif^Ng`^`tXBLl?>5A8NtJV+4?{E@k3)G#OH!=#Z*G?Zw{N_O0O|a zdU1;GiNPnB#M$$+pdzJ8>T=MTnLkR;l}?&rZv}v{CY)uo;DG7GdNI$b_~nHOW*;B! z=F^Qn>U8)kN(yq-y7JM~CZ7$p`tVIL5SS(dDVV4JnNjNz*vdfM7bBZaic%phbPlty z%Fo2**AC5w>}#0IKei46gU?Os<3gNxB;!5vnTi9xx7Ms`Zs6;@m2R? zv)-ST%$A3MVkrSF(Ps3!yZi2fI5b`aw23ylV+=(GHTDiZ|KK>VZtEK`8;WY_*uU#F z3Z+yQ3=Vp`9SJBkq=^y#@r8JQGaFp9ixIFuglTDNOOX9Kv1j-mC+}1`>#e5doTAfS zj{Xj(%l46bs}MC^M#=0D!I*q8KZ`A|;M1v)QJ{X4wRW7M8>wtbm3iwKp#$x;a<)od z3(QAdu1-zRzEFi*2n>5D64G6$EhZe_Oa&)61{d0yqU8k$g#Yl#CUmt9C?!bAW#DCv zw>vV&ee4!UjedEg!_E5A1Xc@FcSqH#E&)-2=-(>$x2Wwlmx2OYg3oE#Udx; zw+ATWwl*-2;B_X1AIb6BecxigVPp$kfJ=W*c7~CcWa6ERzF(PmxJ++_CAq%MPrE>O z;R!*LDl&*7nv%%Av>7HuTdV8QG~*%RB2S1#;dR}jIi%42Y7FshzwaUZnU{L-D*}K$ z89+3&LSkv75}0RO8|A!x-j>|d1!%tDlN+pfsusKq@jy*T+WwQWR5B|tk?ZTr*P`vx zSrV*T5WYtUkz6Jy>V@Oi;#4chf&~*Wn=4lP*%Xj=;=qL;ZeP}Ivq(cjn)kSr#lGH{ zmOs@naieD59_VSB0HX-FSQ@1>HG=afjVqGgPuXA7SO_g!xZ|n8R-FLxUXmKQ;uFRB zHBS`*7c_w#BRP^AT;tK38(-g9q$h~%*j=>ScESGish@)@iF`wT7TZ>6SqP(%kD-px$X~zN%DTs#9)iVEBz9oW{~5*T$t|3ENVD1_U>e&# zhfOPS4ua+-;Qony%-8sgV@DC;bQRILp4_EaXz03v44x+e4MmVO znG3{k!cM0s{_`)T*p}JWg&zI#oEYyBlxCmp?d&dDd_l%xjLkQepz5UFKKXwgkhoIf(oUYDYb*D@r(>)2BmP$x#wLTUraGyKCcx7cgvi{np8cDV-ok)pinB;m|fl#RNA>pMH22 zt%6pCQG=fIzVc*^(>flneXmwNuJ|?@pge1SC_M*hqg1~x^rJ_~dg$qzE;=NPr?RV+1+c7ZEc@GMZ_doC8EaNsFH7PK zqu1T5^AV?gpZDH`>5;O=rFmR2;y4v_m%Q+#r<%M^aq3`iZiw6}Aq-tMF`>;3Zi?Fs z-;8Xbvl6Q%*#t{+hQ0`sFlQBy)(sFbE8&KVZBd9Ih@`aWlqivyD5?T?yeGmp?B-41 zhDxHqGV00ga}#)cBjJlKJd72=N`75mgrf+7$e)olF0$>+yJLJXt%S0JRPscT&>UMZ z$lT)am_1?PBI~1kCLq(K?4=i%%(m=+1Is%F$3PJgzNue1nik#zcSGTbmd^H@CF^~* z;}z-vH`Ou4a)}*COxYxQ?yWJB5cn8(hgBltVA>goJBjeJU&^R5ZW|M{fC5o(TlzSe zl=2?TCDt8Yqcj%OuwyM?pe&BtoTa{i?WjWKPTQk$L5r8GpNoHB;1-{RClIM_ zq&2c48^fVrlE0n=a?f$15^U%7V&eo06{TZl7`v{zyp~0HU!e8zjTIBg1hb`Wnr0e> z%lY(;0w$=n&cqBKzb23;LdwKfPH)fwtc*$_8x#+3-qC05^pgI*=c8iKz)=*$a2!q& zvzVDi8<7ia^SA{55I>GX{bK9t1JBbEw>?ncE@_;0 z5ya(5Sf0jqUI8GNgzn;r>36`1(S=!S-|F-HjS&;GqJ=0s>Z4kBc|^mvml5p8;om_E zs{9K@$Cnu`S`MaYzp_8|s<*<^IZGl!Jlp=*ATjL_5ruOdN?pYrpg9@1^CP-cr zM1%L)=+0^NTKxITyh%0w*8yZsjS~@eDygN;8`a5kUFp{h!*s(c`rNp7N8W6Rlom?I z`EUUE(xMD5`WZgI*wx5_PI(H(t{SY@o=H4o&4$lZwe_^6s!(coWNb5}v{kJ( zYj2qvukdtjan~qe($=pIzI>K*$Ri||Ddl67v>COj#xl6F6UcRMy0r9jvOtalbUl12 zTon$*!cHYh!3OPU^&&MlwKX=Z`)Hfu`^14^b5E=W06Xh^^1v_M6+xdq40@fH z1^wo7)EUm`?eJEnByv&>^vnTvZ{R^}ZnXyknC*Qv(TD#miM_HlKOM(|x(Pfmw?|NO z)BLBNb2?lU2SC%};?LEwSC6=`%{^q{&ZfpF(ttIlSdfjR#>JuO2f0L z#XY{o0p#xzUAg7zHKy6N*fx+u%%E|zw!pyQyHE>P4^>X3n2d}vG3NC2?jxC4UJ&5) z0#s(Jk{ODDsZlWN15k0dkxr57n}nIMqlD>HKTBVo7o^*b7$rgsw3*&Og-8le2EO7s zg`#A}<>bnVR$J-Xqlqh+3%&-9*~|4ZLy)vO0&$L0Yl6V$0m)^_rE7*1P5O?-_B`&c z30x$TScooExi?)vJ!u-M|%r{*H(T~TM%RP13EITtFn#8z(PsNCH zc1W1$w@xI|Vn3o!JEz6cAXzTzyG#O}ALwmB_Vfe#?h57pg~}^UmXxf51O%>9_=fvB z;w^UU>fBipqMs?gq={@z01pIuU~mggeG%`ZPv?A*@n(224H#G%O9q)SreuLmR97Q* z`|uNYovs!bS9K%excVbXg@t z_O$_AaXE!;{1j1+OOsy$HQM9MO=k02h^$C<`?rB*Um)tZnBBBrmGGc4R zwz!B{53wfS8wn3J_je=8@R2h(^QQi>NP!Ktz0_D~XXQ|VPmUMrGP(Pr?;QQ%aU}Z< zomimmB)o?&ZQ)^HsiXypmLd5?TxdzLA;DPeIX=u%R1@v2*~`vRD)hsl{;(b9n8?s> z-a_9*`4vQzJyGWpT@l2qm5uzC*{IBDPsR~R_*ETN>tix*UB$vp*n5yEt#iqFC5B5}giYj~Qf^S6yK%cC0sKDebDzI(*dckN@Y>T)p_U)Ib{v5s)`T- zFRYMp_{gL&b0oc^qCm7f){)egub{N74iKxijw1R}WQ|u)w|A8fREQyMYQB&zk6nPIe(l!qj{=orNk}Kx?6;d)1P~m~}t!jX*M61i}tA+giF3Dh3I9 zIwGM2X8{Dqx^}A^ieH3$7_{9FB3cc!3W`f!;2l{9K-ei%kj}~D-6eFeyf|bbXRM0- zF+xG8+$1T!70UeUM#3}WUo`Nv9a1in}YDntN&YtOI zcko-fZ_#erDQflq6p5MlWYmSEHRK)rCKCDre710zad;Ya&3E z9w}cN0-8H+X$H_LT{`Ip%(IH4H3pz7Q{{A2xR;DBfYg;MIa*agQAgNc9~#xj<8JzD zEWx~JN^P|^s+;&czS4RrtXN$GCx(Y4Thl8YQsL?HlWKQ!K6)$6(NtYA_#vp?*{jjx${L1moAXUkz0T-q zzMt1u)>b4nr3#+=U9qX7DoU1!!diZujL$A(yQRDDQo?`Pb}B0Rt85gWV=jz=TH7cl zDni|(a5#q7hlMEo%S1k1Zo=|GaD0XCkPa*sY_qsf7gKM(SnX*j=v|A8PvKMR{@}Fe%iz5#8ufF+;-gdYtN=Q{V~mqM*UUZ3rBJk`kzLmm ztTe1s{fT&j_#>^#0(P}yvz)I&2em4?=n;v+g~)GX4RMxb3nw|71)i^w(g?CDFY$%&r$>RVsi8i|Rllb~~UQ28P(UA*nv zUCTw@9f3g$UcXxgKPLiAJr!3Ig~P%Z@zcZ+px5wx{)N%f36y2fCGOF%1H_8lY_P}? z7Rv=Q&%&}wL-ssT;CznUIFyqO^o#ppuP9N{fTm1ql2x_F<4=%99)o;U%@=W37VWIbkI3F{|8t8D7 zN#F_hBC%ko`@c8l@atvLAEJ0NgzHPoX(N@m+0W_FGZnU_GMXHcffL9GfM9L+HzHcN z*$xCFadmg$dFFNIS5XY8f(F_RAlIF`_6e21oj+AF>C6NY)VZ_P7>@`h+%S|n0W1F@7_L;$(D1&;yE?9OzPg=j89{owKS zMoaR~+4EXhbdz(_m9H-`v{%vqX*X3f{W<#8e^9y<1W6Wy6q2Isa_S)g0c*c>dRc!h zV}~PPBVw{f1XUXR?h6zeH&$rMH@K1BY5dP{<75w8N9NlZVpaQfKVzUi1C7}T^OwJw zxS6S!x8i>Cn_R!LSM%Gc&c?3i38k-a1`4&Itc}rU=M=M@a6~5R!BKP2XksuPo-Tg5 zeoLSQEHvxn zTYY^pbw#V9Z8f+-UdzrV=jSnVv=tYq0@2|@D6^sG#g}SKcj8E4(mCZ*9>t{x;9OPP zVG{e7wMbt2Ii7%O!DzZ^YC!X4qG4m`%3JR&omE9gAbr{g6H2HJh zrUr4)TbHx}K`y0TYsf6uHd(}kgskdO6dVLd4_kEUvWXdFiDmSp18ECPVzyKqtaUK> zWR??FkpgUA;Iyl;*SRxRVn;f_`W6>DiN;35WxXFhS=0lW;r&&|` z+Y%%K1SLIg)$|4_bcELNOEWq%;Jf1;-F|BOw?jTJd$>~y+JCZ=-eKVVA_-#x-Yem< zU$W(d0?u$#HYONZEL0#;*4)UAuB$7s05;jws#kpuzB=5aLK6BpQ&qk*QkZm>U_zaN zokr6u3K*RkDe81j6fhjThbbYi3q@+EYd1$afc^im_6|Un1dF0=cTd~4ZM&y!PaD&= zZQHhO+qP}nnzsA*oO92;=iPVX{r4mOj>uhEsmj8xs2!EL7JMAm!VeXSK#-n=X&^k- zMhBVeIT6XC#xrw=xII}&$XLFr-{=^v*iB}qx-1Aey1A#ocgySyj?>kAws5KYne5tD z_P%=X?(Z@^hil}XyGxykZcEQ;>TKwAF!EzsA?0L=W5`5u@Xx^(YfrLUgEj&5{wj)0+5Yhc~iOqG96o3AhoiZQTCj*od-~bt8SKt$P~}h zFlGUxMSpKPYx%s?`sWgm_xLWObxyjd!}$DRYzO_a0VFw-GaWw`sWqoW8}zUcbmTz8 z=IDszEQ~4_{IHDpZK)kQaN60mlOCw%4ja>MV+1&=>lfwMQ6*cJrHT==Ns(7_p^kN~;T|)~Z z=75XEBST6en%0jEH^;Ij;wlj79*Eh9tW`a ztb-YLx#yYV?Xz+1z?@Z<&NgstH0GAa%9k5z3*p=^z&9PaTSK^}B*RTd1}(3j54ge3 zGJkO4h7V2+gQ0rW1uq!PY7>EF@FQ+{QvJ~KEJNYzx%j&be39APl>k1^4M6JQh_=RW zR6vZW5R13UCPp8|*SA%HPs9VIliFtE`hwd6#?}%91O=4Ab~nI<XyeYyK;w*I%X`<9-F%QOS0oeTeY0~HCn2ZKK;5K8f@2cxk8(qC(Ft@*x&^S} z(A;+|IuPpNDJs(2e?rb2%?`XFHgzYS$)z0SsR-_=3g08L_zkuf-JCB9jwFEr!2{&O z5-3l@3?K_|-$#*!W`%0+8HA>Sq!W8PzvP{?j1DLePgy9Ll@)2Q(%NU2(oyy4$&g=Z z&FF#%-TE@xvIpnkqp_SYzo4|{lkQts&3c%(V?j5nFT!X1&YuwvHsfmYtvYFJKgDl7 zU=11=z!ozK$!t{D3XCeEKYM%#u}_bEg*?j=^!=%11!XU*P`g1BdXims?pZt17bBk z+Vz#;8a))cgtOJv=WCvIvj~Z|&1<&=CfQImV6#e2t$7em28slbkp237RH0;19T;L0 zbTr_AheAG=Um+HP4>keshFAUGIm3OQFBKoCi{Hib;BY{&4;s=y=Nv7mt%aqG?Y`}H zt}r7{%Ke^3-r#`JCC0`$6cjYI4M}G{jr6M}`icTJG&G7Fw8-L`mDO|sfkJFQuqhK2 zmE!i}-cbd?2#Z3tCgGX!zEs6)ewl5rCX3C8UYo7Oz(g+qxPBb(IObDLx@&r`Fa6EP7Z-pDPkQ5)M8!q@5;+*?KJB(0xQ-$BrL|n&p_6=zV3` zi>7Q(>x1Nug9vU3I4M|`EqkiO0X^~EBi`~QpAAN+RI6@XnWfVzbjwtxn$tRBjRILy zxU@*UF1a*^Nw|4@o-YOCOa5A0o379WnEmt8e{fZAJ+qN*f!VNvN6SL;7!=y{tiB$| zL9+C5LO*>{%HwoHwOGiTL?qQ^&L7-{G2VEm{tVR)-mv|gpCtufLF~#P{-hopj<;gX zjckhY&8*Nzlhofb3i1XG+mUPs;d;uu*5ag#6OJm7U+%ZJtM7A-g`;vgD^plOz}EXvU9>j$(eeVCx~@)fzPUoBwK z&{0euMErbi`u5Y=GY)(7_E|>t$gz#y${)yr=qk}nSMh~gwE9o)8TjBXf5Pi^IT~3^ zCWv$qtqMSlF&Gl`1lB$^k`*51jF&*St0>rXSuXn4PbB+_q@>){$XXmw<&SP6WpG~L z5f#pjK9~0E4J7w(2`PWnVlmU%5WZ*{T>&eHGDNSyj*GUD%TWzPq6a1gFzi=LB0Yo6 zChd5ct*HS+SGySyhcw&x6Q}&(uYzndCeF338?E^%z^E$&xxF}>0}aqe+B$uQQS;S8 zoM^1e)Q=5G=wFboCfdq-NxkmwY}i#wfm}H8+f$BQajUIEpn}DV^mukE3rwf;y8Rg^ zz~?Iz%xcS;m{(!q;a*G7HWe=hD_2&(ZFiu8NMrsv3%KSYgD@_}Tp1{E}PY9a@k7H2Ev z6lOq7_*9eE*cg-^m+3{F)EHMtwZ#7SrYasl;mIUQi9q~rYiQTZYHxXjX_q;ACHJri ze*3BOS-djQxP$EjdO11C^`-qBAFY@DT8FE%mF?zjP7)HTFA-sR&<%M+P_=R9nOGFmE2-_S& zEa}m-yGFG8{BrSiFUEl8g2FX2syqU3Qs=yC@$6QtTjg%{r(}5^_1ys_bFXxfdxo>L zzZDmuJT)YN_1+`pEZm@!M}0f^yfv583x0OM^VJ+l<9hp zh_XTk;BRS-}I{jR{Dmf0K;nVIL9aWV<5aenAHwXOQ7n1Zr zeY!CD>6UXiOW!%dLq`e34HWAju7M_&$8Tu}5a4byeo&Hirb>5~%c_UJ%ZqLwyh~FY3)m#55NnS&Nd^fz4T7fVE(2g>qNYOyyB4VtI>#jo6IVpW=I3B7e z=NVG5L~S9e3AhOA!B}cAD>NJy&+`*9 z^7YG*-m7to1HD3?gDXNyTP0oanHs=06fG{`3TjSj<|dSuGeiZEBWQTdr#$Re9}h^Cn1NSt}h)J{QXCwmk1koDfurW;|x44Lvn&Yi#W)| z;!ZEZ1H&Xj6YdhJdo)i$Xr-OLaDb_yQwh68GR{)bI7N-eJJB|&E@tt^AvD$fJ#4k+ zgZ(&?Z5PZ{AA`|YgzmW%)ihx!kypRIpE=P;Fxs`*wu0Ouhn7iJ&KVOPUS7NY2u*>0 zzMo+~_F9Z7r$d#>UU!DJ(`)zK(hvtv*s+7G7V(Uqov8NpGriQB&KsuCv2&t~9Wf#` zoJZGWx=(fB?(7Y0Te3SpoyqUpU^+?FkGf+gl6zh)bnYyp(qnK;|_*csv`rbqhJKbMB@H+%C_0z*k-2?}c&~YLU=|7Fgt2 zCCT>ofR;qpnU^R)ODVi3qM3&E)jU{tJf5(&;z%R5Zj+3D6By@}BtWXL*5K!~@xB>4 zeqf=*^;rEg zhWbHK;lV|2h5tAQFN6Mm#y*~`b7>U^U+H+j{>k2R$*P}*;>C7a*p_#D#hPE4^NE{W zX_63eFe_`bsjR%g>}&s;rf4-rQ~Pk=;8$`Dl>VVFVa>PWW_2jzLZT{rL~;O_Q2wm72-<%5=^tI3@W@MIwShmsZ_CwoI1*>c?rV%u+GEV1`eS z&YE|w(BRmj+!thY?aKBzY}aamGy`|2eMw;`oQ>o=bl1$(oQoPt93)kxovyt6NW4$L zqxYUkW@D;?r8}OU^+pcb7YyD#0Y8+*+6L9ohD)uJ_)oF|ICLPwqlIPj#8K8atI9_5 z0H#Cey7TCL{@72C!NQV^Y#BPt%0F=RjR{))^6g-4?ojm~mtxvAuD>4pfYTeSlHwx= zO@y17bqknGWK{*28*GH3{W_f>b)NNBh_4C977AUG6VkmA6C;0j4(^7h zArHW~)TS_);lB}>Zv>tq#omnarI8vF6$GW$m--(jsa@%&u%edJy{4RnYh5Q^p>`rQ z0@1jh(lxac^)!KnRw~7LGTJZR%;uS3{U~GYUkLGBO_*pwtWv@cI_K%fjCJkdF)+eRZt^2D@gff@U7_q~% zQWI_vxMwu%6br7t+DYWu{;p!2U%8vJdYA28 zgKCUrmFZVo4RtRBxarGbtm7R?sN4^eZpqFC!5LuD{O}@cRkQ0d+f&EWjqh|J zlx#1M9%(Uu?@$|W&HQGfpdl;#k*PRof16d#M#OlQ6FbWDwC}M)NWnwkn6CpR-i6an zzdtWjjO5i}g}N95AuAY7N2}-K<;fj(S+Q9x)yytvihVykx2iGjuSVhi-zzRaB?DMJ zUu`k&^-gb?J+Glx(yF(l!!U>(m3e$;Pm)G%BOL-@ARWs=2Oa%=G(YpzXG!x5$Vm}G zD38O+>qqrmy9hLYJmBn!(Mw}ZZT`Gqj3>7AaIzZgoD38&d3|w^SXxYOx1HG2`FgR0 z=T2zFf{*nZ|D(p*73x6WshqkMF;xuMlMnKU5T3So!uUN>s?mJsoctSVgvir;O91N7mY+;|7x&Ws$I@I;Lp2o}cz~hOePWy>b z59ei?H-Vp!D6T`2$ops!^2hcmkeT4{LiH#*_4Gy{wN25C@GGsZL(V-3bljlCfAgk2 z{QI$6-;n-ZUI;Fntf3weI*kqRp{^1tTlV0p0!d+Ni9tiyb-%6ETXTxxln1gx)<@+L z2QkkZ>W?ac)KEb7mUsO5NBnJIv`!;weCzYuCpRzE@5ys{$CTWt=pB6&<v z#o%ap8bmjVUo{-9Q_$hp81X*>U0_sbD_d@^k~h zP6ZWI~JP8t0U)(jz{Qd+Az2OSoKDPyX>Pc7&oY17c7IxO6IQ2 z#%&-vuaZAxm^vaPn0nLnR%sEMJ4o?|>AA+UG^OF#E$G{ZA^A0fNJQv|9FQGqOAe^j z`;oO&obYJ_w)C$HJQwqCF~_fxy6&(c1E(y>d2?UpV< zmhED9=uS7s&5Mt#Me;^>s0!#8kO-zbrRd0JGF2x7n+zt_yU(MgBK-t@8H99Uavc{q zime4BY=}C&x7j_*)4ZJE!UATBedKvI*xmxD;#Kqkl#WRM**1R^Lo0WNrooEyTDL}2 zB{aP~Z_pi(186R=d$H?U8zR-LxgjM(Dbte3AgXJKb()7Ty1YR9k#gAVbxZ|P2O>hF zJRD_PRSV>?9@SPB%TI*@ex|!kRqeq)Bt<2%xicLC zf%G9AAzfM!vN|`-+9FEW#~^~WSvCM*05}*ENq^$>e|GMXKh%#0xfGLV)tKb#)vT&B zN=@K#ELDh6i6U{gMFxHBlzO*x^uCZqb{*!a*e$c`W%V26;|fAWU>)a!F*Kx^m|b@#^{VF zKh+>CVrCkVlmsYolSn>u8<0iyHvC0x)o`+-Z!dK#Kl?_|;)yZ3cmOGmWGs7z{ z_tVvEO0mg+%`R9RId3}-L+eY+JIzFvBMD4dqO6x?|Eq~2ST5iRym~UlH z?o?o}C$Hk6rqi)HVD?aCM5)y6`V_T!%2B5HjNTKco7_l`g&V)-(cQ(-ixQEeRzPBj zd~|^O$@f>EPrW&7t6yVqPYO|Ag1E`Z+~Zz~t&njNctz$44B(I6bZg)Fg0?0u^RE&h zJuXlwybZF}_zve5&ExigA2?u^>MU1pgESL1O6>_n(rn{t%g*#)hk0&B>cVwm^4Cr) z=^db8*XG%QcN(#u!oTlV=N&-+mK7pu4WKUsWMAhrg`?h6QJL=7W*IfIAwtpbi@{&> zuuUnyJW&EN`!Nm7AFER{kG-~^EgW5TQ7f9IfONRt&4(#jRQfWdb?}$c`QL4-+0wR3 zM$ui(iY2u^I;Zf_Efor&HJ2Oba!6;OElrG<8IQs0i6$H4LQf3=b`pPhW_90hJVF9lskD1A{ zO91BlBGof%asFoMuHFBfsy?d7)C9_^ZtxGavT?w*4uRj-a!d2z{AjAQP*iGjJ8h1y zH{-df(dDm&rwf$vs2oJ{paZ!4(@T)p^1eI&eEcJbUw|b`3S{Of*tl)mg1Q(4+>3Wa z%GnWm{qSzV;Sfxew)z|@1-L#t<6`|s>SmP>h)H--W|3bdVCfZy`Yse&BiZHC@b5qT zHBxIKE0Y7i!hf21`Dmlgx7;%H$CNqX<8H1+Q0-$7~`@?Rg;j{1~j;ng= zHN;rR@{M%h1wAG7KG*X@cxo3RVp-oZyDn(TGZ3dlgChDEqvn&n)UPJsE0Y`S)=#9Q z)$iat8{+e1y1HZ>AxDD?2u>{TI20BFpU-r)r63!I#b4L$EBVCEc!aJ90UjF9kfRhJ zP4U<@Z`))X3zWX76MdPU7jlDR`VWu=w7Y0tCB7gVih)c&TwI6XpB$Pelp9b-H%C64 zBNqrSgPKY;OGpD2xmG!84o>UiUaMJqSe%n>$6o|)3L5n$V$PO2NCJ{oQL7i(wYTxN z$Gp$9kJ+kl5ek~E9A)iq(lMoc6X+WJcBPA^cRwo8&jbK|6bz|2$V*coaHr`7OBzI2 z4-klGXGk>vvc1g{ zJ$(-6@(EU*#l5%yqBRA{B;4)0aU56`cS+TGq|E#rM7^ch&$bN92et9LmTI+i=(9-F zp(LYQvkV_c+NQj061-CbW&#J_GOfz zkm!X2tJgUCZ|Z?8)u38XAlz@RTqzxJeha*JYL$AMH-)2=XD8YB`94eGQxWChU4) z2kN?+bW;a&=pU=bxN@7LIWp6fl5j~g8F63S&^D@ZQ>I^yHSD8I6K}F&5@Z%+9HoKjwWm@No{x!zt&cBG1|0cR5<8N$gz@p7;$P@fZPYC^ovo z+Vw>h-_UlPAH3ngt!JhqW~K{fPbfBeOPC5jZDxNV#Em$06ExGTW>vCu0tZ^KzGK2T zgy9qwJCMavfgSufKTe&_kW+VZcW!Fe)*5{y-yA=tW2ticx~wNI^F%FxcPzJS6b{1%gIn9sw zMUkD>V9ccA;aT`{ld026)+PO>zQQWZ9Y6A(!u}lBd7rmE>r)+m4p|W3uuSccfgdj-U2qJt2^{snjwx9OKV^%cDspJ;*Ba z6X6dWR@|)$Yz#CJ`Wy1VDs}gmwP*52C&Ipt^NOT{&6`01acBl?Cp_~cw!@0bkDY3! z%F0T(r)oCvpsG1oxNltaMM+tQ`i7lR6Nte`(}~G2l~jHnf#PEyfX%7MT>@|cPrX5W zik03KcDA%!GsDd0lwxxwx>0Ean%M`^?A69e;Ojc6od~apn{OLi@K==HV-d*DLI7FD5UCs_oUfOGr&Kz&wY1Qqb~jDbs?=yfX@K z5IU6vQZXNT7&k!N;_iA#qi2_yhxuGcLEl@t3q)l7npyiqwmRCCg3$ikKI>q|I zvf;mwo*V9$av?=*6p%*SOJNu)a4~_(rMrvBa3|?2FX;0`^bJU5XF~==0h0jR+{x}H z@k%?fX@}gl#DsG(UBnMQWFV=r+D++arf^$aZ*6xCShv#`x`to;2!i(X+l(4_O;s0b z=s=>k*E@zaf8QY1^Pn#P zWT)XmcnjTSp2hqkwT=97f}J?Px&=G$ciwAo-gaG!o!K+gfg7knIrjS!BiI=w++t04 zc@GW3zuD6ID=blPn2Fj#clekN1Ezg$9MjuArKa=5kez&fr@W>vApu~-&2y!pk^HD) zQ9!Lttva<5tBp&f{Nt4aq$(M$NPDi{d2u1cF8~3{(v)(Fc({k)#`_#lz8<7BGJHD-A z7!Wj*RGNAPV&avxjytUncou<$9=#YoAh8>P(vX$O!WtIthp5AOMmi(1@6y)-e!;O& z?LmMLQ$8~lrd2jv!4Ks=&FgCRm63NG`RM@0(1hq9KK1|5w>4Rt&wh`ErIxxJC+*qGxpuob5Yxv%`^ z+KjH;A=B*QbGYgUwZpegsdrFh7h#h!1i1~|oB2hZS5+lS3$5<^nk%s&6)&@eur z2^v^nzlZhrk8VnGDh(EOxN6Yt@tF6m=<)u%LF~>ZHfj?L5oM_b2d?6>v@ghVBkksK zZ=FYwkE6zpPy2#5@H{yN;-!SrSCV9Y;+W3vNbh=|61kjihFCK6u9eeV!-A2dP`BX` zIuPu_J0^^6thpI+$k@=`zThB+Sg)xiyE<@V^Y`HBJP~fA%FY+UD6z^w!3)-C&I}<3 z59qMHHq!P9KN@{W`_n4alXo46i^%K@jb)P(_!3PncpobV(BfCNqh<@EL$^PDe}I`yJAnIsax5lwn3 zFm;>7FmxhZw2t=FpW3jb1K6cHU{Q?9kcjB{LQolj{gJXR%CBn}wk zvS#$7mcXCb`8|)OrHg9&mkWgz2w=h+dy&l0C#E`hkrfopth8E>E>dCbTj*uQckDr< zG*0w1ng{Q&9|d;I4>L~d134F8BlPhn*KMSj8{RuE!0^OBJa! zKF5|Hlhyf{bZ9O5My{EV$476*5g>-7dyKpk!Cs|WRKZmVSC`(c4JAGfD0g@5r=wmQiptJ-;FEM_)SU$He-8dx z9^j&CFix1)#{i`~xOATwI!u{^?8;D`T6L)l3s0Dmj@>uutz9WFD|M-GJ+?qKu*rmC z`?U_nkHun$OhR>P^V>eg;CpstP5H)wzj=A9glBQ6C4RMxH$#KrAEcasix<$%qLjCb zhw+Ghm41-Xh0dTo89&>Ut!~=fNW`7#WRN(mpRP_tb6vqAuok~7S^24tTGfIW#j_9V zFr^5Y-S)&7c^O&WImAZda|fqE11LTVXQVyPb1$BvrR%L2lu6q4sdllMn!vq~I8NK? zaJ!v*QtK8GBGq7g+9nV4TPL>Y4&sGlvd*~++(HLt|NhvzkQ&JogE z*~Du{;FTS{3+2+|C74#TU^tLIC}`$h>mMbjT0yhMd78&QyTvh}j=xIYVTU!N6$~Ue zTyF0P;i19g_Dvz{z}s^JSzI_9eq`dd#-knRY;;g0TyI zZp_2L?{U26szF9$de-|Em_HpeZXWkgpg?}2`>T}U82|jvmIRYTh=0VB>bi zjc~P(u8NdN6b27OqHN+ZRj4wBSGr2WauJSHKA(w~Nw_Tuf}|Jh{V>>|nxkZ|La~a) z^5|*ozCFZ5-jl5|qyrQ|$XHnDhk@x-p@^cOrqONpfx?BKi!}!-EEyOuZRT?M;x7$G zVS;Q(qCkgmZe&QRiIbuZS=&cq<@#)P(}F29DtG1}h$O&{#>;nB57ab!=-%djHcUDs z*nFlI%h1JSsK`Xnfu*6l)vo}o^uxjE%2l#JH$|1xLRu!E1Y3F&QI~Z^Dm#H~Rbl^0 zWE}I9qZ4r5Quap}J)t${_UQ;|wRgeTU}Df*7eey9%_GQN>^QLW!uW#DO05O?P0g0r zuz`4H+#!3NP5VMSGP1yN*YdvdOh`}?R_wi;2P-?H6xwt7IKsdR3UJ;WV-jIH@hI3N zThW+>a>5k~f+8OGvbd#Q1#R&FZ$q(@$(U6|9Zd0MnT&LZ?`!o4;=xcg>=*@?#ux1| zN1mUB@?umRmOUsO28{BZSN|RFMjNn&_rV4R^6|+L=2rI|j`(6t?|-8o{s&U`{{zSP zn`-yp;D?O=4nJi5rW*ds;>Gb7t@yvt4<(hf?b>A&Tn%>OeG(a4m}$b!zm`rFNGZ*Te? zv9Qp!qq8xz(>JtoptE(f{_76@YwESpwKKH(hidm9vHwW4__l)m|6~-lGPN@N-*l|} zbOPThVIexeA`a>C+j|8PfgV8;1XJ1Pt`PL6P6;;(x9Dv$^lf^shGA(DEM(15-mg zLwi&Ef2TwL6Q=!Nmj}l`uC;&CBw1MTS-!)6Q6&F+?60Qlzo-3A>nz`=m;KuhO^?s? z{r#`-ZR=%a#%E;tXX@YO-}e5N{l5u+%l@z1XJh=fPqVW9Bm5)&jmrGn|G)9S;UC-m zW?%m+kNrR5f7kz2?r;6S@$a`h|5=aY8!7#-HvXpnZRekT{^!0jf9L=0@xL$smigCS z{Hv#b*Z;=Z{)fH%SKt2T|Eu0V`t=`2<8Ryl(~NTfWmKZ#|ujt_C(&dAaV)^{Mg*&kV9WZbvBic8k!&lPL+0_9og#EVhXCY|hyb9Vd{WcXv7)f?ff^j^o4@g$z`sf<$`$74=04_cmr;Fk*Sp<$h;XPU zEC7(R@iL?S);Pyzm|O|Nl5`jzh}&q1|~xA3GvG*NN54^kq}ga#?aR?)Uwq8 zk#l0GtDyrL&_qaCU`v$%7V)|JEb^iP5amSH4r&*2(0k}XZ~#C9z&4SJpl0imR*8@{ zdAFVbG?6|op~AvuX9J?b0x-G%z#5*$Wd{O8Wff7D8S+MWZb%3EA~i6Fd;g|IpS}Sr z0CTc)qObm5;RNETrwj}G@-NPB_1)KQ#i8ce1jso(meJ3No!2J$xO@wEx#z@GU10~n zme#=e8Z$HjqHnUPX=Jo{oA`h*GPnN2215o0g;np(nDb*LJq2S0>vt+UyGNgg-q&KL z_Y%aj>>}36ntJO84$QmzvbRl*jRSoxqoI$!(aVJC!E@^RL?39>pK7((ItCD+l+;gM zHmAA|=j{5>k8PN|S97BhUU78vAC?sx07IljHW9ac!_x@>WnWy07@x;NpLj9P-aFl(o;!>I>U_FsG0D!qXa;)L z`o=E5kngM87o|UYmC;QM->Z2jME$3ez*kc|$NC0(?&0zS{aXUdLu>N_^J6)B7JAO= zwY}FDEh3~ZDyc1`cpN|43jy4WNQ=Dxl&1YgS6h200eIupAY~o;lK4_6>mFq)gA6T^ z7@7S3gBm`srj2_gc@9X1J@d4vz0z>o3N{oEDyYNKZJJPv* zrIY`J8F-&=%<#?c45Z?FtG6OO>Ms9ke&SW(`~o5}(g$Y#G`CR1hOvm?CA;K>_HK>L zxVYp6`Fy+aR{pp??>62V7+4$tw{nCq8NhlbVj-HWMddO!5m0Qe4#w~xA89J!Z=~OD z#$36K$84L_%>7bE8kk`pygM#l-z&X*>tdel6@yDcF?6mQHN^Er!*I0bIRh2uBD?hE z&9{QkTT68-7+&tH)#YZHb#aRj)qJ4k>4-qzquUK`S#qf%20FAF$EujjL_w@`s}A}hJri0LO`t~ zcH%}`kW#!wQ#>Vbm!iXUISMM;I4rYB29JNjz|1n&+uILxm1VD#$zB-C%>L5R~+a_S&bif8-ivx6Inrbn6*7g{}jog{q03ku%qCt#C zxk(9Bc0pi|_N_O1ugoi%XtTHGWqk^=FJo*Ky?(!t;VQC3z$fB8Z2yYY$I{Jbtn^RB zM09v9>U@5g$xF_Nn9X=aw49C3sil>~)EM{{(Li3^&>spLQp`2ivl^jtU@vlZfA)zp z@tgU*n@VJHTQx1gOMKOtA%v|6tIYh)l{sgu0e%e@Z9wEa2R!|A)#8*XY8YQzMJRW;OgB?uyB~}(37J*!8X|-s95Op6)2mFpR&mK)gaIp` zr4%nh33!gM?cp$!Ga81Q$R8F!!7t2$XUH*K8)11FU64@rwhEYp3+ys*(pAd`Yj2sl zu8DkEgI2y9gK9iQM=-&Q`!8n&RP>3DqP*pI_)P@p1->bdX`%f+mSc!-mfz!`eR5MtlaP&(f)1Oc6ee zfS;Fc@7LsM1zP)MCw53ZO3O8JVvC)}avoGMbI>fNQ<+e4dJ%SiTq3^f4ZXU-PFRnK z{=mrNHuD18ekk=^}C~mcIzxBn3L&49|ma12C5$DP9yI73B9c1gv2Ymg^(xl0wW*UNn z*Lq_Iq;b1^&KDaAa4JWXq4|`<7y0_5C9lq=4}&`7r|k{8xk1Lmu_&o%2wF!tn~f_B z%c`Mj79MVpc2X0_Fp^NH3wW(Wgzd5~DLlOvc(asut1?>nj)p zCiW=6ls`G!WgA)akCurf+OzB2svQnU*bN`FD)q zzB8{3BKtTI4M~;`+xelXPCA+T#YTDLyqCacezCQ}<~I!EaVFXq_gcepSC34cd!6Aa}YKy08qdG>{9j6gl`Ggz& zYSreHxH3@l{b}|ajuftuF11}jE<28n2!=cnjcLuLTD`&B_cFWngZzX-P|%3iY{XP0 z_RYE9Fa2a54vR@Cb9_XCHv_CSs+-C~ZF4;iG<>&kmM?%WGns-%=i!I38n4*ot5j+! z!&FikLxn)Q;Z1%dd-ycEIv|qobs6nit+4y(4rit&H>9i=PwJD=p2pA@^8YNr^?Z#Zb)^$Q})Lni!4JW*Bh;laX;#L(-@ z*DX_X-{d@r2}ec-scNkRxXvP}rrJ4fUb~-1qTW-(CeASClC2P>LBkM+MHSBjcZ!^F zE`vsq0uNX*3Or&Bl_A1M@W@0(fEW`Y-idDz&s1+~Rhi^>2OR{WI>8-Q ztibAJIAo-o2<~CF2u_>3h?iFJssVGl=PIs!WeIputCq6h+yg6AYtN>qQ2!MYuYvAP zum!aUxmIG#&wAfWol%z7eAfa`%Y`YoPY#1-CB72bWxsNPRF|;{l7PViW>*3P$?XzAu znrz<~8hHnoKN+b-sMY1^)6-tWm+7y&Hm=@<_Rxy9wF8F>rump_n@o$hW;zKhH0`E9 z@0x<&CcQ1(KlLXq`M-CKT18cJf?II|2=Hn1TEBm8En|C8-)vU7F!1ek$#-V!rguTg z=(DVzh`&9rWwKRJVLYm82Bst~z~~vOb$WRzdrqA7uA9S%Pc{MjrU$y32T{%pRQgqQ zHZC9~wHMlb*hxO5-*TnI)+^@?{i-hIsgTA|vNBkmYC+zr8>que2x=}md7DizgZIo! zcAICXpcWSOflhLPLU$Mav?U$E1G;o#f;K?4PQYCwe@bHkClxozFZ05!GqNykjNzI^h)4weT!4WPktp=Sl!u4N6dGGeflB zB9wD5Xf=5SR|B@Ydir2`X!HpqC5ZaH&Pyka9=trS>>o3)+a#4@JBOgA_PrHFcgYkk zUdx+VQx*>ptCCAIS<1B9^71T@`0h`^OLG9$Z(570OA&zUMTom*_gcUKLZ&D|bLF)B zGlS$uvV?jFd-RB)L8-h_Q8chG)VGg;77GginajEzp~|CV(9hz?WSAQ%a*01Csff3l z$Z^VRJxk<7N4f^1tTntO5_iblFK%>@)B@fiB~9B{anM}ijl|kmu^^<=Zu73nm|_dh zA5)EEso|S93v-??>OlKp54gv7Y(^6snSS{l2BxLqAXH*NcXtvQwN;iEOML$KQWE4) zsFqkC=D$jTs=PuY^>gt94cmGg+m@x;S(W%lfX6C4Te2!&JvyySH1JBIg#(gN0D^39 zsHX;*W@*00pkQ!Z%XU#G1JvcAqSeh+1#jkvP%-+oaK+Af zOH=N8_db}^GjQCD_-m4Vhme5%j#DCnKNxxmV3Z8#q(4CnQZ>qTi4iGq6uV-Qxs=`T z>AvlgTHEEq8wsn~M{Sp7fcNyMRn=Nn$8qHZpY++Y zSf2MXo9{^MwW-JDRMvtrodTrFF#P<-p_Q%ImI_OCy4yY_ef<+$Sq0j@0$oxlj)9oX zm9o43N}r&6EK5Ee_mCO@0AwzeO7JVy1|Cm3%n>-{zz%B9gBgG*NJbPkd2ZSZOlEAK zlE(yi_Nx{_yLvxYV0oQ0QIlboS%1IKvq30P--lfw%+*9exvNR2Mq%uY&heI@MR5nz z79uSn`;deBK&9P<(VWg;y*ZH#>dBe^9PPb`F2Yh&)8`1e-N;5Zh4a90jtg1S|lCKX~ z#IsM+aGSh;!AAn{nlQteAr-yW;>Nn%+hO`D@bLb9X-;q|Z=E1`$PrWVsbgg+TU_%44OUWK3jDKEmx3w#%*4TfEgb)2&@+ox}@1OM9MI+%6JBZE7K zG$DVt1KQ%rjiEG`%B+j2I~^Y5XvW)OmtNdCEA(j~#bzP1g+VxgbC^m#6TIk>iqQ!q zOY0ZHg~*D?)l=L*biz)sv~c?5Vkh|sg;!wNWp5wrzh&bF=e_KkVYTN;tea!B=_6G2 z5bWMtY#RS6R=yC4yG{UAP6e=Ddv7M;3r9H<$F@B|tVo(b@=%XpO4lM~g?!yQEN5>& zUZVjs6^*nLdAGHP)_MnA7C$!y>-hP;|2nAcV~->s?*!R$^Bz!3s$9VokUx<&)wmIh zBJ?4%co5K`O0Uqb8AY%(`z#`p*qR47ma(c7w8F}xTe^UxrV3=fpGu7axH;b43DtjkJ3PZHq{c;@rv6Ochne)w}ez- z;yOUuxz&;wn?TYPSedcRn9Iaxi)|pkAD%&QL{8(CA=1F@ZW$OsmZ9tVBgZioa`zka zvp70Iep>Iafw&S|gfzvQ{i{$zh5Q5}dYlq`g^g8JhWGCGfp>3wYM7!FPU=_azy1W$ZK7B4* z*)TXR_$HwXx(uf9{WgPth2ZncQC-uXMB@HBKvSgJL3ZrWI;neVqN*wV;>RjqZmZNr zxV@)o1?9uzI<@EtxaG3EUvp(emVKs%`k2xv4&y@Xcd8{}TQW-&*q_FuX>mknY18Wx z!WJB-YE3nHh;-53g|?O7h(QdX9ae%1?X7-&-zS@%BttIPte3RPqgm^vfbk&mzjgW^ zd4>u^R|aUVWqg?)T$@N(tCR78K+S5Sbhy#htl9!v%`0B`vKeU_k@f1=--#fL#_(ep z63g<`wWelP-0SB$BMr@-rzm29u(^SzRp@orC$3CDI?OR9R@(CEwIjQt<%<)}WxMlw z9{ya(mQYt*+iERo_^474{4|bpjwRheI{XmhXqHyVXByGsb(G@s$U(a&TC>0eZZHbL zD|(STZn?)C>Z|`t(v5s!P=r2hqw;t*+q}g!^(o&K^(v8J*ZYAYp!yI(3l-x_G!UA!mT5sWjBB8 z;mEmjg*ZYMa5R+*Ajmlw$i~t=KKTEqwC{lHxqJW4C?qMVv_l%GzI!yZON*8?khF*P zps7J6Bcp^0NlAq$NrTErR5C*fX-K6ZMd7(V?%#d??#}W2pXc>FeqOg34?y&avO&?ifsdH?DBhO{{HiV_C$nq%O z^A*4T@p8_yC7IGT4vJyg-#9C~d-RUAwXGjLB10Zi_;l=Ju5QDnZG5NqPrgf>?Q~{H zL+kU7Lq~O3xQKuS=tab!ED%zN_86jWp++k~(*W&$57b ztx=0ldkK{IeL2?s^?;`&^QC!A{DoyESqiE3m!iKEvMt`+O8Zu$B@?Sf`?$pSX{+zU zA3Ya&y(ovJbt5(3NJg^SbXuBv+`^);vZg1*E41W8MIX+N#+wEMT7?pnaH zv8wjewTVfVlfYf^IU#CX8$yQP4G8HO(i)u|0u zn|#Ra*BNkL)%^La&t@ZO8t(*GCYCQtbbr!0xYv8Tsh(HbNwSA_-SZVj9rp$=a8W~) zsqDs^(g|C`Ji0WceqOsl-oENk1ZR@|%&r$)vz zD$giL6ix~MlB%{&ycpkD?(6<)&0)3l+r^59WY!ial=#JDW`B!ybybV8?Hh?Y-SKSb z#N+Sl&%M~{5Y3-9PpDOTz3kz`GsB;B^IYD$xu@}Dj)U>)R0T0Do_cPTD#yk3d+)W7 z_OIbp8g_erz^(f{HTq4{s(p4|1y?^e8>?=1n^+T)9wuYmCE{$fR7OmJ^6o~8b${J0 z;jnX+RP!ZXce2!se+{yZu(KOq>m0k_dnGpJy5PE&EvxM2j{X{(e_dl0#|dT4CH|)? zLJn;2WX(9(uKRtoR8Gq(&vd5U@Y}j-{%>>VWq&SPHRIIGtvhEe`&_5z^{Z{C_v6b~ zG^&kXhG~U9$+gc*kk$6=Z=qZ=d#UzGW}T@>$;*o)Wl7a%zxUSo9Q6J&8QG#BQ}}a5 zRmyv34ujsAR+6#~rFV^Yi?B1eJb88ug*pd>ioWBu>B$RZomUfYy7iWCp=)CO_!d|5 zmkR1q1vXYo-o`v@c$~6G+{0O5vhG{s$shYxGp}kN^(?u--X3S6_96S;xMED;MBkZ2 z-+RL!ZR!2=gXcdU;C#S)u<)`<=f~408FcNEdjs4JAGh+@&`-YX;kOk}Pu39DlHBc6 zO{Od~kKs?}o2-8#`n>FdS0G2XZbbtAm?nwnYG@rZlARy#V3c{^C|+p-%>fh zpT3aju+Mf}sj#w}vr59ji2K%2A;(?Ck1m<&m#ne>%v+lzdqy)%Ub1c?tvk%Lvne;^ z#mfV0yN+p1N^Y7ZT4k*#%oTs0`;5W8mdxaK7nRcmTRIijG)aJ|5Jp|I^mrqn`Wmn+z+xTcMW=)~ zMuyej-@RNW8erEEd#EO2{yUys@z3^DJ8-m>xp7|^%M@vUlrg_gsPVfV!+qgA%l5XT zi|(e*>1=;X6H=6&;_{Gk_1-yG_CXg;3NWo@}*#pu(nr|wj-t-J5? z&CL`0USydhN@+=J&;Rkle8!XGdX`to*^26w*6no^3I@Ttmvs-WwqZ1*7MqjBbL$;mGjr6ctc zwkiHMjqbPhKlS?PtR_uwV;_C}cEzvd7vDH}hOtAMBEsjzQwu+oS53}8U$pSkFk znCnT!ik#sqSGgH;(-v{^)bhQsOc?m!V;uCoDAn#vS9kj1hw7&KWAhF^ON$tt{G7bF z^jy)_N1S!lP0mec@2=t5UDDov_1X7J;{1z(HmwV?(tEJlqW8$7j=hQI9|Uz=Z=U5r0tyFUN4u7tYMcjGH?BrY77IXRf_=c((j`yk+Fp)83WQCeBX_k9b7&NO!v3$@!7` zUZ>3ImHFa1%R8KAy>l0$x7IP{8GYyIocO?>wEy_4qY?2D>=lld_wQ7G6sk`AY^RV@ zQ#xc^$59m-=xJJS#($;h3G0_(<~BYaoO4(pdY*HTag*+AQ9)X-oFn@J+ma z@cLnZvBZG)(^vKV*%FXa^g5BF`-D(e}^k+8QXnE=Be5kFg^u&y?kQ->go) zHzd&JvPS#do99}VoTHNSDo#lLcvb1|Xms41qt-{dwlqY0@zwxpuRyLmkM63p+Zqo0 zYYvgFPh^MuXiqs~8hSV(PT(pzoZ@H`BKltB{pImf?@BeRtvTcrw(;pHM42sNe0&vZ zzco++`gm^7<96ID$sxCuf5xnaC9LKFvz$i`TRj+0eJX70A~c^=%ID33Pt+?64Q)`|yd1i<*a<(qXTAl2a zwRTqSGnc#Xv!lxTzI%KxY4EM-J8pX|`ddyIk8a+fyc26b=$>-BDkz z$JZp^>*qS>3%R6q6gU~rAJ9*{cXL~qQhlv^aU9e8$eHIebT7)SEnkye!*;uTE5hcO z{e61K${B*S{LL#j?4xt>i_Mu5-)5y(y=%xXUdbRwmzz`I>-t&z8oX`9nN<)*kcT|{;L1Fxq#Z{Mhd zs2Ul%2ed?8X*eI?RcF;WZrRKTER$|OQDYz}&^K&e^g8!~NQ|krxo4bL+e^!JqxwIq zlmc>JaHKmOP%X1RGNW&`h>&8}yWXf+&h;sJ>DIOTKiQjf442(#VY!x#^b4ylY57u| zt6$#TzOrz{ZSvak$$3Jx21|n*Oin(0T(4WM>96{Aowz~f8=B*fJ4v#y_&e)tmr*Nk4tXs5B zLBPAEE5)2wRAgJl+F}i7b&I3jjHos!wP*i?} z@9=zg#)CBbZsfxHAPJWyTa(Wl>kKj`jMIjLhM0rzz;c8B)Qs93u; zX`H8RIa?+pq1BzdQa)4e(Z`5M&R2C~UNc*I_ZnqOZTY;)JHI?Ib|R{FX{wn37c(h! zcHparwiSDuc61t19t=L6x&B1k{kV+&s?zsSd{iFFlO`kSrp0oB8$U}Aw&aKPES_my zTr{_NEaH*yWZtVD+PMY?$;ro!i8Y26o*$d49KX-ObrveG=5#f`tj^kECo8ph&8k!CQuSTuDhEfoV;q+i z+?(k@iPQ`JB;mW}>$@zOiZ?Ei?=|Q8&+HNwt{Of3As~O@X=5whuIkkMO=77-A!ffU z8$R!LieBYE%)Az90VQ%{tDjHElV#85uunAKD@l_`)5*(P9PaX}F;+ueJhwxtWLxFI zvzvCSTlVTyY~q`9&eGqE=i2^##);Yo&awq*rqSVBe!Y5AJe1=H-<0XglaY5QGFASW zK2hgb)IR&y{BP%SS6^UmU%xJV-4Lz7gsEejuUPr&aL>4u?+VG!xgq!E=Xre_y}c?a z?*7Y4=}%tS8vF)a<&C_9&oqOhpSBy@h^9|nTWVsv*-XbHeq@0dT`}|LdnwH?5>JH9 zeTJW1IZr8J*gJHyGc+Cz^z~S;nKQ=iCw1|-&^fgTpCVJo<$7|q|-7i?4En|Oj z&&N>#<4q$c_e4)QGbZhOj$UsM6`1m@UTVAPq*3ok%r^GEYpn?vw^;F7x;E)OuiiR- zdA4HQBHB-P-qux@zh#fRX_*xU?$Cc#-LdY0eCInIu{q}Ut&g-GNQFy0kA2^jvQy)k zW`=n{M~{Ex_l0S(J5Cg6gtPbQKA2~J)2H+El^ON>BVsL$?_XW<$*y?b4b>3s2ZOst zHO@aTOdb|k%r_n?Xv{Gb94s*D>`_usrmT{j5D>CW@2Eqq^nQ=~B`?e}jf?ASca(lE zhzLD<#pIsjtYCG~_x0-9QIpym0*b6J$n}w9s(8Y}?YDEJTE1|ewfN!YJWrR!uXVRp zw^UVmhO^icBD=RZu1<23&NH@l_l=BFv>X|I=rFT#NlN&e45q!o**n7WCh9}UWxTss zq8oW^I8ON-RW3TpX<%nA+%TWauA6a$D_}9d6m3CPWY*pr4Ix!^BdK~kD{7Z-Js7+v zT>QIg_|T!34ZPQT)Ge8jbvknd-4mSNlMMH6<=c}|H#1{taBIRbM(nCRd%|tn1izPm zU;Hv{Y{)gOuIr57_UzKP&7N9HG6(r`EW4tNX6Xq8-CWt~Ga?&VEGfYGe!sI(GS|hM zP5pa2lP5ARM0@DY-B$dIt-jhWR)e`|{`Jff;Z~+nkY(Vi#1$E`=A7$nIZUr#R(K<* zE_}VfnSA~Ix5cw3E0b=|JXu>Us9m3GbtmO(LtE|JV}AD@9CxwnKKnl2hx?Uhe9INb z57kxPrCA=Yr?QS~JTSFg9>g(}#7bT_e!0?h`>gM)svpew`Nd(kq9A?lm|msu&j90w z$Ni==_emXk|McgQP!DZ`2YrqLvv)LeZNL7=bG>4`Va;|?Zl#gDFp;d9R|T^0PkfkX zheoeCYG9t!VwPCs8k&%1D*d=#qoDUAka7wl9`=a-oG+S;bRGE1$_Js{NJMc&NuvFq^6+ zvc;a^^!QQ^G?kQ`e^dPNq38GJ%A{`L-8lv6KUPQg4TnlwM@!zHD=a1N5MQxIqg{#h z%hO+s<50z~>Lsp}3zr9K3Z#X3DB*$SJ(Sm)eiGjue}wHwJ$rds|B=+Px=PW5%A279 znq|^iC-Zg2qb=d{i-mf!-`gbbSUojn(&TVK9g~Lm(nvNlb6) zz;YeUEXBC@UissF^KQol6t?TUox1AYS#~wr)9{<1!Dl7u$p_Mh=O_M9;kc$DBvqEq9 zToSUM3~m|DS`anskU&@ay)V66FT`Fjt;yHkHKEkka?2>sxvRG+;VbjYl6JFiycH4_ z{9l*yT`@3sFOqt(M4Tz9x6OT9$sM0qAAtd9zwBbehg`d@-By2yI5aO`WW319{N+QJ zvKQSeg+p~BjI?KnF1!-^GTh-V^z}sFxEnq7^NsV}Urys0B~K46I=`E5rDUzY^?{!E zoTGUSSvDs9taBKl{RS5o)%9p>MdyU+Uk zEt7Eik6d*=wQRq$yH4w8U-&M5d%2;klf@B@m5XO@9G!aBt+fRdHi^xz>j_W$=_>n)ejrnJ zAdw^Env8DDveu;{uN;qrCnX=1?KY2*yQUvKzhrg&j@F3ubQG=dc z|}}I%wTaawuG{(#ts3DiOV1z4epNL8;p& zbKZ_dE-dO)>0Y_OiW&RR;Y;r$o5Wy`g!~gzn-?apPxLozv*S@%dT>d_71w*-gNmE# z*Im$G;LucaC{p)kP|iw;Btici-lHAE>q6tsuIP8va5=(sdBfRc^Qts1=Q?vmuc6&@ zdskVBWseu$=H3+1HP&TSr}N;$+EqRa_hxM>)?6SIacSFGJ?*&mbj62boE|X?O|H$N zc6qEgZ`khjQCO>>arOAu7t92^{b9#kJWp|cS$yc)*z8@g(*rkFQlIA?{n799FyF+5yO6s>-Tlb^7LRpr zzJ{ODj+d|~9}C-35ESDbHP_;Pl*>*N&7Z9^>cVm*>EeP5ZMBM5+#k&B$iAq*{0#R) zv-R}~!cuGbLUu3b^ek#0Pkmv&ZO?V4Y$xzUBt4pQlm@SX2?0TobpWJef+Sb)f_(f zu3fGb?&3m?ojWSJT-4}n<-M%T*tD3Rvla8MlKbk<#&mpiW%u6hKfwK>N@zHaK0k-A zTkopR@@1ml;}J@So*4`dZkf`b6f3_!k@D#3&To(T6oS`pT>kO2_jpO$t*qw66Q32- zHW|EQtEsLz&wb1EM1R$y_{5?q&Fn{u(wu%Bc&_MMyoRmjn-sJ9`j(mMUe|BS4hp}% zk|(ZeIh!JCX(v?|vGdEqT?c0ADsAJkHHdZVU1>9K>D+;kb9H*w24P$5<8S3MJJn-z zrm{8s6?nP(+ZR47|G`y9sb>8`55ANac-jlZO+%ieu1QxP&Y~Y{q zwU3w-zG%RIjL+`=lB;{ykwWflch%pJVJC8KQ9z5)ea)B4md}{&8^5X6rBg|J{;IG` z`_e*0s*|;nj$Y5C3#OW@@SQYka#IT{?y45;cFn7iuAh0HS@vA2VkkMy zXe+oI)X_~F9MrkqbJO&bwdtxI!E_4!)%I(zoyLV!=B+ljFs$H?4Vr4F9ML)>n3sEh z#fIL{TzRj{gawasY6}IR$aSOO81=NT|wI^ zYB0J}iA#DXJ)vhIEA*4fEEn9Bux~nd(Z_ zYT;2i6D@(~dDQNlD9BmZ&dVF8w%gjM?ZWN5?}re5Sr9 zXtRUv?HvJ+tSb#Cb!{m_JB9O=BkV}a!fTUjdM^*vZlCNb?J=r${+M#&(L3?zZ_*mBb?Dy zP1i8=Ghv;X>d*_xICG=x9^+NWarRa3l@gML2TZl(dqPCb?$NfBeY>v9Yrk1=C0I{p zP-a%p8;!#C-ri|lk%)Ok)%-Ui=Vb?aXFset z(7(mfxn;AIwbjj^-xZvzW*Hq(uYXy7Y@;>Hu15d-L8JWJ+xP{K_|wjfynnU3%1X@e z^CrFKDyc4G`$(hO(k)b#zVmtU{!3|{Mz-pk-@Sk4(f%r`AnB0I8Nqd`M|bTOQ$E_2 z#xZ-v&3Rjggxm);ElzR2;Mm>TNvb(nhye@BlBeD1rv*2u6v$Bk#5Hb>Gg&Ap&}qK(dFT2()jW&slTEz72Ir1Bzmppbkruljm#=(0ucp%N>e~Z* zt$xg&FWS0B&SZ#6ef!?=%4JWE}3{)xeIXWKPPyBpUF9hX^`o~Kk9{~>Lg zo^Fj4Pw%kaq3i=CT!34DDt!Hj+G+`5`7O=9?0YRq-@Wql6I#W z(#KZvC&sr~)Hm9Yb01$1YMEJ^`f%)H@z0Nmi+9ZBRTS4-98BR;l3CHUGgN-vV56|i zR*n9zXWu<4Hdz;?YhcW$TJQd2X<&?vmwW849QrZ&xyt6g8=6%vh_E&}TOOBhUzLVps+4MRoFtI{^-l-2~?;2HmMki|+-i%2}YkHMFnx+Q-D%)7c zaV2-pA6EJ#ZJnFZ*Bushtje07YooDdOI)(c=78hPA#01c*q#tm zD^d_%X8mDaq+{}7kt*rq{^Wtti+6Y*GNdIUY>)H5eNARcy$lc(zHs=P?2RqFm%gS1 zHI=`q^3Qx~U25iHP?f0;e7d|l#6=^vIo z4XGT4Rr2On-phOC+N?O<%zxsNh^nJr@*>5V@}VI?FHe1bd{A6S`+jGAPt@M1?6uwZ z<94jJoa=L1E;%7vB(O=RGB&|tK~0yAlE&CRQnOWxfUeQfD~k{c>M6C(KQRn$!XQ&$D9 zpWEKNSF1zfgi1`(iRFGa)}7^k;k?ZsysjT)HY#@g+O{a&>DoS$*f!foWztt?%&>pP z(5NW&)8}5f*2?ti-t0-aT^>pLm+fwSx=?fdI5k5dj$bz3wf%8H!s&<1b5bdE%XHC0 zoz_n0<2dWpHKQHkrCb+ZkCt8XXz=Q;V}9DPU>u6t)9Dq)oCiQ zJteMleTS6(-b~9E%~A?GW>s8zkz49o%FL+yrWh-Gy}>JZr6~ENuXnS)a8>39^^$#e zj?8+_rp{>PQym*^Kk=+MYV6VWWefS;Z!F=YSMa)eUh+uZ;cabFBDaR60RO=DNY$Cn zIf*^uA6Lxw-hZa__(J#>DSml{<+eW;`Blyp`u;}f&w*9D=I2IlHcITuX;~>>jRhd2D5EE_N822yg`TCSS#OcZr>J}8dK-qzB$KIw}oB3QGG|H znV(hc8cZ&iA-_@Lo) ztJRk@rB!WSCsPk6xCv_6M$ffi81Dc1W9e(_>a#)|iVa*kj(in4FN60l|OAA6j6QsKI&;^#%`XVq?|pWWD+aiK`#E&F&Pd|`T|V#IP!Io%7H%fIAyST(4x@R)s|Q==~V^jnL{A2Fr|m4c^h z-l)btx^d^YlS%ha$);lVC!xkOiPt@)8d;v*53e0)d*)jBYO;5|8)xHYnY^OXW#2B8 zHVybKcf8SxCjMjJKA8qD`=@cA0bc|_8~3TSzZ>@%q(3+AyYKXKckv-Q^*wx@mBU;De3gBn zfj%hIS2@T%zy*5TeS-s(T|Givlmk6>Ct^EJ$w0H3jcJx-B-ephp*#Eb~ z{;&ReqPzb8)IJ}e9H<HvoXsYV?{_Oa(HBiLsQ=%! zrW5Vf#1p^AGl~Ba|0CMDiT3h;TFHr4b)wB2TE1aCG@}#Gk$#W)r{x^}ju`XT)4vF(8^WQ(i-x2?x=*uU@|NZxW^|2Gn`Fj-cH)t>V zKTYB^V#$B=rPWS9_(X)6qnk@0Fs5&?PmnZpi<=RjWeAdHv;SggWn&NLKxzBmpR|ys z{gx1DPXGOP(quC6It%#o_s1~^X(E2!{4Y5mGYE40zsyL6UH*Rg?{kGo*nj;@A^o)$ z3i;H8SI*vh(-o9?c(%?k?Ie`D_6!vcl{JjFR0AJ@|Czk+e zc|T`Y7b_PVMY0lw>#9&lBsPggf!QS569DRI<_gcAo1WLp2|Ga;-w6#k>AiPMLszj!d>1@hhGb&P) zDAMv9UA9qlq?t-|C7Ob?m!D&hd!UP>bjUwX(3Kbp|Kf`s0WPlG@D&j@lN-J!@}FPQ z3_6`kmv)u@4@P5=fzgOx(mwxSOcH#&WjY2wAs8GMn*^Nq?{RD<8{Us#Y#Nh_jbqV4 zo~A!bXHh7~TG&h$jRNd4Z4NqsASBZ<2L3Fa$zTDCO&>>R(LlLO$EY+aK90dg*G#AW z7RKq%lIe8peH1nw-3Oh-CS+*Zvotoa2ZGVz^ARXrXiOFbeU{3kkkEN)Oa^>DX8Igd z29r>h)8?g8Nf=$IaBS$BsT2knwCT@MC`>AP9#jgAfu1>q%x0l`BQdEobZ-0^zSvZ*enJUT_1_TBt(4rI0lW-Y11(pMtc^UL1Ck`VuR90<{*(t6hck?`+X!j zup~kQ7)M6=fJCB`$OsK!6pe(w5411|IbRsZpn(paHZNdId>jisHxijaLirgmD)GIP z>F;AOsMz}$Z1j9dWG0zV+0&n8(&*T;OeV?)Bsg9Ma^`?hK?5Q0V=?I1epzf9KJK^K zn7$TZ4s?AK65&`(pMwHA8KpgiOl6{HL?JU!okIdXWg@abV5p8DQK&48et;2<(zG>G z=pev2Mp(7!P{F(qN00a&={xzfh1oKM>uLOS|CB07!#ub zi^{}wB4C(~Wm7;fr=K|qXirA%0!SsMH`r`Y(de^m5@x4i9O_2^l_{t%MPR5MBqB~W za+ZK$`VZU#3MyNGQPH&khWUB~hWe}ohVnS@8kvRAh2THb=8=J-sNMkQg@M11iTQ-^ zK1_~SERbo0ci}X^_)MogjH98t69|R*G{BK0)Sd%IL3sl(aAc>?L0~A414bv~<3RJG z&oZ$%fJ|XwG6NWR+UT?3f*^cK25v!pE&@Y+BmzVIaX2F?#%pkHs4q{Z!G00i1BS&U z1cvfBU<_101I8kuJOmgTe~@WRCIyjmGL1#Y-^XI2F%FDl;TW5O`Y-UkJj_Q23_KHr z_Q1QCYypPRg+a%81H4WmE%k353$lRu)ZhXGii`uBg7E>6o`TSiLIQh<*d8*F4~>t& zqX7qD`W)bKQHjLQwDp0O#AJa9CJ)^Q=xpp+78TN%$ol}pXb*ZElOw=TTLGF0Bo2Ka z$T`ZBpd--z!n2rvMPMkMfd&-R_7E7lU$FWt7P2>>JqgE1nC+&ssWepQ0LDOlDFQ?1 z1&oFIqI3{dl+J)bMrb;%0Ar%Q4+ts=)!BeiQF#LllW71TkV5AG@j&Q8hcpcu2LQ%G z^$VR1?l^LmfDyUSX*>xS6JIkEiy`Q2(5Hwj00s&geIJBY*gn`0Iill$fcQ8p7Gl6^ zQGWw4(16q52N)BzwG1K&fY1OiDymNb!}3iG5}03v_JC1Q8UO|c4qXf6kr15&kv$k- zbQ~2jQy9iX{U$I_WR#|WL2!URONR|(7#MjBW1+b|u-p((qvIfzfzg@4L~S=DK|tG~ z&qC;jV{}ws!Ly*W(PvqhUSp70G&Iiu7$m09XK_2tfT#?WX}~ZY0T>obGJv9}e+n2K zl`X(nsLp|E2N~mCfY5jq#(^V??1N0f>=pwY7*yWi)W{hBL3D}g9O88Gwa`cyKa*)x zjEBIv!1xq)hQ zCynVGB0NI%3xw=wya3e&EKdj+9pg2K@=zNE<5;MT2kdt(_1}ISg95%8whug>hH;p$ z0vL!5N-Gc}jDAp$!stwVvl@LCL?0gq4`bu#sGrTC&_I!6<8WI6F- z_rcx=(_-tRWAO|;i{(%NV`KUXJR~;uJ{XDZ7kqSl9G!uW11BA&0fUA5v0(IZ-vT0C z{5+Uc{5+TtA)#|XatWK4$-;Co1xhEF{DS+3=>v#L@NqOu7lTPb<9!C?pE0{if$SXi zK0Ho_>I`TxbZ=}bW_!RzLSrU)mVx^!J=3<22)sMjKE zrh-3-?t=<-2y7fU1K2o7=-}h97z~Um6|F;nAOQ8zwSd5(w5NhF;N!q>Vb5ZS;5{1i7C|ffTxVsqZl;s?@_q~471%d8Wie~eE>$qFmRty zzJh8V8rOm%feQ@i`41-z+x@Hhn%zhApiSjsL7+v7dF?|3SMiZ8wsxkNE0=ysGR0Yh^^P|?J4;RJ^H;}Ghi z`9z}fiRou3y<;?B(s218()TD20fyx~Kw>ca0as@**@tU+7@Yyb=nSDaP8Z1eqO@W` zxR25lFf8W*H7d032dn#i`EZ*545=l24lpU$ykJyN{Rfr|t#blvfMP@V05HrCW6{A` zLB~N>5X1hUPg#G^r$pF@%?kw;j8-rOs&|RvEQ&$N3-hUoG8n2$*ia@$=>jP?%vXW5 zJZ3)t!|Wg|50f`y$=Do_Z$kN$O~+$mHiL@!NPuB+0EE9-4914E1*#9=RuFbZfMGnu zhLS77LlEF#cOl?(vAahEhRQT}{7?m-&MyRp$|Z0H#(xBc@*fk@NT@y~Fx0<-1TA() zj=)fv1{Fp@bE*V}<~t#QM@8dg0z+vEmkGgHLHEn1Vsrs6K=lx0pCMg^JPU<()W3pD zZrD9CqP&mBWdw%uIFxbVQX4u44XZCe2?&@H9S4RVdls}dBCAlIVWN5s0z@Y2X9I@G z+iz2W_*}$|ENm^1yFvX^@RTX2Trw#{l@HkmV5m(2kD7t4889@?gF+xC(_oRIa*xgd z$BW1ySZVCO8E_w#UxR8H6#3Bifv}?cfa67VFd=n{yh`o3e=u6X%sr@Z$K3r%a21s5DXGJ z2i!YEY!tW=kn}*uflGtxD;k({#703j0`rkT>%xsGw2u!)j1Dg6qI&E(kKdpk$FXL*WJW*MKTm&X);^IPAnuK~)!o3w<9vjOcc7<>An$kAu_2>Q-RzFgb_YiCCOW zVCZ?Uphkt(90&~cRRDv;GO`xHQ2j!TLuo}|sQ(8TMAX>(Fx^g!L*ohpLv00tp)w5^ zxLw#BApAJ?2fAQ)>4^8Cz5rnG8+#uMy-!GtL-TqBhVmbQp>Z-`Y?Pk~46S1m7-|Oz z49!tM!wLk6=$dI*9-SD6@+pC#`jo&>zY{RH>W0lhMtwbE9BQWt4E3K04Apgj{qC>& zcMMBls9hj1RId>jYG(k$YUKom`YHs5`Vj<%#vcTR`q_X1u`s&8#5ji5--u_?xRJn6 zzXUKk>L(HynrkL7G#(@{RG$Kd={f>K{S5*`eE|Z)^crBOZvo@}Agi!loK{#}l6dwH zbiwkmFb;lWbjEV<#JE4u1@o1Oai~uN80LEu*dOS^{sUduI9(t%#dH`Rn?i90yPrc~ zXgot;IKMz|0Y(=(Xl;~M;CSL|!S2Sx9Aum>a9s-HaXRKB!Lx9Y2b&ka>qof2_?n>_ zgFOqyUK~T?6quKa`WArwL00L1kW~mPFk1%oReT?RkX49@@qG{-hJ;%Cr>79sLUhz( z7;Znn{9^VELL5wvz`@7Q1M`t!Ubwu9%?oK19K-b_9Wt%>I9yNSHD;I>%SR9xt`F!~ zZxAu=4}8zUZ8yZz_&%VZf~^^D3gQ@=e}Q?SAc~FyHwQZpA{fHQ;Wi3#^%!44ni@L~ zNbz9%fI4!p9dB_kEq17^f_smx8Qgn}51@pL$vIR>Fg*@6dVF4R1+aPH zq87Se;u<_EGmt_?@2e2iM$C3Yz7C6VXpmY$Wfd}2m@bCA9zHLgw}4_YND^{JG&)u% zfpHMFqvPOaDa!ZYDr0tr2J(ij87d4YzYtg6QCc?T}qgb30YB0=YZRZ z*%U|}V!9JtOw2aIH3fWL;zA9&H{!AjhT*mhv=!#7K$ZscMd|omKe!Nx^A8CHk+Lx5qrm=1+|?0g}@ z#4+4o1NRv}qd({aI;5|#^ME`*D(9eeu^1LS8uZR57UCu$nqF1!Dcq zfPsca_zE!mjKK6@=K%r3A26JUpx%wj2V_ui9s>5m_5tbum1$_$z|V;C`-5cDay*bx z#m@+uDX=vIgkw~khbT}4LTLq$;%mn4eL1%HWjZWh2N+uaCE_y7ZvqU< zTR>2U`CLTMiS8FhVR678`eETF9d=)y_|yh==0wXf>Qh5&B(`SgLB(=&P`bn7OTaLl z2;I8q-iT5qn$rU70T=A1(-|xU=5xUfAh<-2j$>doTu=sBT@o;?1`b!opum8<4{q$B zIWj0FWAzULL+b%x0I=RyqHK!A-Qd%p@&;X5*xe)eHX0e_aj-JjogKii`=Wqh_6REA z)4n?s6yWIL?GnJPrpB#o=@I7g`@?U_7QVj3hX#Q+h|g{s`ndYSPoRN*|D-EzuLj>V z)752=^>xARBpQ@S+GH(ly1qWtepnQJlKvX$|ML*y8-Cn@L5=}IzrQ&L69Cn@SFF%m Iuh0Fz09WF-JOBUy literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/debugger.js b/jero-boot-single-startup/src/main/resources/static/generic/web/debugger.js new file mode 100644 index 00000000..046fd34a --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/debugger.js @@ -0,0 +1,620 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ +/* Copyright 2012 Mozilla Foundation + * + * 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. + */ +/* globals PDFJS */ + +'use strict'; + +var FontInspector = (function FontInspectorClosure() { + var fonts; + var active = false; + var fontAttribute = 'data-font-name'; + function removeSelection() { + var divs = document.querySelectorAll('div[' + fontAttribute + ']'); + for (var i = 0, ii = divs.length; i < ii; ++i) { + var div = divs[i]; + div.className = ''; + } + } + function resetSelection() { + var divs = document.querySelectorAll('div[' + fontAttribute + ']'); + for (var i = 0, ii = divs.length; i < ii; ++i) { + var div = divs[i]; + div.className = 'debuggerHideText'; + } + } + function selectFont(fontName, show) { + var divs = document.querySelectorAll('div[' + fontAttribute + '=' + + fontName + ']'); + for (var i = 0, ii = divs.length; i < ii; ++i) { + var div = divs[i]; + div.className = show ? 'debuggerShowText' : 'debuggerHideText'; + } + } + function textLayerClick(e) { + if (!e.target.dataset.fontName || + e.target.tagName.toUpperCase() !== 'DIV') { + return; + } + var fontName = e.target.dataset.fontName; + var selects = document.getElementsByTagName('input'); + for (var i = 0; i < selects.length; ++i) { + var select = selects[i]; + if (select.dataset.fontName !== fontName) { + continue; + } + select.checked = !select.checked; + selectFont(fontName, select.checked); + select.scrollIntoView(); + } + } + return { + // Properties/functions needed by PDFBug. + id: 'FontInspector', + name: 'Font Inspector', + panel: null, + manager: null, + init: function init() { + var panel = this.panel; + panel.setAttribute('style', 'padding: 5px;'); + var tmp = document.createElement('button'); + tmp.addEventListener('click', resetSelection); + tmp.textContent = 'Refresh'; + panel.appendChild(tmp); + + fonts = document.createElement('div'); + panel.appendChild(fonts); + }, + cleanup: function cleanup() { + fonts.textContent = ''; + }, + enabled: false, + get active() { + return active; + }, + set active(value) { + active = value; + if (active) { + document.body.addEventListener('click', textLayerClick, true); + resetSelection(); + } else { + document.body.removeEventListener('click', textLayerClick, true); + removeSelection(); + } + }, + // FontInspector specific functions. + fontAdded: function fontAdded(fontObj, url) { + function properties(obj, list) { + var moreInfo = document.createElement('table'); + for (var i = 0; i < list.length; i++) { + var tr = document.createElement('tr'); + var td1 = document.createElement('td'); + td1.textContent = list[i]; + tr.appendChild(td1); + var td2 = document.createElement('td'); + td2.textContent = obj[list[i]].toString(); + tr.appendChild(td2); + moreInfo.appendChild(tr); + } + return moreInfo; + } + var moreInfo = properties(fontObj, ['name', 'type']); + var fontName = fontObj.loadedName; + var font = document.createElement('div'); + var name = document.createElement('span'); + name.textContent = fontName; + var download = document.createElement('a'); + if (url) { + url = /url\(['"]?([^\)"']+)/.exec(url); + download.href = url[1]; + } else if (fontObj.data) { + url = URL.createObjectURL(new Blob([fontObj.data], { + type: fontObj.mimeType + })); + download.href = url; + } + download.textContent = 'Download'; + var logIt = document.createElement('a'); + logIt.href = ''; + logIt.textContent = 'Log'; + logIt.addEventListener('click', function(event) { + event.preventDefault(); + console.log(fontObj); + }); + var select = document.createElement('input'); + select.setAttribute('type', 'checkbox'); + select.dataset.fontName = fontName; + select.addEventListener('click', (function(select, fontName) { + return (function() { + selectFont(fontName, select.checked); + }); + })(select, fontName)); + font.appendChild(select); + font.appendChild(name); + font.appendChild(document.createTextNode(' ')); + font.appendChild(download); + font.appendChild(document.createTextNode(' ')); + font.appendChild(logIt); + font.appendChild(moreInfo); + fonts.appendChild(font); + // Somewhat of a hack, should probably add a hook for when the text layer + // is done rendering. + setTimeout(function() { + if (this.active) { + resetSelection(); + } + }.bind(this), 2000); + } + }; +})(); + +// Manages all the page steppers. +var StepperManager = (function StepperManagerClosure() { + var steppers = []; + var stepperDiv = null; + var stepperControls = null; + var stepperChooser = null; + var breakPoints = {}; + return { + // Properties/functions needed by PDFBug. + id: 'Stepper', + name: 'Stepper', + panel: null, + manager: null, + init: function init() { + var self = this; + this.panel.setAttribute('style', 'padding: 5px;'); + stepperControls = document.createElement('div'); + stepperChooser = document.createElement('select'); + stepperChooser.addEventListener('change', function(event) { + self.selectStepper(this.value); + }); + stepperControls.appendChild(stepperChooser); + stepperDiv = document.createElement('div'); + this.panel.appendChild(stepperControls); + this.panel.appendChild(stepperDiv); + if (sessionStorage.getItem('pdfjsBreakPoints')) { + breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints')); + } + }, + cleanup: function cleanup() { + stepperChooser.textContent = ''; + stepperDiv.textContent = ''; + steppers = []; + }, + enabled: false, + active: false, + // Stepper specific functions. + create: function create(pageIndex) { + var debug = document.createElement('div'); + debug.id = 'stepper' + pageIndex; + debug.setAttribute('hidden', true); + debug.className = 'stepper'; + stepperDiv.appendChild(debug); + var b = document.createElement('option'); + b.textContent = 'Page ' + (pageIndex + 1); + b.value = pageIndex; + stepperChooser.appendChild(b); + var initBreakPoints = breakPoints[pageIndex] || []; + var stepper = new Stepper(debug, pageIndex, initBreakPoints); + steppers.push(stepper); + if (steppers.length === 1) { + this.selectStepper(pageIndex, false); + } + return stepper; + }, + selectStepper: function selectStepper(pageIndex, selectPanel) { + var i; + pageIndex = pageIndex | 0; + if (selectPanel) { + this.manager.selectPanel(this); + } + for (i = 0; i < steppers.length; ++i) { + var stepper = steppers[i]; + if (stepper.pageIndex === pageIndex) { + stepper.panel.removeAttribute('hidden'); + } else { + stepper.panel.setAttribute('hidden', true); + } + } + var options = stepperChooser.options; + for (i = 0; i < options.length; ++i) { + var option = options[i]; + option.selected = (option.value | 0) === pageIndex; + } + }, + saveBreakPoints: function saveBreakPoints(pageIndex, bps) { + breakPoints[pageIndex] = bps; + sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints)); + } + }; +})(); + +// The stepper for each page's IRQueue. +var Stepper = (function StepperClosure() { + // Shorter way to create element and optionally set textContent. + function c(tag, textContent) { + var d = document.createElement(tag); + if (textContent) { + d.textContent = textContent; + } + return d; + } + + var opMap = null; + + function simplifyArgs(args) { + if (typeof args === 'string') { + var MAX_STRING_LENGTH = 75; + return args.length <= MAX_STRING_LENGTH ? args : + args.substr(0, MAX_STRING_LENGTH) + '...'; + } + if (typeof args !== 'object' || args === null) { + return args; + } + if ('length' in args) { // array + var simpleArgs = [], i, ii; + var MAX_ITEMS = 10; + for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) { + simpleArgs.push(simplifyArgs(args[i])); + } + if (i < args.length) { + simpleArgs.push('...'); + } + return simpleArgs; + } + var simpleObj = {}; + for (var key in args) { + simpleObj[key] = simplifyArgs(args[key]); + } + return simpleObj; + } + + function Stepper(panel, pageIndex, initialBreakPoints) { + this.panel = panel; + this.breakPoint = 0; + this.nextBreakPoint = null; + this.pageIndex = pageIndex; + this.breakPoints = initialBreakPoints; + this.currentIdx = -1; + this.operatorListIdx = 0; + } + Stepper.prototype = { + init: function init() { + var panel = this.panel; + var content = c('div', 'c=continue, s=step'); + var table = c('table'); + content.appendChild(table); + table.cellSpacing = 0; + var headerRow = c('tr'); + table.appendChild(headerRow); + headerRow.appendChild(c('th', 'Break')); + headerRow.appendChild(c('th', 'Idx')); + headerRow.appendChild(c('th', 'fn')); + headerRow.appendChild(c('th', 'args')); + panel.appendChild(content); + this.table = table; + if (!opMap) { + opMap = Object.create(null); + for (var key in PDFJS.OPS) { + opMap[PDFJS.OPS[key]] = key; + } + } + }, + updateOperatorList: function updateOperatorList(operatorList) { + var self = this; + + function cboxOnClick() { + var x = +this.dataset.idx; + if (this.checked) { + self.breakPoints.push(x); + } else { + self.breakPoints.splice(self.breakPoints.indexOf(x), 1); + } + StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints); + } + + var MAX_OPERATORS_COUNT = 15000; + if (this.operatorListIdx > MAX_OPERATORS_COUNT) { + return; + } + + var chunk = document.createDocumentFragment(); + var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT, + operatorList.fnArray.length); + for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) { + var line = c('tr'); + line.className = 'line'; + line.dataset.idx = i; + chunk.appendChild(line); + var checked = this.breakPoints.indexOf(i) !== -1; + var args = operatorList.argsArray[i] || []; + + var breakCell = c('td'); + var cbox = c('input'); + cbox.type = 'checkbox'; + cbox.className = 'points'; + cbox.checked = checked; + cbox.dataset.idx = i; + cbox.onclick = cboxOnClick; + + breakCell.appendChild(cbox); + line.appendChild(breakCell); + line.appendChild(c('td', i.toString())); + var fn = opMap[operatorList.fnArray[i]]; + var decArgs = args; + if (fn === 'showText') { + var glyphs = args[0]; + var newArgs = []; + var str = []; + for (var j = 0; j < glyphs.length; j++) { + var glyph = glyphs[j]; + if (typeof glyph === 'object' && glyph !== null) { + str.push(glyph.fontChar); + } else { + if (str.length > 0) { + newArgs.push(str.join('')); + str = []; + } + newArgs.push(glyph); // null or number + } + } + if (str.length > 0) { + newArgs.push(str.join('')); + } + decArgs = [newArgs]; + } + line.appendChild(c('td', fn)); + line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs)))); + } + if (operatorsToDisplay < operatorList.fnArray.length) { + line = c('tr'); + var lastCell = c('td', '...'); + lastCell.colspan = 4; + chunk.appendChild(lastCell); + } + this.operatorListIdx = operatorList.fnArray.length; + this.table.appendChild(chunk); + }, + getNextBreakPoint: function getNextBreakPoint() { + this.breakPoints.sort(function(a, b) { return a - b; }); + for (var i = 0; i < this.breakPoints.length; i++) { + if (this.breakPoints[i] > this.currentIdx) { + return this.breakPoints[i]; + } + } + return null; + }, + breakIt: function breakIt(idx, callback) { + StepperManager.selectStepper(this.pageIndex, true); + var self = this; + var dom = document; + self.currentIdx = idx; + var listener = function(e) { + switch (e.keyCode) { + case 83: // step + dom.removeEventListener('keydown', listener, false); + self.nextBreakPoint = self.currentIdx + 1; + self.goTo(-1); + callback(); + break; + case 67: // continue + dom.removeEventListener('keydown', listener, false); + var breakPoint = self.getNextBreakPoint(); + self.nextBreakPoint = breakPoint; + self.goTo(-1); + callback(); + break; + } + }; + dom.addEventListener('keydown', listener, false); + self.goTo(idx); + }, + goTo: function goTo(idx) { + var allRows = this.panel.getElementsByClassName('line'); + for (var x = 0, xx = allRows.length; x < xx; ++x) { + var row = allRows[x]; + if ((row.dataset.idx | 0) === idx) { + row.style.backgroundColor = 'rgb(251,250,207)'; + row.scrollIntoView(); + } else { + row.style.backgroundColor = null; + } + } + } + }; + return Stepper; +})(); + +var Stats = (function Stats() { + var stats = []; + function clear(node) { + while (node.hasChildNodes()) { + node.removeChild(node.lastChild); + } + } + function getStatIndex(pageNumber) { + for (var i = 0, ii = stats.length; i < ii; ++i) { + if (stats[i].pageNumber === pageNumber) { + return i; + } + } + return false; + } + return { + // Properties/functions needed by PDFBug. + id: 'Stats', + name: 'Stats', + panel: null, + manager: null, + init: function init() { + this.panel.setAttribute('style', 'padding: 5px;'); + PDFJS.enableStats = true; + }, + enabled: false, + active: false, + // Stats specific functions. + add: function(pageNumber, stat) { + if (!stat) { + return; + } + var statsIndex = getStatIndex(pageNumber); + if (statsIndex !== false) { + var b = stats[statsIndex]; + this.panel.removeChild(b.div); + stats.splice(statsIndex, 1); + } + var wrapper = document.createElement('div'); + wrapper.className = 'stats'; + var title = document.createElement('div'); + title.className = 'title'; + title.textContent = 'Page: ' + pageNumber; + var statsDiv = document.createElement('div'); + statsDiv.textContent = stat.toString(); + wrapper.appendChild(title); + wrapper.appendChild(statsDiv); + stats.push({ pageNumber: pageNumber, div: wrapper }); + stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; }); + clear(this.panel); + for (var i = 0, ii = stats.length; i < ii; ++i) { + this.panel.appendChild(stats[i].div); + } + }, + cleanup: function () { + stats = []; + clear(this.panel); + } + }; +})(); + +// Manages all the debugging tools. +var PDFBug = (function PDFBugClosure() { + var panelWidth = 300; + var buttons = []; + var activePanel = null; + + return { + tools: [ + FontInspector, + StepperManager, + Stats + ], + enable: function(ids) { + var all = false, tools = this.tools; + if (ids.length === 1 && ids[0] === 'all') { + all = true; + } + for (var i = 0; i < tools.length; ++i) { + var tool = tools[i]; + if (all || ids.indexOf(tool.id) !== -1) { + tool.enabled = true; + } + } + if (!all) { + // Sort the tools by the order they are enabled. + tools.sort(function(a, b) { + var indexA = ids.indexOf(a.id); + indexA = indexA < 0 ? tools.length : indexA; + var indexB = ids.indexOf(b.id); + indexB = indexB < 0 ? tools.length : indexB; + return indexA - indexB; + }); + } + }, + init: function init() { + /* + * Basic Layout: + * PDFBug + * Controls + * Panels + * Panel + * Panel + * ... + */ + var ui = document.createElement('div'); + ui.id = 'PDFBug'; + + var controls = document.createElement('div'); + controls.setAttribute('class', 'controls'); + ui.appendChild(controls); + + var panels = document.createElement('div'); + panels.setAttribute('class', 'panels'); + ui.appendChild(panels); + + var container = document.getElementById('viewerContainer'); + container.appendChild(ui); + container.style.right = panelWidth + 'px'; + + // Initialize all the debugging tools. + var tools = this.tools; + var self = this; + for (var i = 0; i < tools.length; ++i) { + var tool = tools[i]; + var panel = document.createElement('div'); + var panelButton = document.createElement('button'); + panelButton.textContent = tool.name; + panelButton.addEventListener('click', (function(selected) { + return function(event) { + event.preventDefault(); + self.selectPanel(selected); + }; + })(i)); + controls.appendChild(panelButton); + panels.appendChild(panel); + tool.panel = panel; + tool.manager = this; + if (tool.enabled) { + tool.init(); + } else { + panel.textContent = tool.name + ' is disabled. To enable add ' + + ' "' + tool.id + '" to the pdfBug parameter ' + + 'and refresh (seperate multiple by commas).'; + } + buttons.push(panelButton); + } + this.selectPanel(0); + }, + cleanup: function cleanup() { + for (var i = 0, ii = this.tools.length; i < ii; i++) { + if (this.tools[i].enabled) { + this.tools[i].cleanup(); + } + } + }, + selectPanel: function selectPanel(index) { + if (typeof index !== 'number') { + index = this.tools.indexOf(index); + } + if (index === activePanel) { + return; + } + activePanel = index; + var tools = this.tools; + for (var j = 0; j < tools.length; ++j) { + if (j === index) { + buttons[j].setAttribute('class', 'active'); + tools[j].active = true; + tools[j].panel.removeAttribute('hidden'); + } else { + buttons[j].setAttribute('class', ''); + tools[j].active = false; + tools[j].panel.setAttribute('hidden', 'true'); + } + } + } + }; +})(); diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-check.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-check.svg new file mode 100644 index 00000000..71cd16df --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-check.svg @@ -0,0 +1,11 @@ + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-comment.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-comment.svg new file mode 100644 index 00000000..86f1f172 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-comment.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-help.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-help.svg new file mode 100644 index 00000000..00938fef --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-help.svg @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-insert.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-insert.svg new file mode 100644 index 00000000..519ef682 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-insert.svg @@ -0,0 +1,10 @@ + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-key.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-key.svg new file mode 100644 index 00000000..8d09d537 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-key.svg @@ -0,0 +1,11 @@ + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-newparagraph.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-newparagraph.svg new file mode 100644 index 00000000..38d2497d --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-newparagraph.svg @@ -0,0 +1,11 @@ + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-noicon.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-noicon.svg new file mode 100644 index 00000000..c07d1080 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-noicon.svg @@ -0,0 +1,7 @@ + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-note.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-note.svg new file mode 100644 index 00000000..70173651 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-note.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-paragraph.svg b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-paragraph.svg new file mode 100644 index 00000000..6ae5212b --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/images/annotation-paragraph.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next-rtl.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..bef02743fc108697e14e0e5daab8181f7ef91dd8 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6`aE46Ln;`jUU1|(WFXM`uzZfwf<{~}+$G0pUl&6i=kdI{(<22WQ%mvv4FO#q)8O6mXr literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next-rtl@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next-rtl@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1 GIT binary patch literal 304 zcmV-00nh%4P)kdg0002@NklJ%mRW)o*bZ%{dl2K@N_?~eFJnrG5D`)>eWA=I9=*xrZ>GuI z4!;9U26Pv$_Z4XH%%iCpph2GpV-c{*6Zhs6SfR_EJq5;V+?sh4&K}p+ z6sU+@u52lw#15CH6i}kr=3>#xgHlS7GA$J0E366+j!0VQ&&@3-ef{(7H#?13Ev59AjB0000QONN1jjx$vyv5uZYI@G&FX~xujj12+YK~w v*fr|J-NDGo&9wKH*qTY?mdrSMOX2+jbf@g_m202_00000NkvXXu0mjfGEh>( literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-next@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0250307c0d10b0c0a38a8381361ec265ef3080c8 GIT binary patch literal 296 zcmV+@0oVSCP)kdg0002*NklD^w4Rl6cnRtQcFE3nm0&QVWiRnO%{h3-*x?K4w z&|kYa uWt-+4V4d~Up94HjH;lQ?oa>Bv?A`$+U7<=?MIved0000QONN1jjx$vyv5uZYI@G&FX~xujj12+YK~w v*fr|J-NDGo&9wKH*qTY?mdrSMOX2+jbf@g_m202_00000NkvXXu0mjfGEh>( literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous-rtl@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous-rtl@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0250307c0d10b0c0a38a8381361ec265ef3080c8 GIT binary patch literal 296 zcmV+@0oVSCP)kdg0002*NklD^w4Rl6cnRtQcFE3nm0&QVWiRnO%{h3-*x?K4w z&|kYa uWt-+4V4d~Up94HjH;lQ?oa>Bv?A`$+U7<=?MIved0000fwf<{~}+$G0pUl&6i=kdI{(<22WQ%mvv4FO#q)8O6mXr literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/findbarButton-previous@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1 GIT binary patch literal 304 zcmV-00nh%4P)kdg0002@NklJ%mRW)o*bZ%{dl2K@N_?~eFJnrG5D`)>eWA=I9=*xrZ>GuI z4!;9U26Pv$_Z4XH%%iCpph2GpV-c{*6Zhs6SfR_EJq5;V+?sh4&K}p+ z6sU+@u52lw#15CH6i}kr=3>#xgHlS7GA$J0E366+j!0VQ&&@3-ef{(7H#?13Ev59AjB0000G{p)>hLyxD99 z76ej)=-vic0UL9~!GgO~9_MsOnufoUx`QHG)5E@a!o?nT8@#*2`fMlI9X~2&%Qwtd fAElzRww7{H`T9z)QIL|gUwP@h-(DMO`2YPI1=f8x literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/grabbing.cur b/jero-boot-single-startup/src/main/resources/static/generic/web/images/grabbing.cur new file mode 100644 index 0000000000000000000000000000000000000000..e0dfd04e4d3fcbaa6588c8cbb9e9065609bcb862 GIT binary patch literal 326 zcmZQzU}9ioP*7lC;0HnjMg|5k1_lNVAO;FCH~=vt5Q0Dhn8YOh|NoCEh)sn30RsaF z^8>N`2L=Xv5dHz=L$Uk|1_tQ_266z<4TQl5{{R0$_yG_fVE_NW0fd=>Y#@FBr9t9P K<`XsxO$7j30D*Y` literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-icon.gif b/jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c72ebb554be018511ae972c3f2361dff02dce02 GIT binary patch literal 2545 zcma*pX;2es8VB%~zPr=ibVMCx-JQ^BhLDAsK)^**h(ZDp9YGuzZ%~j!}+w%FI;|aC7){7CdVvG)P{bng1y9Te*f}~*`1kQl$jwb z$tlW~rRS!X?#xfm_&6tTdp_`cjgYwbRFLNdoJCN$S-yhg`ZnC-yvedRSmOh%;Y`Gl6bY$Z-}#C=#F4%9!I1b zWQ~f+9P?;vhCxWwlwl=lrWG|7IYo;{jjmzJ5R9?f>n%-d@>kLINUc z4wM5dAO;kq<$}Dk{2-u0$I6@2N}&cUx9nmV1dYc8jfC}%=F9WCg^OQK9C6poh#2!A z3^EU*UFZvS^)?bu3T?J;@Ahb~%I?+@4!l5!*TjC}GIslNan-RCrrd~PdHYnNLJk+m&`$Y+NV(e>CCu%R#_8GqY4cv#j`#uRWdsg9DxWy(?oOvgCU}&@jy%c!H&-Q zqXJxajAtmQRoRa9V-RFXXh-bK*;Fum{BjpkYQGX~i@OZ^Dx0n&H}kvGKqQ?w(6iGXu_g08T|_hp#ZvFzIwKF*a=oMJ~3UGAjZ?g}GOxm44td zXoyYrU*I=y*vHv89hkYH(v5R#wc)BC3dZJKb3K)f>zaM3%JP(mpecViP0eKKYf3zy z->jx_mc?mCtPEvCQ?uppk?eLJt}_IR7giW%Jr)RyI!+E-voIs*lXI*z`GQc_&D#X( z{6G};HPYj6O|$lXxBJeDaweqa{4L=tOZCjTI^&UOxXg})LRG_cr^B9Rqt(i5ORbQX zq`_xCRsH>xEYY%&*Nyi#{S_JZNlTm#K56`RI%7^amom;*h90Si&g1CfaFV3D|a!`3Y-GKKbL*KSbl z>I96`TR@CqPJl(>QqB~RvK~-U)`e`l4LIqj+IU^~yyIe*|BRVB>4Bup%j{tLdKz4j zY^<8P8m~GRGz*yv0&-RJE+-keJ+%m3wNeopzsltWd->eWmBVwUr)pX` zK~CD<;~Z*Uy3W`3+MrEYxm5qYQ!z%YI;y7DTG`UVH0;@{M{!B&id_}3DBQ?zsotuR zEGLdRx25nLm%-wjlnEi;-aN_1S7???rO~WgA67jjr&(vRa3y$u#kqJbeKnw z{!T!1li9>M+sJ6AUe+*9d}2uGjhzd z|L1Rtp8uTGYyZoQ*`DS^m2dw-X{a)l+3m?ncvn^+O>)hdd3(hMtlhkRGns{<8c0I! zDDjpmwtj?@!6kA|iu3q+Ai;@JR+ zfk+ln&YFC{4bhK6IxVgLs4W%^8Lk`qzWU*L>yq0A3;l}{!wKZ!ue)C)SKI)9dl1hl zhIRLV@8E}rwvE{gX(}$f6x*k)_`*Ijt1=EU-Ls6-(phomeQBgtUs z5Xz~Cd*nE)Ac!0i4ep}Z1AugMB(&F?)#CU{Qc{Sp^vKsdL}vRB30H+Bbzrn`M##H3 z{W8dc_mDroEE+p8_}mnJtzZ4!RNe)zhB)Ds;S57nYSJxtek>^~&(7B+N5MPf2+2xx z5Dl&4X|c@f{Kd|z1r+N|$DmsoVp*3yOdxT^J^-VAk)Z@$4^XrPrFP-Co+MXZ+KJ(W z{JNYvraLLWA;&tRhIKOvhW|HC|L-dLvAUF(MG0(Nl?4tB{RzN7I(}Cb%hwN{crFC8 zji#aJElKvDFV+&VI1V?oUMA>*kto0^;3W8FQBSZ|{ z$v~TqE=(8DZa^i$^oht&h};P1N&wMXorKh*Z68gPV&ouy>%f36Oqkwemyeas$Qbz# zV?7Jy%o7KY6^I=P@eCji%W`o5sf(5hySYo9$l4e2`(hIV_?=H-#R6}0$WVA|*(K@3 z=5?@RlcLh(meW%A4)hGzcvEpm(_w?>zhL*i&s9$2>r zAtk{8Cia|+Y+V!uX9BtpXoF%lswuRKsM!pSs!?yhlCy!269K0|b M?FSZn2B>%I-}ej|s{jB1 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-small.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-small.png new file mode 100644 index 0000000000000000000000000000000000000000..8831a80588dcaffe9a0e075f3d00066faed3d482 GIT binary patch literal 7402 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 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-small@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/loading-small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b25b4452aa1a52181c324020c39175e0f8f425a2 GIT binary patch literal 16131 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 Hu0mjfs1U=| literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-firstPage.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-firstPage.png new file mode 100644 index 0000000000000000000000000000000000000000..e68846aa5f609f48e89b25692abdd85c2de7ecb9 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6sytmBLn;{eUNGc3kdg0002dNklu=O3C8jVap{PU;A41oOzOaJ;Key$ zQU*)*)D8A5V+RX%R3~;UVg_@zlxMcgLkF6gqD74k8E7`-9X9B`!HkM$kBXUZFs0+2AR>HC Q6951J07*qoM6N<$f&iRyUH||9 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-handTool.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-handTool.png new file mode 100644 index 0000000000000000000000000000000000000000..cb85a841b18be0235fc6c6714223609e1097d1f4 GIT binary patch literal 301 zcmV+|0n+}7P)J24O| z%QaP!}IU9e5CrM>v9W%fW1qojxzD%=Q00000NkvXXu0mjf%W{5L literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-handTool@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-handTool@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5c13f77ff003460753a39d9e406c0020231cabda GIT binary patch literal 583 zcmV-N0=WH&P)kdg0006GNklsDncb1tl(lO0{5H zQE6&xnvkURPmGNv7*b6L!Th=V`QF__%SrC--TQe6-{l_O7Xsbk5HrdU;SJOpV0KIxYb5^yMTWCRz8#4m*=<-RYnu#WwP~*n506n@GajHIFM;%}f zFY^Y^aW7$86$8At-QN{yj&9v@sxj9<1L$1g8gpFdYaS((q*!NG$}P*BQ`PAzs=(Gm zuGm&PFW5_{a(v>7UM*fj4M<$)vPc?t4M_V?iB(Vmj)#B6xFk|MFXcmJ%3gpyBWK$S zOgPLXDIdy{Wt3sfzR7D`46gK~gc4x?9LbFFLr|r0SztMRsut(_Uiii;Sc}-002ovPDHLkV1iPk2)h6P literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-lastPage.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-lastPage.png new file mode 100644 index 0000000000000000000000000000000000000000..be763e0c4a02cab5d7842c8999faade8c47059bf GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6$~;{hLn;{eb{X<9DT=r}_bOuI z*S;pAB4U5DMLQrPIWf`wN4P|1^q&c>d5`zJymvU>ZK0k3(_cShdv}w=iShns``k;6 z|9a2*kZNL>>-ng7x$0%-AZ2dv-evusD-M1!nVC^#Cw7NZpelLZ;<(0t-0Qey{BDRJ YJiB<=q@5ck0$sr1>FVdQ&MBb@0Mz?GUH||9 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-lastPage@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-lastPage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8570984f2d9952ebb8543a6c8bbca2408be3fe90 GIT binary patch literal 276 zcmV+v0qg#WP)kdg0002nNkl&Czfjc{g zj6%Epm%+!Y13m~u!|`;DXFGIF9(|doYCM^ve(0R2@MwmrSf3_JJZz&%)@Kv4!2LS1 zV0}4}<8B$5v%a3la66C8Hg!&j6gN{uYNm4{!PR#}Vyttbi*Y&9#dbQsBEkhDB5R!! zZ3qqBhHg41f;Mp0Iq}XP49B>3;NV a-`N}fhF>K<1*gRT0000IXDMlYJjH!bP6)MzmI9A`JeaMrW zP{;Eb78VxP+o^u+tz)%w>Y7tjQAHKiynbv>Q2u<>aK#ZG+*=LzzJU35q7H&2Nb8UG z4tHis9hc+YH714zU~vDD-l4 zafLJ>w7618y&iZMZti8jkXl?(NPqY>rLdN@q_C#sSI-x0yte^Yo}fkdg0007_Nklh8e7=r0Vcp)Y9Pr|5OlrS&sF1(Z=>P7`I$&2V#B8FQ@ z#xx11n2B@MtaN4N=HFayP|U&0*qP^fzdz3rbvx5{@V?*A7yO;ybIvoweHnhs|HM2| zKI2b<|A+)(s$d&GYW}mq85+9hKEosr^Z)ai~BEfeTNO#3*wjb*wP4^U`OFpp(!|`#~2s8 z`FYx|7Q`+s4a0>};|dO&@9pxBxm8wN7W`#thbT7CssC=I zTAKz9&;++jKrz^NzcAADM`@&iv`7W`N3qmw3RZ&e8hPgH3^G7Qpcx$&o`vOn_6(y+ zZas$_WXt7wl$(nFs}3E|%QjcV-;}eBGn_%TTz6djMaiyYk%erz{(qejCHZ9%NywHf z{V9J|qQg-{A#0$GFYt5L61R9<|A{{;zE^$lK~~|*404N++(Ztym|$2*&p8|pI3TP1 z`Lol$YO^mh!s0;lvGNuWs=UoKADO*y*%)pt=Qi+&XoY ztsnG;h7yz6Kt7lcW&?@I(9rw6m9415J&yxVq8aUYUbLfGo*u)4nY;A)5mO4m-#Y*R N002ovPDHLkV1o45W##|? literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-rotateCw.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/secondaryToolbarButton-rotateCw.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c7598886bd49e194764015577b766aadd82288 GIT binary patch literal 359 zcmV-t0hs=YP)x?uT5p77|>RR|+!(Z0%SPBBerLNU!<(Nsaeb!tN(Ep1s3u|3Lqc zXA482_4)TIcUT&Mg&ka9PU%bJ(4vmb9tomENw9}a{m@cGL+1YGpu!Cenlx!}GpOuu z%G3xmxmwG;o&*28mt2*pekdg0007!Nkl7D_=c-w$rRM%>rppb3*+sVXe|le>e}?;(Er{M9e0<;c?0eV_qyI8^j_+&`1R|)U z;XGO}fI0Zt9GrYA<6DaHV~zRM1twVFK>**djW85SZR6yh2FUfJb!D6Sq1r_=#U#5b6Imp7B9ZQ6dlA8G-$eSq@9Y$Onc`L6}j4VAGA1e z1=skwPmHutJ|&xcR~vkBjDocAI6jNzhpOjziuITk{*=Ke2$x|I3s}%U+A3|7NKzG} zAk>06vGjn6XdlOMA5}2zo(U{7GxQ7|5$+DtKDyz>3|zQm6o@A`;T9ZPLCJCIg`0Wi>*q{U9GDRL?<%aEPKbabJ1?6A$s(GnBf}UMn8ID;D}MVOPR2!KxT(5{c95|#cUhyO zcqQP07oE6>JRD?syzAu0o}Dy0+GSP$>9RT+BSRRAndFjb%&=+RP43=DhB_K4i;_&1 zr8a2C%jAM~ORYRlKIV)PyKSob%7 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/shadow.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..31d3bdb14f1d67953d18dc04e73db834aaa200f2 GIT binary patch literal 290 zcmV+-0p0$IP)5L}-Ge7Vw zOWG2)&d}h1b+I@j1OkzekdTy=l$Ms3mzRgb;fjiiN=iy9Dk^GfY8o0ENF-8AOACcU z>FVkl8ymx5FfCz<-2qY*d$iu^P{``3`7z~9%`S|#ZjEqD?L`+Rh&CSg%EiJ9B zt!-^>u~;k)hjVmvbaQiac6N4kb>-&f#^do`US1v^9^T&GzP`S}!NFl+VF3XFAt51t zettwEF+4n+LZL)PMn*?R(`dBh^H~uHNOM7py2y-6!=p(~~7x0I73J zk=^mRIQIJk&?-is?uIWh)sY)HG+e-Fe|Z`9)K4%rj;U_cSvmB=5YtQo(oA+;CU6jO z)R<$|BMsZ2#uGAo5*0yuX)RP99*b^u2U9UAKg9e}?QbeBrr!ZmVxmT^I(w#NAp0yJ z3gpG)vA7C?7k?G@bRH;hvH6-tF&|%ko<*;Wx@=7s!#Gc7js%h_l1haH!vuZgwR%XJ zAIO1&tV}$=@&y4>|3$(ru9knIu8wq22VJ6l!jl|Z-rng-E*su{Jo6fWq}m0oLnno8 z4@|CI*j`Xy1u=JlRj0G&lNyMNgQSO!3%WDIE7N~ z6^K9!yL@fakNp%IJY(Lt_s81lCn!QV0$x&}tgQQY{9@x;R@o?bkcrept_pBmuP9HX zf=P$H3jJ)mEsW(Y7T|DE4+(UsEsM!*NqZpz*{A5Lnd8bzhX`LEvHX`;`V5yeNCu)P zUPoqI-QR#s#(kD825KIitZMG%PV4j>7(5`~xs}Q!G|t?7Al~%zdMRVojvvdXex+<( zmg+Bl)U>5G8&Mn$KVg(z5Y@|tOuhgdU`#)XI}*~HIb&c z)X8rDqzZp$Yn`?MYD!`cPDH#EJPREP+$t`t&G?I<&NjQrXs3UGN?2&44H7n+UK)|- z+2HBd-u*GRi<9QAHq4@RmrIx#!`JG+Q!2_~Mscn*{noS`_x;NQ=%y*jD%6(aD zP)7ynHD_>Kj!W{!r9wE)RD(^=-EtpBpZ_MmdPLn? z|87d=iJcuL@}?u+RaaMI+Yeng$bo*#2DIlwQyM?ZysET47XYvCa#Jb`ReYlTC+gt` zJOm<2m>3Q(+zVPDW}+ZB z22lm8Mtz!78uzQi@JcW~dDBG-|741n)9sL<;t`6Z;WOeCUh3ec>NAi{9O~$Z%}C=0 z^wI~oX)pJ?NPS0t*()y%eX_f|86p(F7&9Fg-Fl25w2fifYVHbw7lJUr>rPD$hz$wj z73ghBFDYaD%P6ACx7xV#M=Wj8Y@&y&>f_i>7W@!W^csmr1f|CUZI6|nrZlzmeNWSq zb60O13c%Wb=MY2VL}QK%O;0r?+_#wGYsObRiX53)VhAPw;~{TOs-NoJorih7T@0$r zW1m9a7EeoeNs3jC73YD>+iaw@l~U9uwkjiKrT@hAP3jeIVO0^WJC9`Q=1|G;?+L%N z7x>BNs>Uk$zZGzfk{smo-ULWJaLnP*{Xc=YVEZdw&+0L?A_{<>8Oi=m@7)F>TiviT z#eIeCltY2nSPwds{yVS?KkiGV9#rq(PR{k)SivAM74I-#zlJUJU!onq!y9+Zie@^ykY8f_3WbV%HIaE zq3*^`5dH7BD&C*0N%0ok$SX3;M&yg9~cKNXUR74$Km2g(ux&*WyKTP}y|Ke^9u=3&Sm`oo0I&7-j6k*J$| zB=B)}yKlOR=&wyR)rAq6;Lkm+>^M=Bs`7U$)hhr-pB zSxZwlgz2_4@_KEeTBZc3FLOb?S2;ShWA@lJZ;G zOf_CnY`~#{A(OQGq4V2m%)h@)u^Rh)qz+v?(Dh2ds-Z7b&j$Y#=_wstAJb+6P>`r@ zC&wmf(&9(N1lOx)NNnJ2ha%+{%R*mSfX%?_vzAVlBEh)ivlH;!{GY}lb3@vFg^tHI buTQ~y@sPxsykY#=6am;+;LIB^-iiMKh=Eg; literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-bookmark.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..a187be6c9ba78003d9d2013e4cdc1c7f73bb8949 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6N28}V=>tyzpi1dq!_s#Y(o?Z6PqD=UotbK;z z+=pt1eY;;C=TG8Xk<7mK*`GaMCo^*7N1nAT`yj#0VsudA+GmM(2Yq*^+n%4r$i(=* XtGDvpiMgkM4q)(f^>bP0l+XkKeAzzU literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-bookmark@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-bookmark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4efbaa6758dce6ea82f9e03e81c0196cd806b266 GIT binary patch literal 260 zcmV+f0sH=mP)kdg0002XNkl|Mj3PYt*CIh*)L;+Ye)qJLer!U=dbLBLZSzSesM4tY9KKocB+w3G#Z zP#|$ck0S&$A%{+O@CHd@not;m^nk=r!lx-oOkfDo1ASdr=)nV-#q?0Gf`(oI0000< KMNUMnLSTYMTxkmc literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-download.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-download.png new file mode 100644 index 0000000000000000000000000000000000000000..eaab35f09e12fed1a285ca765b38846f84ebbb91 GIT binary patch literal 259 zcmV+e0sQ`nP)kdg0004SNkl) zyTrz@9NlC#^DUV~uyB6O#`Wc|{GJapsNf}n_~s#6@aR;~Ks|!^o;hKkb<`q>uf_@c ze2Ny_{735Rz+(^grfCv7@DMF@(?E&?)gFc+;s(Y=f4GnKw)K%<_IcMs6%8~k4%~hd z1#ZH&m*NR=jd9Z9?xHxKc#XI|a&$D7>pcNfCv2 z6(}mA@U8*{MHJpuAa5+piu*}@=C6x$-8&9=MtcJe#2}8pdIkrw28vjvgyHy0F}R~Z zCUA)rP9TO&f3a5-II~coM6B}%`OpmoPD3uR3@7y8J#|5W6U7S>1Ne&^?G!jBIjmz4 zBlw35uM~LQ#}Ub*j1tayY3;VeknSU$Z13T)Kdqf~GA)J#k0F^Bw@*|4^-q28r{Use T)~jCX00000NkvXXu0mjf;mWr^ literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-menuArrows.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-menuArrows.png new file mode 100644 index 0000000000000000000000000000000000000000..306eb43b86861ffd83ab17541d64a4e8d240c86a GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BQ!3HF6HKu+5QpTPxjv*44lM^HyKK%b*U#Aeq zu;`*{L_>wHfPM2NofDJ17YG^bX|d`%n5z@V{_rc;Tt)`NYtfrMyS6_7YG?3t^>bP0 Hl+XkKJQO0C literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-menuArrows@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-menuArrows@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7570bc0d30db3dafe54aa7c1fe92367690f5046 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(g!2%>Zo;S(>sd!Hp$B+ufWQooP^)>=V3JT0Z z$G`noR@ib>ZRMZ;zy7B?RLGuin*8K{y@Up1n}eABCY96wr#d)VuzZRTnDjQlktL_y z<57djB$XEmhvE+MurwWXw|F2ZV0`Mr1B0n74EE`D>#U8d6@XSTc)I$ztaD0e0s!v6 BGzG;VmC z;q~VKH(~JG$%=&H*l#BhBA@m%+@JRU8U%hjmgvvG%fOT9|Lqt|?CCOwE9L($f#A18 zKxs~}zd3BF({67qbqF`wWgvfL;hE+U&_WnNzfk1a( t2EvOl{_oukEDQ`x40a3-IG`;90|2DgL5N;Bd29dx002ovPDHLkV1nayd!_&Y literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-openFile@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-openFile@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..91ab76593eadd6280b2a554d8d3eb1430d7ef6ba GIT binary patch literal 550 zcmV+>0@?kEP)kdg0005)NklV8EdrV)CkilFRiwZGwaE58mndUOxVhkz-=YH-{A&5&o{d zns22dWrs@ZlkDB%fnWKmLb;Wa?OQuga#3zxZ}MmDC0|@s&JT+HXqXKe@Ow>O zxH{3h$him+5RYuj9yN~lP7jG!JjhF_%4%QAQk5*<6Jqsm?Kz+C$$K}&xzJc>>|@Nm zsKzm_h^c1H4jjOTZ(zSQ>)J$FIwS8?teL?fGyt^0A!|lm!cm zrf{tQ1#;(QSpf${lMm-1Pv*3|P{2Xa=o32VET52+0uG8MJ)VX%$q`vnz(LU@4ksYN zlb}3P@CY_uRWrYD9_C5zkwt}Z+X>H)v#KVxI|eagyX2`tMhu(u=AyNL7l4cY^~bW% oyZVDVb*O{JA&&H6n13-p0bKq8;5tc*kN^Mx07*qoM6N<$g1cw`kpKVy literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown-rtl.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..1957f79ab95a970cc93eaeadec532661c5a1ae55 GIT binary patch literal 242 zcmVkgj4Lv#w4(S5>&h#|Q|$T30}L=f&H#|39(FQ@U4`qXaxf1Bc1+XmFJ4%~M*)ck=@jF*AE z@OmCGUIsRTT4WE_AE@?zRCReJsxQhE$k7T*n^xpdHBOme(Nrc9n@SO5E{eDjb45p( sF&)`4S3;ynbtti233MRw&&qfF1f{Oim%bdkdg00041Nklk=KUzNjE&+Z(ng)kL^NUuQIUigABdoZ zjSq~+fdO@9zMHugg5R&b=MNYE`8du+Zn4FCK6*TGn{x~k1gJ8@hCRLGEpOaj+8e8g zB8)MpkFy_r`|-8kb8}@LQy6}n7&Pq1SAK);+5#pKbni>{+q`3FZOa;uPgpuN| s!;t41i6pD68cF@RkkFqi61Km+Pl0_ej2E!U-~a#s07*qoM6N<$f+7928vp6;%ZmspUL<91jYXM#X%ehtN;K207*qoM6N<$g5$DeH~;_u literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageDown@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..758c01d8364c5597d7e9ead825cf4e7754c8d929 GIT binary patch literal 396 zcmV;70dxL|P)kdg0003~NkluFpq+}Hm0+F1Hup;*cG@Vugl*K#ZX`wwAsWOGa}fz> zkwzm~KZOBxbLOmLAviyn;=uQ(|M3vS0uJzqrx86=v5yr@f+Xsjpdf{JHeYJ!j=0AI zdMIPgH=xkW`qFa+9gXf=3-i7Kg{HTb-3Hnk9k+}r-+)2^XB#c8_HcDb96Kz|zFy%@ zr+?TdjvvNrduZwmN(16Fr=vAAblkd2oaVF}#;t%j0<#gojle8GW2g(H0CO!c4%7t3 zfvP|ZM9}o82$~*|&j5vrIb8luF-IZ#_Cih;7v`L-ntKx&oSShnYR(gBlz!%<)m)pf zQ#kWyr_@|dB;m;HB%5m!ww^R+i9!MvS4hZno`~brs}PswLc)&W1w*T#Q92I_?)jA__{b8r{ocmDkjB;))luQR&DQs#s?5{OcWsXDuPe zmo+wBW`Ex!Y-z#88@{DbU>|qCUYXlY&65@XZDezLlfot}w3kTg-zv6Kc{)$s27`wd tL8q?PzUn!-=+u@K&b74>{cp1VFo`V}NvvaB+5+?kgQu&X%Q~loCIFI;U?~6q literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp-rtl@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp-rtl@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a01b02380b90e5ab32727ac5460eca3108a8f1e5 GIT binary patch literal 405 zcmV;G0c!qkdg00048Nklrkxqu zT8M?#!bm@}5SjL#xxE$==eN2ibN;KL|31hDNQNMj#dAQK=y(1Y5EDv)44Ux1HIb1A zxbp_wkVaG@>bwr8M;#f}fPp8}M8Vcj2^jETNAO_u3+Qn1AmKun1#~zl_u)W~3TUX} zUO^Qa7tmniPLU0*H;_gJx9U(qIvhx$jGJF7BlQ!YX-bCSn%DhRa1}MU;;H}2mpt`A ziKiME#syC?(4NFOPciVagfos`@JYn1UN>;cY3;X2BrFj7v{2+Y+YX6@#fO0+3LJCQ zBvH>3vz-&-ueoS%1%d+z!pldaMb1S zJy+Y=T^nDZ7)fV{#%PX`f<=ncJWbF5{oQ;4iDXE!#q;ab00000NkvXXu0mjfx2&{B literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-pageUp.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9daa337656a75091ea00d4c5600ba4f557d834 GIT binary patch literal 246 zcmV4@1mz9~E$`$~;b_k}_F6G1q{7jr18lHWj_7~< wLcHP)kdg00046NklObOG9sOZQNBke(N5=mxxi_UHnda|*&J&5TH*h$u8)^QA!? z;xt&CUk(xa@IS{#Xz2Hu|6d*s2mgJH_rVY7C(gG%-^8f%*FGts5wO{2{YRVjxB;6j z)&{h^5?<#`RuxU!x&ey~Rs;=NIsuDymORvHjS85o@x@1treDBhm4y+iG`#`_%Y4>Q zrXd9kmiVNpL_-b4SmY!16&V{0L|Nd&m{h`q6-zeg7QAIlCLxaTHheG%?nYsXZ0`) zJwbTMNirjGFS)Go0!$`0KT}Lg+!F?+fC96-Tkl6a7i8QNLsCG2!2H_bPUYYu$y1&U xNi)wqhB>1K6qvvQRuRHFB2cYh4paDxeFMq5jmkNGJDLCh002ovPDHLkV1nI`spbFx literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-presentationMode.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-presentationMode.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac21244dff26830f46ec462f2dab36e1a18938c GIT binary patch literal 321 zcmV-H0lxl;P)d-;VqjhMU0mZ4X2g!hLXQ*2lyD zAO1T4QSzVf-}e8HzMQ-~=l=t+g42^3RNS0C9Q=RpM>>fAJ?a1b&&NYN8B~EX5F3G* z)y-)~6N3zxFSVx?D9sL)fdf{kGziForAY+;dH)B&*)2a2N#7G$Xm3^>hP76r$iD7@qu}40l!X|5FfA2;Tt;<=`gB!NnK=_L!_3 TdOB@M00000NkvXXu0mjfBu|wT literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-presentationMode@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-presentationMode@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cada9e7918da28bdf84af38c354dbf1e1c6fe31a GIT binary patch literal 586 zcmV-Q0=4~#P)kdg0006JNkl6nm`NYOT@I1}o-1mKoVd&o&{7f+mN-&#|()Zx;dz{8H zjZ$((8_UU@2);#emg03$I7{)Q2)+sjYw5ZuyjRhz2zmk^;uiyU5k4mtKpo5NDq;oH3c;DYmG_Dw9@94#Qd!Np$MYD$j zPc4{FS9m_nZFoN1#o4faN{cjOD4v!1b8BVb^Z!9gw9*2_{C#gi$nn)e!f!}1hmw`k2Xb!g|HAo2t*7E*&>DgR^vZU zVV4ks^D731!9T-ielNTbGw_$axq|YpFKNTWBMo*4b40@@e=r<~g@MK&J_SO41MfMq z6K6!=^stS5fYisq7foRJTRX628(*Bq(yKr%dZE{WZ`;7vZJ2IZv$kcQLwS8}%Xy#f zfMcjMVUtA}0uh@ufx-#qxPlcm-vgSJD;yl)1oluX_K^Glse?0qV_8Mk00000NkvXX Hu0mjf@9=3h literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-print@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-print@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..53d18daf7825ae12d99406068073d16ab682737e GIT binary patch literal 464 zcmV;>0WbcEP)kdg0004(Nkl|6%E6&Q zgKhE5R6HaVnnStjcWqH1ObaL>24WBUJ_Y#4uV1O`0z?e~qSOfwF1Pr+z z$Bpe>*voD2#tn`c<-UL;j`nO=$Qx_VPMhTiws^}Shpj6L11HP{ZY}JG58#d<-o%HwW2=;PUN2XFHukd_-`kI$Y@{*S`_h91y zIW}gls+39Ng#)bOp}H?Gw|H@Pf)(V=%H0Vs*gACdn;u{lW|A|ybdPtAQD7%+lCuPJ zNHpGOlkX&todVvkrYUPEpq8BS?cYmI7hZsM*cGhfU(HW?%hSMo{ZqpL0000YA literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-search.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-search.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b75579b1e058baada95941a4a7ff0c80edb5cb GIT binary patch literal 309 zcmV-50m}Y~P)}CT$H)>Cl*KShVy4rnvP0Z8?}Z*4h&|1f^pNMc6--g9AMzMF;T^ zdxEUy+IsY03~>NTiO@2lBS(WyDLQStmhYno%7XP%~a zg|t=`Q(SSy6w-os!-I2sl2TAVdpUcr6!sO=uOix1Q2+A@lD3RUk?l9y00000NkvXX Hu0mjfGKYz; literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-search@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-search@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..456b133248fd5310857db3e2b174730f6488371b GIT binary patch literal 653 zcmV;80&@L{P)kdg00071Nkl{bbX%$pI4<4dGmxrK3y9C*x5W092iXDWyS$NGul86ip{iUm* zph&8bY4&exY`K>GnEG>Dd62o*(mD5i_k8$VY~O9Br=aKc@csAZc|K$K(~H}AmbW;? zMG@u@&$EhH4=lw&FBkZQF-Ap9o)(M%&-~tka$b|+DChG;`IX(=w(){a#`%8{F<#$j z!3oAVrx=lttE;Wi(dg)E3%QJl{>ms%ms(Jfo#2eJ;_GOI4YjBgwXk)xuK0A4^|Gqy zg0)keVT6&~w6g^ktS^hRB{!`y&ScJIkb$(>x10P=3G|{G`Bfe0)oE%dg%qUCmd7}) z3^)d0=5pwC)whaONSkH-{G>RoP849(sVpfg@*ia0@S_s8gi(M+r$*3#0co@3D5sRA zh9wlxpwskt8fi$I&Gs>uWY z?@M2Nt`6yC6T6=Kx^U>Q*>AFmU}|CQ^VA2Q+|HIZgo*jpkAZhSx|3}@2xVraKJvzU wce9NLp>&q3J+HiVD_f9=9_zn#f#kpM2NJQXccvwU^Z)<=07*qoM6N<$g7779MF0Q* literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9bfa4f63d6a8ae5cbaafa2efadd2c16b48a3d8 GIT binary patch literal 456 zcmV;(0XP1MP)kdg0004xNkl&Eo0wtSl_%_c@)#x6@Nc{?`phhD&@IIESE8yJl-K zSNKF1)hUn5sOZvq+E~U7KGIR4efOfQ^}884Zquc$Li5&n8S%Rr1@7~nmioPL?ToDQ zyBRA(nRhf*zjpbgtnj-TYr+Ig8tT{lh2v82yBQlog$4`i$IR)&lJ~nAn?g*Tx2iXJ zWWVJ6ZpK)6$s20w>%%>JCF}K+&F|>X@+#3QMD!p6D zD}Un9_eZ=yRl_vval1L7BzJJ%w+GCj;t)~vyE&jFTPl6N#|&!ruPuHz2b3(`y7R*w zDyWF(Z1=l4pkzsLTk9rI70-y-?RRDWXwkZ{`gNuh)5IL`x)Kb@EZ>3!A!A$=*8}1L$Je~+C1~_8?0000)($5yeRDdaQJ-M|4aWbecXOn@Guga;V=~b z@A-fE|GC#2l&u(8kl8S=_WnQr|Ky7m5@rlc$ZVK&-~ZG9k3Lz%WyHXU%!Wxf{y*{m t;LXXb20&>fHXkdg0004zNklungn#PzRCDDkC`n~n-$qc_|=6h2P`+3##e4qF2k^f~&;~by5E|5SX@g5gF zM(V@4qrL*vqBy9 zmb;|w9+AI3)?7ThQODDyXUp*o57Q zk<^j>?O9%<$}VJ!)rCGJIWh710VUKc_nfi8UFd6Wq&>}xNGDg=Rgg%$YmQ;9d&EnM z>U;L=QAvw#VE4vGm!-&}`ugz1AsMo}H!?0DWI=tocW|Gi?CyR7|OZx}=1^9!Vb3w=BGynhq07*qoM6N<$f>h_@ AZvX%Q literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle-rtl.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..6f85ec061ea167b1718d2865cfc1e53370f11b7a GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6R(QHNhEy=Fy|9t%kby|+!~K<= z=lYs7_Vv%s4-^nwVp00$&6?)LeSG^I3$L4YTv-}i{FpUUBct%;PlbZ%#R_fqh7bDx z-F*1OP);pG_ExTK`(Chn5R(EeH9pPAiYO~EVU zg;AX0YiF?m$$s9yK0f=U*jm^Eqt`WV2>kpZ@LOBJCk~ccO~LBz65exMPv3u}^Njbh X)s)<0)dyODZf5Xw^>bP0l+XkKTSZs> literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle-rtl@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-sidebarToggle-rtl@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..291e006797fc7f0e84d297e952630c719fe6eeab GIT binary patch literal 344 zcmV-e0jK_nP)kdg0003WNklzGl0Qy}Zomti9P@(RHP^G#|@5~=y7$K!siiboRh zuIeZWmVB=G=|>dh^>JgTvTX_3{+V)mF&H3EjY7F_lyu+m(` z^5@!%E%1sIf<-iET7g&00wOY5YylCO%que#{I4g>zrp+oX2Hs@7Sy8){GqKd3+i8+ z(La(~<(6kl$Y?0+E!3g~6pVPYgsgOBL}3a(#z;E(drpoEc78P(r=PdlEn2u>S!eOM qa*)PSBkN>jxL^#qr<+KRA;34`pdw#DmQPIp0000%D&|RWz?R3S%8@5!h6F=s6G4bYqaW?MzjoCkpng6|s zXV#N@oaktrz{i#`@v)}nB&N==y>HnTvNCfR?M_V%Q~Gzyo8O~>Q6}#e!-ESy&GlaR zu`s+4fAKGyamxbfPlhLUim60w=5E=2>$USub|+s^j;X5ze{YfSp5y*9zfkTo Zkdg0003JNkl$GH;g-ye=E3m76~FBj%$^S3p8p9*q*pSbd*{>iVWHsKF0S;I z^gX4t*wuc`Tb2cq{&%P`@>A8<^(NL(>Ho}s&vtk+Fua<7E9$@Hp92jMpDMqu z1xm9(o%fjY|H;!pyNX@EE&si$I{ZV$w@o%SaA_c5db|2dDUjx3Fk~?LRQ7GXy(6+T z5KNBxck+Mrf8+l~|GU4fb8ui_Wk3UhZHZr2{6GKy)RPIe_L$OOB@D*mE*uUFn%Jcw efQf+-n=k;HAC|A!G+~AS0000kdg0009nNkl*n00Qixp6B9(Lgy*p~IIal_z=X^QudHJ1}^E~hK9-{v*5Qt#- z{wq$zD|}{GH?lE%s@NMj=*7nYb>AD_j2@`4U~2pZK7P|=?WfhWa$EeT3Rw9Hh&-bW zD8u?uo`(+us$E+sK$!9qNA}mjiannACYWKd9vtP?fqKUMeoc$2Ps8-R%me35Fq%um zp^WFkGEkSa*@?4|$HO?Jot$^0%Um2BA@|{OVft3P(}fdRlhI{Yy5}3w1-<2wgX227 z?aGN9-apEq*X6k926S2;hJ-VIjji%#jKd#?5Fy-oaTj42)FiKP!+Aa0Eky#q3WHrS z&iNu3zh*f&F2FF{d|@BC?nrFlJJD(?6nG9g?KO#UW1K5QhplRFIOFG`=iX%>pji{^ z-VU9qz`?m3bl9t%cmdjM&o@Skr{NqrIBnh`3UuYMd>h`IrNZi0&}Nq>jPnO*wLKH~ zS+sLaH;<5OCm;$f(3&M7;b%mwQCjRToVXM^TV?bJZ{;;N57Qi1KA+d1$#g#?oV*YX z-EUliW?Mx}6!~(QXyG-tk4@l2gQw8={YAt|@*=XGhvvcIU;I9_wsHr@N$8-ymqPR0 z)PAT6YQ-7ycHEmULEV%fa9{2on!Y?4<;}cGa-7_?FlM3wDoO0fsC+L}!%wjSVcZ=w z_B|H(320F-O(pjyfPNwBQ1@ub$S7d0{uVndbS$Y2pNj>aig$QhoIye4KGFhsC2Bjx zW8)cOX{s^be77=d(Hem_qP8@hf@#ta^+=)YOLlq^M9V0Q7Lo`l&_G$5;fb@TI)>MS z6_`FDJ1HzXuVtqxggl2h)K&r|mk+1y2_Ixa4TUU=Lg|m;m9}F@hFV^Mbk@$1Y+oMb zWvE9@)n9QTb16yvrKn-`XkbaxFs$HTmZbeH7wWfoU3q4&gqNcl)q|C~%exc)`0cLM xV0mA@ASQ16s;xe2X({Ue+?>6bs6%sUl z=5wmNX+x=cM?cG@Z*M=Wx3_WU$gY-DxaT(E)^*=hf#2W0ec7YVF<0AhkJ^MyIkdg0003|NklAE8oCqP6^J2Th#(YoIRh@jaAR$9RboY0TBz8UW*<_dt4i~Ob~DGonWs6N zDHmgSc1896;1BQmyd3=B*_8?FdJfKrFg8ajkxH`r#|ZrHE^89r%(@^&LP zaU~!CnZY3+ryJx4P}Ww4*H%5boJ10kK>!OHX7MpIn8%#kUo_liM?;42gn8)-kME$x z2MsMkajI;x=~Nv!fDG?7K@n$i6P3?9=x2F1U4N$!WpzoMSmnfG0tr9{|91dxvNb`P z@Pt@#g$O@Ts`FxkI-!h8tg$vKjo=3vo__&~$jeRS1pFY=P4m>Rm+nD{$E*W$KOT$2 zPbKiz-rYZ3=dFef!V_e{6&&9|na3K+gyQ5_WYNiu|AQk^Ne|QKRngBbo7l z(Z#9O-!Ih&DHL`j3;gi;Q|>%Z+C4MQ_`#CC(&&{H^BL7&PFp7vkdg0003JNkl4op8oHYTF~kcIgrY7-m_-=gLr9yLNJGQQw7)|`w#sbRZsr&`=k35ZXB7v& zrAY4&X89~W4uka=>r9+FQTkQ_0Xjv(1s6q9K=4z^2Y#M8=iEFR2+oy!;P`O)ls|M1 zIuQI&@&RmN2ixxJx2v>4V~zJtjVOI7`6Jp1XPnuIh2Wc#513n~OwGtZFjew_qkVIo zU$ytz5PVhoe+S{Q%8^qgO78)3#J^TUPB~o-R}j1l2nEaq#~hp3KyVxo3PjEPJUfe; z5d?1nLIL%=*r2h(o>L)8FG~K1Hs*i>8(RooD*3?jlzsNIZU(`=k`J^Rc{e+0HChnt dDXqo-;1^oHB*H?C%i{n5002ovPDHLkV1gg@i>m+t literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewThumbnail.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-viewThumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..584ba55881f9a192ddea645d6d8525bab205e289 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf68a!PbLn;`1FBoz$1@g2!+&O99 zf!$e4*(j56dDxhu@!aQ2zL__%gK{mTjH$a~4^&m3zt@ zUaiuXsMG0KBR${yp3FT-zMKuGw=rB1}fgF!j@Pa jH|k4Ui#=T&Ln;{WUfJl$U?_6@q5hFP1#Umq154)g5P7Bj9n-%)M8r~??+_T|q$+)-V kia5^-HX{oL#i@)8E52we&r^_U0~*cX>FVdQ&MBb@0BWi($p8QV literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomIn@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomIn@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d49d5ff107f01daa307bd0f89f98efc31eeec7 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4U>7Fi*Ar*|t5-bTK29GBH`OkMs z;LzH(r}lQj`-ICFx#MpBpCa|4zl7P1x1vYwH*5P29X)2dhZ~*=Z`AwIt>?Q+{9j-O zLo#EO)0^fl@rko%`Z-H3Q%PTTaY>Is!UArQV{B|y4S@^{cTUS(`F>5r0%#?Jr>mdK II;Vst0FRG1RsaA1 literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomOut.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomOut.png new file mode 100644 index 0000000000000000000000000000000000000000..156c26b941c12a13130e7a7c181d13300a85de89 GIT binary patch literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6mdKI;Vst01!SC>;M1& literal 0 HcmV?d00001 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomOut@2x.png b/jero-boot-single-startup/src/main/resources/static/generic/web/images/toolbarButton-zoomOut@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..959e1919d5a7a83a9c319de4d65ddaf6dc6c2763 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UCY~;iAr*|t5x6B zz{uFh!Ff-a?~&O9p+bS}jK@2hEqD_O6oi80fl3Ux7>c+~q 0) { // an attribute has been specified + id = key.substring(0, index); + prop = key.substr(index + 1); + } else { // no attribute: assuming text content by default + id = key; + prop = gTextProp; + } + if (!gL10nData[id]) { + gL10nData[id] = {}; + } + gL10nData[id][prop] = data[key]; + } + + // trigger callback + if (successCallback) { + successCallback(); + } + }); + }, failureCallback); + } + + // load and parse all resources for the specified locale + function loadLocale(lang, callback) { + // RFC 4646, section 2.1 states that language tags have to be treated as + // case-insensitive. Convert to lowercase for case-insensitive comparisons. + if (lang) { + lang = lang.toLowerCase(); + } + + callback = callback || function _callback() {}; + + clear(); + gLanguage = lang; + + // check all nodes + // and load the resource files + var langLinks = getL10nResourceLinks(); + var langCount = langLinks.length; + if (langCount === 0) { + // we might have a pre-compiled dictionary instead + var dict = getL10nDictionary(); + if (dict && dict.locales && dict.default_locale) { + console.log('using the embedded JSON directory, early way out'); + gL10nData = dict.locales[lang]; + if (!gL10nData) { + var defaultLocale = dict.default_locale.toLowerCase(); + for (var anyCaseLang in dict.locales) { + anyCaseLang = anyCaseLang.toLowerCase(); + if (anyCaseLang === lang) { + gL10nData = dict.locales[lang]; + break; + } else if (anyCaseLang === defaultLocale) { + gL10nData = dict.locales[defaultLocale]; + } + } + } + callback(); + } else { + console.log('no resource to load, early way out'); + } + // early way out + fireL10nReadyEvent(lang); + gReadyState = 'complete'; + return; + } + + // start the callback when all resources are loaded + var onResourceLoaded = null; + var gResourceCount = 0; + onResourceLoaded = function() { + gResourceCount++; + if (gResourceCount >= langCount) { + callback(); + fireL10nReadyEvent(lang); + gReadyState = 'complete'; + } + }; + + // load all resource files + function L10nResourceLink(link) { + var href = link.href; + // Note: If |gAsyncResourceLoading| is false, then the following callbacks + // are synchronously called. + this.load = function(lang, callback) { + parseResource(href, lang, callback, function() { + console.warn(href + ' not found.'); + // lang not found, used default resource instead + console.warn('"' + lang + '" resource not found'); + gLanguage = ''; + // Resource not loaded, but we still need to call the callback. + callback(); + }); + }; + } + + for (var i = 0; i < langCount; i++) { + var resource = new L10nResourceLink(langLinks[i]); + resource.load(lang, onResourceLoaded); + } + } + + // clear all l10n data + function clear() { + gL10nData = {}; + gTextData = ''; + gLanguage = ''; + // TODO: clear all non predefined macros. + // There's no such macro /yet/ but we're planning to have some... + } + + + /** + * Get rules for plural forms (shared with JetPack), see: + * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html + * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p + * + * @param {string} lang + * locale (language) used. + * + * @return {Function} + * returns a function that gives the plural form name for a given integer: + * var fun = getPluralRules('en'); + * fun(1) -> 'one' + * fun(0) -> 'other' + * fun(1000) -> 'other'. + */ + + function getPluralRules(lang) { + var locales2rules = { + 'af': 3, + 'ak': 4, + 'am': 4, + 'ar': 1, + 'asa': 3, + 'az': 0, + 'be': 11, + 'bem': 3, + 'bez': 3, + 'bg': 3, + 'bh': 4, + 'bm': 0, + 'bn': 3, + 'bo': 0, + 'br': 20, + 'brx': 3, + 'bs': 11, + 'ca': 3, + 'cgg': 3, + 'chr': 3, + 'cs': 12, + 'cy': 17, + 'da': 3, + 'de': 3, + 'dv': 3, + 'dz': 0, + 'ee': 3, + 'el': 3, + 'en': 3, + 'eo': 3, + 'es': 3, + 'et': 3, + 'eu': 3, + 'fa': 0, + 'ff': 5, + 'fi': 3, + 'fil': 4, + 'fo': 3, + 'fr': 5, + 'fur': 3, + 'fy': 3, + 'ga': 8, + 'gd': 24, + 'gl': 3, + 'gsw': 3, + 'gu': 3, + 'guw': 4, + 'gv': 23, + 'ha': 3, + 'haw': 3, + 'he': 2, + 'hi': 4, + 'hr': 11, + 'hu': 0, + 'id': 0, + 'ig': 0, + 'ii': 0, + 'is': 3, + 'it': 3, + 'iu': 7, + 'ja': 0, + 'jmc': 3, + 'jv': 0, + 'ka': 0, + 'kab': 5, + 'kaj': 3, + 'kcg': 3, + 'kde': 0, + 'kea': 0, + 'kk': 3, + 'kl': 3, + 'km': 0, + 'kn': 0, + 'ko': 0, + 'ksb': 3, + 'ksh': 21, + 'ku': 3, + 'kw': 7, + 'lag': 18, + 'lb': 3, + 'lg': 3, + 'ln': 4, + 'lo': 0, + 'lt': 10, + 'lv': 6, + 'mas': 3, + 'mg': 4, + 'mk': 16, + 'ml': 3, + 'mn': 3, + 'mo': 9, + 'mr': 3, + 'ms': 0, + 'mt': 15, + 'my': 0, + 'nah': 3, + 'naq': 7, + 'nb': 3, + 'nd': 3, + 'ne': 3, + 'nl': 3, + 'nn': 3, + 'no': 3, + 'nr': 3, + 'nso': 4, + 'ny': 3, + 'nyn': 3, + 'om': 3, + 'or': 3, + 'pa': 3, + 'pap': 3, + 'pl': 13, + 'ps': 3, + 'pt': 3, + 'rm': 3, + 'ro': 9, + 'rof': 3, + 'ru': 11, + 'rwk': 3, + 'sah': 0, + 'saq': 3, + 'se': 7, + 'seh': 3, + 'ses': 0, + 'sg': 0, + 'sh': 11, + 'shi': 19, + 'sk': 12, + 'sl': 14, + 'sma': 7, + 'smi': 7, + 'smj': 7, + 'smn': 7, + 'sms': 7, + 'sn': 3, + 'so': 3, + 'sq': 3, + 'sr': 11, + 'ss': 3, + 'ssy': 3, + 'st': 3, + 'sv': 3, + 'sw': 3, + 'syr': 3, + 'ta': 3, + 'te': 3, + 'teo': 3, + 'th': 0, + 'ti': 4, + 'tig': 3, + 'tk': 3, + 'tl': 4, + 'tn': 3, + 'to': 0, + 'tr': 0, + 'ts': 3, + 'tzm': 22, + 'uk': 11, + 'ur': 3, + 've': 3, + 'vi': 0, + 'vun': 3, + 'wa': 4, + 'wae': 3, + 'wo': 0, + 'xh': 3, + 'xog': 3, + 'yo': 0, + 'zh': 0, + 'zu': 3 + }; + + // utility functions for plural rules methods + function isIn(n, list) { + return list.indexOf(n) !== -1; + } + function isBetween(n, start, end) { + return start <= n && n <= end; + } + + // list of all plural rules methods: + // map an integer to the plural form name to use + var pluralRules = { + '0': function(n) { + return 'other'; + }, + '1': function(n) { + if ((isBetween((n % 100), 3, 10))) + return 'few'; + if (n === 0) + return 'zero'; + if ((isBetween((n % 100), 11, 99))) + return 'many'; + if (n == 2) + return 'two'; + if (n == 1) + return 'one'; + return 'other'; + }, + '2': function(n) { + if (n !== 0 && (n % 10) === 0) + return 'many'; + if (n == 2) + return 'two'; + if (n == 1) + return 'one'; + return 'other'; + }, + '3': function(n) { + if (n == 1) + return 'one'; + return 'other'; + }, + '4': function(n) { + if ((isBetween(n, 0, 1))) + return 'one'; + return 'other'; + }, + '5': function(n) { + if ((isBetween(n, 0, 2)) && n != 2) + return 'one'; + return 'other'; + }, + '6': function(n) { + if (n === 0) + return 'zero'; + if ((n % 10) == 1 && (n % 100) != 11) + return 'one'; + return 'other'; + }, + '7': function(n) { + if (n == 2) + return 'two'; + if (n == 1) + return 'one'; + return 'other'; + }, + '8': function(n) { + if ((isBetween(n, 3, 6))) + return 'few'; + if ((isBetween(n, 7, 10))) + return 'many'; + if (n == 2) + return 'two'; + if (n == 1) + return 'one'; + return 'other'; + }, + '9': function(n) { + if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19))) + return 'few'; + if (n == 1) + return 'one'; + return 'other'; + }, + '10': function(n) { + if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19))) + return 'few'; + if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19))) + return 'one'; + return 'other'; + }, + '11': function(n) { + if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14))) + return 'few'; + if ((n % 10) === 0 || + (isBetween((n % 10), 5, 9)) || + (isBetween((n % 100), 11, 14))) + return 'many'; + if ((n % 10) == 1 && (n % 100) != 11) + return 'one'; + return 'other'; + }, + '12': function(n) { + if ((isBetween(n, 2, 4))) + return 'few'; + if (n == 1) + return 'one'; + return 'other'; + }, + '13': function(n) { + if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14))) + return 'few'; + if (n != 1 && (isBetween((n % 10), 0, 1)) || + (isBetween((n % 10), 5, 9)) || + (isBetween((n % 100), 12, 14))) + return 'many'; + if (n == 1) + return 'one'; + return 'other'; + }, + '14': function(n) { + if ((isBetween((n % 100), 3, 4))) + return 'few'; + if ((n % 100) == 2) + return 'two'; + if ((n % 100) == 1) + return 'one'; + return 'other'; + }, + '15': function(n) { + if (n === 0 || (isBetween((n % 100), 2, 10))) + return 'few'; + if ((isBetween((n % 100), 11, 19))) + return 'many'; + if (n == 1) + return 'one'; + return 'other'; + }, + '16': function(n) { + if ((n % 10) == 1 && n != 11) + return 'one'; + return 'other'; + }, + '17': function(n) { + if (n == 3) + return 'few'; + if (n === 0) + return 'zero'; + if (n == 6) + return 'many'; + if (n == 2) + return 'two'; + if (n == 1) + return 'one'; + return 'other'; + }, + '18': function(n) { + if (n === 0) + return 'zero'; + if ((isBetween(n, 0, 2)) && n !== 0 && n != 2) + return 'one'; + return 'other'; + }, + '19': function(n) { + if ((isBetween(n, 2, 10))) + return 'few'; + if ((isBetween(n, 0, 1))) + return 'one'; + return 'other'; + }, + '20': function(n) { + if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !( + isBetween((n % 100), 10, 19) || + isBetween((n % 100), 70, 79) || + isBetween((n % 100), 90, 99) + )) + return 'few'; + if ((n % 1000000) === 0 && n !== 0) + return 'many'; + if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92])) + return 'two'; + if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91])) + return 'one'; + return 'other'; + }, + '21': function(n) { + if (n === 0) + return 'zero'; + if (n == 1) + return 'one'; + return 'other'; + }, + '22': function(n) { + if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99))) + return 'one'; + return 'other'; + }, + '23': function(n) { + if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0) + return 'one'; + return 'other'; + }, + '24': function(n) { + if ((isBetween(n, 3, 10) || isBetween(n, 13, 19))) + return 'few'; + if (isIn(n, [2, 12])) + return 'two'; + if (isIn(n, [1, 11])) + return 'one'; + return 'other'; + } + }; + + // return a function that gives the plural form name for a given integer + var index = locales2rules[lang.replace(/-.*$/, '')]; + if (!(index in pluralRules)) { + console.warn('plural form unknown for [' + lang + ']'); + return function() { return 'other'; }; + } + return pluralRules[index]; + } + + // pre-defined 'plural' macro + gMacros.plural = function(str, param, key, prop) { + var n = parseFloat(param); + if (isNaN(n)) + return str; + + // TODO: support other properties (l20n still doesn't...) + if (prop != gTextProp) + return str; + + // initialize _pluralRules + if (!gMacros._pluralRules) { + gMacros._pluralRules = getPluralRules(gLanguage); + } + var index = '[' + gMacros._pluralRules(n) + ']'; + + // try to find a [zero|one|two] key if it's defined + if (n === 0 && (key + '[zero]') in gL10nData) { + str = gL10nData[key + '[zero]'][prop]; + } else if (n == 1 && (key + '[one]') in gL10nData) { + str = gL10nData[key + '[one]'][prop]; + } else if (n == 2 && (key + '[two]') in gL10nData) { + str = gL10nData[key + '[two]'][prop]; + } else if ((key + index) in gL10nData) { + str = gL10nData[key + index][prop]; + } else if ((key + '[other]') in gL10nData) { + str = gL10nData[key + '[other]'][prop]; + } + + return str; + }; + + + /** + * l10n dictionary functions + */ + + // fetch an l10n object, warn if not found, apply `args' if possible + function getL10nData(key, args, fallback) { + var data = gL10nData[key]; + if (!data) { + console.warn('#' + key + ' is undefined.'); + if (!fallback) { + return null; + } + data = fallback; + } + + /** This is where l10n expressions should be processed. + * The plan is to support C-style expressions from the l20n project; + * until then, only two kinds of simple expressions are supported: + * {[ index ]} and {{ arguments }}. + */ + var rv = {}; + for (var prop in data) { + var str = data[prop]; + str = substIndexes(str, args, key, prop); + str = substArguments(str, args, key); + rv[prop] = str; + } + return rv; + } + + // replace {[macros]} with their values + function substIndexes(str, args, key, prop) { + var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/; + var reMatch = reIndex.exec(str); + if (!reMatch || !reMatch.length) + return str; + + // an index/macro has been found + // Note: at the moment, only one parameter is supported + var macroName = reMatch[1]; + var paramName = reMatch[2]; + var param; + if (args && paramName in args) { + param = args[paramName]; + } else if (paramName in gL10nData) { + param = gL10nData[paramName]; + } + + // there's no macro parser yet: it has to be defined in gMacros + if (macroName in gMacros) { + var macro = gMacros[macroName]; + str = macro(str, param, key, prop); + } + return str; + } + + // replace {{arguments}} with their values + function substArguments(str, args, key) { + var reArgs = /\{\{\s*(.+?)\s*\}\}/g; + return str.replace(reArgs, function(matched_text, arg) { + if (args && arg in args) { + return args[arg]; + } + if (arg in gL10nData) { + return gL10nData[arg]; + } + console.log('argument {{' + arg + '}} for #' + key + ' is undefined.'); + return matched_text; + }); + } + + // translate an HTML element + function translateElement(element) { + var l10n = getL10nAttributes(element); + if (!l10n.id) + return; + + // get the related l10n object + var data = getL10nData(l10n.id, l10n.args); + if (!data) { + console.warn('#' + l10n.id + ' is undefined.'); + return; + } + + // translate element (TODO: security checks?) + if (data[gTextProp]) { // XXX + if (getChildElementCount(element) === 0) { + element[gTextProp] = data[gTextProp]; + } else { + // this element has element children: replace the content of the first + // (non-empty) child textNode and clear other child textNodes + var children = element.childNodes; + var found = false; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) { + if (found) { + children[i].nodeValue = ''; + } else { + children[i].nodeValue = data[gTextProp]; + found = true; + } + } + } + // if no (non-empty) textNode is found, insert a textNode before the + // first element child. + if (!found) { + var textNode = document.createTextNode(data[gTextProp]); + element.insertBefore(textNode, element.firstChild); + } + } + delete data[gTextProp]; + } + + for (var k in data) { + element[k] = data[k]; + } + } + + // webkit browsers don't currently support 'children' on SVG elements... + function getChildElementCount(element) { + if (element.children) { + return element.children.length; + } + if (typeof element.childElementCount !== 'undefined') { + return element.childElementCount; + } + var count = 0; + for (var i = 0; i < element.childNodes.length; i++) { + count += element.nodeType === 1 ? 1 : 0; + } + return count; + } + + // translate an HTML subtree + function translateFragment(element) { + element = element || document.documentElement; + + // check all translatable children (= w/ a `data-l10n-id' attribute) + var children = getTranslatableChildren(element); + var elementCount = children.length; + for (var i = 0; i < elementCount; i++) { + translateElement(children[i]); + } + + // translate element itself if necessary + translateElement(element); + } + + return { + // get a localized string + get: function(key, args, fallbackString) { + var index = key.lastIndexOf('.'); + var prop = gTextProp; + if (index > 0) { // An attribute has been specified + prop = key.substr(index + 1); + key = key.substring(0, index); + } + var fallback; + if (fallbackString) { + fallback = {}; + fallback[prop] = fallbackString; + } + var data = getL10nData(key, args, fallback); + if (data && prop in data) { + return data[prop]; + } + return '{{' + key + '}}'; + }, + + // debug + getData: function() { return gL10nData; }, + getText: function() { return gTextData; }, + + // get|set the document language + getLanguage: function() { return gLanguage; }, + setLanguage: function(lang, callback) { + loadLocale(lang, function() { + if (callback) + callback(); + translateFragment(); + }); + }, + + // get the direction (ltr|rtl) of the current language + getDirection: function() { + // http://www.w3.org/International/questions/qa-scripts + // Arabic, Hebrew, Farsi, Pashto, Urdu + var rtlList = ['ar', 'he', 'fa', 'ps', 'ur']; + var shortCode = gLanguage.split('-', 1)[0]; + return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr'; + }, + + // translate an element or document fragment + translate: translateFragment, + + // this can be used to prevent race conditions + getReadyState: function() { return gReadyState; }, + ready: function(callback) { + if (!callback) { + return; + } else if (gReadyState == 'complete' || gReadyState == 'interactive') { + window.setTimeout(function() { + callback(); + }); + } else if (document.addEventListener) { + document.addEventListener('localized', function once() { + document.removeEventListener('localized', once); + callback(); + }); + } + } + }; +}) (window, document); diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/locale/locale.properties b/jero-boot-single-startup/src/main/resources/static/generic/web/locale/locale.properties new file mode 100644 index 00000000..9aded1b5 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/locale/locale.properties @@ -0,0 +1,312 @@ +[ach] +@import url(ach/viewer.properties) + +[af] +@import url(af/viewer.properties) + +[ak] +@import url(ak/viewer.properties) + +[an] +@import url(an/viewer.properties) + +[ar] +@import url(ar/viewer.properties) + +[as] +@import url(as/viewer.properties) + +[ast] +@import url(ast/viewer.properties) + +[az] +@import url(az/viewer.properties) + +[be] +@import url(be/viewer.properties) + +[bg] +@import url(bg/viewer.properties) + +[bn-BD] +@import url(bn-BD/viewer.properties) + +[bn-IN] +@import url(bn-IN/viewer.properties) + +[br] +@import url(br/viewer.properties) + +[bs] +@import url(bs/viewer.properties) + +[ca] +@import url(ca/viewer.properties) + +[cs] +@import url(cs/viewer.properties) + +[csb] +@import url(csb/viewer.properties) + +[cy] +@import url(cy/viewer.properties) + +[da] +@import url(da/viewer.properties) + +[de] +@import url(de/viewer.properties) + +[el] +@import url(el/viewer.properties) + +[en-GB] +@import url(en-GB/viewer.properties) + +[en-US] +@import url(en-US/viewer.properties) + +[en-ZA] +@import url(en-ZA/viewer.properties) + +[eo] +@import url(eo/viewer.properties) + +[es-AR] +@import url(es-AR/viewer.properties) + +[es-CL] +@import url(es-CL/viewer.properties) + +[es-ES] +@import url(es-ES/viewer.properties) + +[es-MX] +@import url(es-MX/viewer.properties) + +[et] +@import url(et/viewer.properties) + +[eu] +@import url(eu/viewer.properties) + +[fa] +@import url(fa/viewer.properties) + +[ff] +@import url(ff/viewer.properties) + +[fi] +@import url(fi/viewer.properties) + +[fr] +@import url(fr/viewer.properties) + +[fy-NL] +@import url(fy-NL/viewer.properties) + +[ga-IE] +@import url(ga-IE/viewer.properties) + +[gd] +@import url(gd/viewer.properties) + +[gl] +@import url(gl/viewer.properties) + +[gu-IN] +@import url(gu-IN/viewer.properties) + +[he] +@import url(he/viewer.properties) + +[hi-IN] +@import url(hi-IN/viewer.properties) + +[hr] +@import url(hr/viewer.properties) + +[hu] +@import url(hu/viewer.properties) + +[hy-AM] +@import url(hy-AM/viewer.properties) + +[id] +@import url(id/viewer.properties) + +[is] +@import url(is/viewer.properties) + +[it] +@import url(it/viewer.properties) + +[ja] +@import url(ja/viewer.properties) + +[ka] +@import url(ka/viewer.properties) + +[kk] +@import url(kk/viewer.properties) + +[km] +@import url(km/viewer.properties) + +[kn] +@import url(kn/viewer.properties) + +[ko] +@import url(ko/viewer.properties) + +[ku] +@import url(ku/viewer.properties) + +[lg] +@import url(lg/viewer.properties) + +[lij] +@import url(lij/viewer.properties) + +[lt] +@import url(lt/viewer.properties) + +[lv] +@import url(lv/viewer.properties) + +[mai] +@import url(mai/viewer.properties) + +[mk] +@import url(mk/viewer.properties) + +[ml] +@import url(ml/viewer.properties) + +[mn] +@import url(mn/viewer.properties) + +[mr] +@import url(mr/viewer.properties) + +[ms] +@import url(ms/viewer.properties) + +[my] +@import url(my/viewer.properties) + +[nb-NO] +@import url(nb-NO/viewer.properties) + +[nl] +@import url(nl/viewer.properties) + +[nn-NO] +@import url(nn-NO/viewer.properties) + +[nso] +@import url(nso/viewer.properties) + +[oc] +@import url(oc/viewer.properties) + +[or] +@import url(or/viewer.properties) + +[pa-IN] +@import url(pa-IN/viewer.properties) + +[pl] +@import url(pl/viewer.properties) + +[pt-BR] +@import url(pt-BR/viewer.properties) + +[pt-PT] +@import url(pt-PT/viewer.properties) + +[rm] +@import url(rm/viewer.properties) + +[ro] +@import url(ro/viewer.properties) + +[ru] +@import url(ru/viewer.properties) + +[rw] +@import url(rw/viewer.properties) + +[sah] +@import url(sah/viewer.properties) + +[si] +@import url(si/viewer.properties) + +[sk] +@import url(sk/viewer.properties) + +[sl] +@import url(sl/viewer.properties) + +[son] +@import url(son/viewer.properties) + +[sq] +@import url(sq/viewer.properties) + +[sr] +@import url(sr/viewer.properties) + +[sv-SE] +@import url(sv-SE/viewer.properties) + +[sw] +@import url(sw/viewer.properties) + +[ta] +@import url(ta/viewer.properties) + +[ta-LK] +@import url(ta-LK/viewer.properties) + +[te] +@import url(te/viewer.properties) + +[th] +@import url(th/viewer.properties) + +[tl] +@import url(tl/viewer.properties) + +[tn] +@import url(tn/viewer.properties) + +[tr] +@import url(tr/viewer.properties) + +[uk] +@import url(uk/viewer.properties) + +[ur] +@import url(ur/viewer.properties) + +[vi] +@import url(vi/viewer.properties) + +[wo] +@import url(wo/viewer.properties) + +[xh] +@import url(xh/viewer.properties) + +[zh-CN] +@import url(zh-CN/viewer.properties) + +[zh-TW] +@import url(zh-TW/viewer.properties) + +[zu] +@import url(zu/viewer.properties) + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/locale/zh-CN/viewer.properties b/jero-boot-single-startup/src/main/resources/static/generic/web/locale/zh-CN/viewer.properties new file mode 100644 index 00000000..6ec25f7a --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/locale/zh-CN/viewer.properties @@ -0,0 +1,167 @@ +# Copyright 2012 Mozilla Foundation +# +# 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. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=上一页 +previous_label=上一页 +next.title=下一页 +next_label=下一页 + +# LOCALIZATION NOTE (page_label, page_of): +# These strings are concatenated to form the "Page: X of Y" string. +# Do not translate "{{pageCount}}", it will be substituted with a number +# representing the total number of pages. +page_label=页面: +page_of=/ {{pageCount}} + +zoom_out.title=缩小 +zoom_out_label=缩小 +zoom_in.title=放大 +zoom_in_label=放大 +zoom.title=缩放 +presentation_mode.title=切换到演示模式 +presentation_mode_label=演示模式 +open_file.title=打开文件 +open_file_label=打开 +print.title=打印 +print_label=打印 +download.title=下载 +download_label=下载 +bookmark.title=当前视图(复制或在新窗口中打开) +bookmark_label=当前视图 + +# Secondary toolbar and context menu +tools.title=工具 +tools_label=工具 +first_page.title=转到第一页 +first_page.label=转到第一页 +first_page_label=转到第一页 +last_page.title=转到最后一页 +last_page.label=转到最后一页 +last_page_label=转到最后一页 +page_rotate_cw.title=顺时针旋转 +page_rotate_cw.label=顺时针旋转 +page_rotate_cw_label=顺时针旋转 +page_rotate_ccw.title=逆时针旋转 +page_rotate_ccw.label=逆时针旋转 +page_rotate_ccw_label=逆时针旋转 + +hand_tool_enable.title=启用手形工具 +hand_tool_enable_label=启用手形工具 +hand_tool_disable.title=禁用手形工具 +hand_tool_disable_label=禁用手形工具 + +# Document properties dialog box +document_properties.title=文档属性… +document_properties_label=文档属性… +document_properties_file_name=文件名: +document_properties_file_size=文件大小: +document_properties_kb={{size_kb}} KB ({{size_b}} 字节) +document_properties_mb={{size_mb}} MB ({{size_b}} 字节) +document_properties_title=标题: +document_properties_author=作者: +document_properties_subject=主题: +document_properties_keywords=关键词: +document_properties_creation_date=创建日期: +document_properties_modification_date=修改日期: +document_properties_date_string={{date}}, {{time}} +document_properties_creator=创建者: +document_properties_producer=PDF 制作者: +document_properties_version=PDF 版本: +document_properties_page_count=页数: +document_properties_close=关闭 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=切换侧栏 +toggle_sidebar_label=切换侧栏 +outline.title=显示文档大纲 +outline_label=文档大纲 +attachments.title=显示附件 +attachments_label=附件 +thumbs.title=显示缩略图 +thumbs_label=缩略图 +findbar.title=在文档中查找 +findbar_label=查找 + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=页码 {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=页面 {{page}} 的缩略图 + +# Find panel button title and messages +find_label=查找: +find_previous.title=查找词语上一次出现的位置 +find_previous_label=上一页 +find_next.title=查找词语后一次出现的位置 +find_next_label=下一页 +find_highlight=全部高亮显示 +find_match_case_label=区分大小写 +find_reached_top=到达文档开头,从末尾继续 +find_reached_bottom=到达文档末尾,从开头继续 +find_not_found=词语未找到 + +# Error panel labels +error_more_info=更多信息 +error_less_info=更少信息 +error_close=关闭 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=信息:{{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=堆栈:{{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=文件:{{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行号:{{line}} +rendering_error=渲染页面时发生错误。 + +# Predefined zoom values +page_scale_width=适合页宽 +page_scale_fit=适合页面 +page_scale_auto=自动缩放 +page_scale_actual=实际大小 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=错误 +loading_error=载入PDF时发生错误。 +invalid_file_error=无效或损坏的PDF文件。 +missing_file_error=缺少PDF文件。 +unexpected_response_error=意外的服务器响应。 + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 注解] +password_label=输入密码以打开此 PDF 文件。 +password_invalid=密码无效。请重试。 +password_ok=确定 +password_cancel=取消 + +printing_not_supported=警告:打印功能不完全支持此浏览器。 +printing_not_ready=警告:该 PDF 未完全加载以供打印。 +web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的PDF字体。 +document_colors_disabled=不允许 PDF 文档使用自己的颜色:浏览器中“允许页面选择自己的颜色”的选项已停用。 diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/viewer.css b/jero-boot-single-startup/src/main/resources/static/generic/web/viewer.css new file mode 100644 index 00000000..a82150c4 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/viewer.css @@ -0,0 +1,1999 @@ +/* Copyright 2014 Mozilla Foundation + * + * 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. + */ + +.textLayer { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; + opacity: 0.2; +} + +.textLayer > div { + color: transparent; + position: absolute; + white-space: pre; + cursor: text; + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -o-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; +} + +.textLayer .highlight { + margin: -1px; + padding: 1px; + + background-color: rgb(180, 0, 170); + border-radius: 4px; +} + +.textLayer .highlight.begin { + border-radius: 4px 0px 0px 4px; +} + +.textLayer .highlight.end { + border-radius: 0px 4px 4px 0px; +} + +.textLayer .highlight.middle { + border-radius: 0px; +} + +.textLayer .highlight.selected { + background-color: rgb(0, 100, 0); +} + +.textLayer ::selection { background: rgb(0,0,255); } +.textLayer ::-moz-selection { background: rgb(0,0,255); } + +.pdfViewer .canvasWrapper { + overflow: hidden; +} + +.pdfViewer .page { + direction: ltr; + width: 816px; + height: 1056px; + margin: 1px auto -8px auto; + position: relative; + overflow: visible; + border: 9px solid transparent; + background-clip: content-box; + border-image: url(images/shadow.png) 9 9 repeat; + background-color: white; +} + +.pdfViewer.removePageBorders .page { + margin: 0px auto 10px auto; + border: none; +} + +.pdfViewer .page canvas { + margin: 0; + display: block; +} + +.pdfViewer .page .loadingIcon { + position: absolute; + display: block; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: url('images/loading-icon.gif') center no-repeat; +} + +.pdfViewer .page .annotLink > a:hover { + opacity: 0.2; + background: #ff0; + box-shadow: 0px 2px 10px #ff0; +} + +.pdfPresentationMode:-webkit-full-screen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +.pdfPresentationMode:-moz-full-screen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +.pdfPresentationMode:-ms-fullscreen .pdfViewer .page { + margin-bottom: 100% !important; + border: 0; +} + +.pdfPresentationMode:fullscreen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +.pdfViewer .page .annotText > img { + position: absolute; + cursor: pointer; +} + +.pdfViewer .page .annotTextContentWrapper { + position: absolute; + width: 20em; +} + +.pdfViewer .page .annotTextContent { + z-index: 200; + float: left; + max-width: 20em; + background-color: #FFFF99; + box-shadow: 0px 2px 5px #333; + border-radius: 2px; + padding: 0.6em; + cursor: pointer; +} + +.pdfViewer .page .annotTextContent > h1 { + font-size: 1em; + border-bottom: 1px solid #000000; + padding-bottom: 0.2em; +} + +.pdfViewer .page .annotTextContent > p { + padding-top: 0.2em; +} + +.pdfViewer .page .annotLink > a { + position: absolute; + font-size: 1em; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.pdfViewer .page .annotLink > a /* -ms-a */ { + background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\ + LAAAAAABAAEAAAIBRAA7") 0 0 repeat; +} + +* { + padding: 0; + margin: 0; +} + +html { + height: 100%; + /* Font size is needed to make the activity bar the correct size. */ + font-size: 10px; +} + +body { + height: 100%; + background-color: #404040; + background-image: url(images/texture.png); +} + +body, +input, +button, +select { + font: message-box; + outline: none; +} + +.hidden { + display: none !important; +} +[hidden] { + display: none !important; +} + +#viewerContainer.pdfPresentationMode:-webkit-full-screen { + top: 0px; + border-top: 2px solid transparent; + background-color: #000; + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -webkit-user-select: none; +} + +#viewerContainer.pdfPresentationMode:-moz-full-screen { + top: 0px; + border-top: 2px solid transparent; + background-color: #000; + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -moz-user-select: none; +} + +#viewerContainer.pdfPresentationMode:-ms-fullscreen { + top: 0px !important; + border-top: 2px solid transparent; + width: 100%; + height: 100%; + overflow: hidden !important; + cursor: none; + -ms-user-select: none; +} + +#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop { + background-color: #000; +} + +#viewerContainer.pdfPresentationMode:fullscreen { + top: 0px; + border-top: 2px solid transparent; + background-color: #000; + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) { + display: none; +} + +.pdfPresentationMode:-moz-full-screen a:not(.internalLink) { + display: none; +} + +.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) { + display: none !important; +} + +.pdfPresentationMode:fullscreen a:not(.internalLink) { + display: none; +} + +.pdfPresentationMode:-webkit-full-screen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode:-moz-full-screen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode:-ms-fullscreen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode:fullscreen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode.pdfPresentationModeControls > *, +.pdfPresentationMode.pdfPresentationModeControls .textLayer > div { + cursor: default; +} + +/* outer/inner center provides horizontal center */ +.outerCenter { + pointer-events: none; + position: relative; +} +html[dir='ltr'] .outerCenter { + float: right; + right: 50%; +} +html[dir='rtl'] .outerCenter { + float: left; + left: 50%; +} +.innerCenter { + pointer-events: auto; + position: relative; +} +html[dir='ltr'] .innerCenter { + float: right; + right: -50%; +} +html[dir='rtl'] .innerCenter { + float: left; + left: -50%; +} + +#outerContainer { + width: 100%; + height: 100%; + position: relative; +} + +#sidebarContainer { + position: absolute; + top: 0; + bottom: 0; + width: 200px; + visibility: hidden; + -webkit-transition-duration: 200ms; + -webkit-transition-timing-function: ease; + transition-duration: 200ms; + transition-timing-function: ease; + +} +html[dir='ltr'] #sidebarContainer { + -webkit-transition-property: left; + transition-property: left; + left: -200px; +} +html[dir='rtl'] #sidebarContainer { + -webkit-transition-property: right; + transition-property: right; + right: -200px; +} + +#outerContainer.sidebarMoving > #sidebarContainer, +#outerContainer.sidebarOpen > #sidebarContainer { + visibility: visible; +} +html[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer { + left: 0px; +} +html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer { + right: 0px; +} + +#mainContainer { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + min-width: 320px; + -webkit-transition-duration: 200ms; + -webkit-transition-timing-function: ease; + transition-duration: 200ms; + transition-timing-function: ease; +} +html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer { + -webkit-transition-property: left; + transition-property: left; + left: 200px; +} +html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer { + -webkit-transition-property: right; + transition-property: right; + right: 200px; +} + +#sidebarContent { + top: 32px; + bottom: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; + position: absolute; + width: 200px; + background-color: hsla(0,0%,0%,.1); +} +html[dir='ltr'] #sidebarContent { + left: 0; + box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25); +} +html[dir='rtl'] #sidebarContent { + right: 0; + box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25); +} + +#viewerContainer { + overflow: auto; + -webkit-overflow-scrolling: touch; + position: absolute; + top: 32px; + right: 0; + bottom: 0; + left: 0; + outline: none; +} +html[dir='ltr'] #viewerContainer { + box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05); +} +html[dir='rtl'] #viewerContainer { + box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05); +} + +.toolbar { + position: relative; + left: 0; + right: 0; + z-index: 9999; + cursor: default; +} + +#toolbarContainer { + width: 100%; +} + +#toolbarSidebar { + width: 200px; + height: 32px; + background-color: #424242; /* fallback */ + background-image: url(images/texture.png), + linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); +} +html[dir='ltr'] #toolbarSidebar { + box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), + inset 0 -1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 0 1px hsla(0,0%,0%,.1); +} +html[dir='rtl'] #toolbarSidebar { + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), + inset 0 1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 0 1px hsla(0,0%,0%,.1); +} + +#toolbarContainer, .findbar, .secondaryToolbar { + position: relative; + height: 32px; + background-color: #474747; /* fallback */ + background-image: url(images/texture.png), + linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); +} +html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar { + box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08), + inset 0 1px 1px hsla(0,0%,0%,.15), + inset 0 -1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 1px 1px hsla(0,0%,0%,.1); +} +html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar { + box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08), + inset 0 1px 1px hsla(0,0%,0%,.15), + inset 0 -1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 1px 1px hsla(0,0%,0%,.1); +} + +#toolbarViewer { + height: 32px; +} + +#loadingBar { + position: relative; + width: 100%; + height: 4px; + background-color: #333; + border-bottom: 1px solid #333; +} + +#loadingBar .progress { + position: absolute; + top: 0; + left: 0; + width: 0%; + height: 100%; + background-color: #ddd; + overflow: hidden; + -webkit-transition: width 200ms; + transition: width 200ms; +} + +@-webkit-keyframes progressIndeterminate { + 0% { left: 0%; } + 50% { left: 100%; } + 100% { left: 100%; } +} + +@keyframes progressIndeterminate { + 0% { left: 0%; } + 50% { left: 100%; } + 100% { left: 100%; } +} + +#loadingBar .progress.indeterminate { + background-color: #999; + -webkit-transition: none; + transition: none; +} + +#loadingBar .indeterminate .glimmer { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 50px; + + background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%); + background-size: 100% 100%; + background-repeat: no-repeat; + + -webkit-animation: progressIndeterminate 2s linear infinite; + animation: progressIndeterminate 2s linear infinite; +} + +.findbar, .secondaryToolbar { + top: 32px; + position: absolute; + z-index: 10000; + height: 32px; + + min-width: 16px; + padding: 0px 6px 0px 6px; + margin: 4px 2px 4px 2px; + color: hsl(0,0%,85%); + font-size: 12px; + line-height: 14px; + text-align: left; + cursor: default; +} + +html[dir='ltr'] .findbar { + left: 68px; +} + +html[dir='rtl'] .findbar { + right: 68px; +} + +.findbar label { + -webkit-user-select: none; + -moz-user-select: none; +} + +#findInput[data-status="pending"] { + background-image: url(images/loading-small.png); + background-repeat: no-repeat; + background-position: right; +} +html[dir='rtl'] #findInput[data-status="pending"] { + background-position: left; +} + +.secondaryToolbar { + padding: 6px; + height: auto; + z-index: 30000; +} +html[dir='ltr'] .secondaryToolbar { + right: 4px; +} +html[dir='rtl'] .secondaryToolbar { + left: 4px; +} + +#secondaryToolbarButtonContainer { + max-width: 200px; + max-height: 400px; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + margin-bottom: -4px; +} + +.doorHanger, +.doorHangerRight { + border: 1px solid hsla(0,0%,0%,.5); + border-radius: 2px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); +} +.doorHanger:after, .doorHanger:before, +.doorHangerRight:after, .doorHangerRight:before { + bottom: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} +.doorHanger:after, +.doorHangerRight:after { + border-bottom-color: hsla(0,0%,32%,.99); + border-width: 8px; +} +.doorHanger:before, +.doorHangerRight:before { + border-bottom-color: hsla(0,0%,0%,.5); + border-width: 9px; +} + +html[dir='ltr'] .doorHanger:after, +html[dir='rtl'] .doorHangerRight:after { + left: 13px; + margin-left: -8px; +} + +html[dir='ltr'] .doorHanger:before, +html[dir='rtl'] .doorHangerRight:before { + left: 13px; + margin-left: -9px; +} + +html[dir='rtl'] .doorHanger:after, +html[dir='ltr'] .doorHangerRight:after { + right: 13px; + margin-right: -8px; +} + +html[dir='rtl'] .doorHanger:before, +html[dir='ltr'] .doorHangerRight:before { + right: 13px; + margin-right: -9px; +} + +#findMsg { + font-style: italic; + color: #A6B7D0; +} + +#findInput.notFound { + background-color: rgb(255, 102, 102); +} + +html[dir='ltr'] #toolbarViewerLeft { + margin-left: -1px; +} +html[dir='rtl'] #toolbarViewerRight { + margin-right: -1px; +} + +html[dir='ltr'] #toolbarViewerLeft, +html[dir='rtl'] #toolbarViewerRight { + position: absolute; + top: 0; + left: 0; +} +html[dir='ltr'] #toolbarViewerRight, +html[dir='rtl'] #toolbarViewerLeft { + position: absolute; + top: 0; + right: 0; +} +html[dir='ltr'] #toolbarViewerLeft > *, +html[dir='ltr'] #toolbarViewerMiddle > *, +html[dir='ltr'] #toolbarViewerRight > *, +html[dir='ltr'] .findbar > * { + position: relative; + float: left; +} +html[dir='rtl'] #toolbarViewerLeft > *, +html[dir='rtl'] #toolbarViewerMiddle > *, +html[dir='rtl'] #toolbarViewerRight > *, +html[dir='rtl'] .findbar > * { + position: relative; + float: right; +} + +html[dir='ltr'] .splitToolbarButton { + margin: 3px 2px 4px 0; + display: inline-block; +} +html[dir='rtl'] .splitToolbarButton { + margin: 3px 0 4px 2px; + display: inline-block; +} +html[dir='ltr'] .splitToolbarButton > .toolbarButton { + border-radius: 0; + float: left; +} +html[dir='rtl'] .splitToolbarButton > .toolbarButton { + border-radius: 0; + float: right; +} + +.toolbarButton, +.secondaryToolbarButton, +.overlayButton { + border: 0 none; + background: none; + width: 32px; + height: 25px; +} + +.toolbarButton > span { + display: inline-block; + width: 0; + height: 0; + overflow: hidden; +} + +.toolbarButton[disabled], +.secondaryToolbarButton[disabled], +.overlayButton[disabled] { + opacity: .5; +} + +.toolbarButton.group { + margin-right: 0; +} + +.splitToolbarButton.toggled .toolbarButton { + margin: 0; +} + +.splitToolbarButton:hover > .toolbarButton, +.splitToolbarButton:focus > .toolbarButton, +.splitToolbarButton.toggled > .toolbarButton, +.toolbarButton.textButton { + background-color: hsla(0,0%,0%,.12); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-clip: padding-box; + border: 1px solid hsla(0,0%,0%,.35); + border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); + box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, + 0 0 1px hsla(0,0%,100%,.15) inset, + 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-property: background-color, border-color, box-shadow; + transition-duration: 150ms; + transition-timing-function: ease; + +} +.splitToolbarButton > .toolbarButton:hover, +.splitToolbarButton > .toolbarButton:focus, +.dropdownToolbarButton:hover, +.overlayButton:hover, +.toolbarButton.textButton:hover, +.toolbarButton.textButton:focus { + background-color: hsla(0,0%,0%,.2); + box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, + 0 0 1px hsla(0,0%,100%,.15) inset, + 0 0 1px hsla(0,0%,0%,.05); + z-index: 199; +} +.splitToolbarButton > .toolbarButton { + position: relative; +} +html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child, +html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child { + position: relative; + margin: 0; + margin-right: -1px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + border-right-color: transparent; +} +html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child, +html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child { + position: relative; + margin: 0; + margin-left: -1px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-left-color: transparent; +} +.splitToolbarButtonSeparator { + padding: 8px 0; + width: 1px; + background-color: hsla(0,0%,0%,.5); + z-index: 99; + box-shadow: 0 0 0 1px hsla(0,0%,100%,.08); + display: inline-block; + margin: 5px 0; +} +html[dir='ltr'] .splitToolbarButtonSeparator { + float: left; +} +html[dir='rtl'] .splitToolbarButtonSeparator { + float: right; +} +.splitToolbarButton:hover > .splitToolbarButtonSeparator, +.splitToolbarButton.toggled > .splitToolbarButtonSeparator { + padding: 12px 0; + margin: 1px 0; + box-shadow: 0 0 0 1px hsla(0,0%,100%,.03); + -webkit-transition-property: padding; + -webkit-transition-duration: 10ms; + -webkit-transition-timing-function: ease; + transition-property: padding; + transition-duration: 10ms; + transition-timing-function: ease; +} + +.toolbarButton, +.dropdownToolbarButton, +.secondaryToolbarButton, +.overlayButton { + min-width: 16px; + padding: 2px 6px 0; + border: 1px solid transparent; + border-radius: 2px; + color: hsla(0,0%,100%,.8); + font-size: 12px; + line-height: 14px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + /* Opera does not support user-select, use <... unselectable="on"> instead */ + cursor: default; + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-property: background-color, border-color, box-shadow; + transition-duration: 150ms; + transition-timing-function: ease; +} + +html[dir='ltr'] .toolbarButton, +html[dir='ltr'] .overlayButton, +html[dir='ltr'] .dropdownToolbarButton { + margin: 3px 2px 4px 0; +} +html[dir='rtl'] .toolbarButton, +html[dir='rtl'] .overlayButton, +html[dir='rtl'] .dropdownToolbarButton { + margin: 3px 0 4px 2px; +} + +.toolbarButton:hover, +.toolbarButton:focus, +.dropdownToolbarButton, +.overlayButton, +.secondaryToolbarButton:hover, +.secondaryToolbarButton:focus { + background-color: hsla(0,0%,0%,.12); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-clip: padding-box; + border: 1px solid hsla(0,0%,0%,.35); + border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); + box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, + 0 0 1px hsla(0,0%,100%,.15) inset, + 0 1px 0 hsla(0,0%,100%,.05); +} + +.toolbarButton:hover:active, +.overlayButton:hover:active, +.dropdownToolbarButton:hover:active, +.secondaryToolbarButton:hover:active { + background-color: hsla(0,0%,0%,.2); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45); + box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, + 0 0 1px hsla(0,0%,0%,.2) inset, + 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 10ms; + -webkit-transition-timing-function: linear; + transition-property: background-color, border-color, box-shadow; + transition-duration: 10ms; + transition-timing-function: linear; +} + +.toolbarButton.toggled, +.splitToolbarButton.toggled > .toolbarButton.toggled, +.secondaryToolbarButton.toggled { + background-color: hsla(0,0%,0%,.3); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5); + box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, + 0 0 1px hsla(0,0%,0%,.2) inset, + 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 10ms; + -webkit-transition-timing-function: linear; + transition-property: background-color, border-color, box-shadow; + transition-duration: 10ms; + transition-timing-function: linear; +} + +.toolbarButton.toggled:hover:active, +.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active, +.secondaryToolbarButton.toggled:hover:active { + background-color: hsla(0,0%,0%,.4); + border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55); + box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset, + 0 0 1px hsla(0,0%,0%,.3) inset, + 0 1px 0 hsla(0,0%,100%,.05); +} + +.dropdownToolbarButton { + width: 120px; + max-width: 120px; + padding: 3px 2px 2px; + overflow: hidden; + background: url(images/toolbarButton-menuArrows.png) no-repeat; +} +html[dir='ltr'] .dropdownToolbarButton { + background-position: 95%; +} +html[dir='rtl'] .dropdownToolbarButton { + background-position: 5%; +} + +.dropdownToolbarButton > select { + min-width: 140px; + font-size: 12px; + color: hsl(0,0%,95%); + margin: 0; + padding: 0; + border: none; + background: rgba(0,0,0,0); /* Opera does not support 'transparent' +

    + + + + + + + + + +
    +
    +
    +
    + +
    + +
    + +
    + +
    + + + +
    +
    + + + + + + + + + Current View + + +
    + + +
    +
    +
    +
    + +
    + +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + + diff --git a/jero-boot-single-startup/src/main/resources/static/generic/web/viewer.js b/jero-boot-single-startup/src/main/resources/static/generic/web/viewer.js new file mode 100644 index 00000000..73222084 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/generic/web/viewer.js @@ -0,0 +1,7614 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ +/* Copyright 2012 Mozilla Foundation + * + * 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. + */ +/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar, + DownloadManager, getFileName, getPDFFileNameFromURL, + PDFHistory, Preferences, SidebarView, ViewHistory, Stats, + PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar, + PasswordPrompt, PDFPresentationMode, HandTool, Promise, + PDFDocumentProperties, PDFOutlineView, PDFAttachmentView, + OverlayManager, PDFFindController, PDFFindBar, getVisibleElements, + watchScroll, PDFViewer, PDFRenderingQueue, PresentationModeState, + RenderingStates, DEFAULT_SCALE, UNKNOWN_SCALE, + IGNORE_CURRENT_POSITION_ON_ZOOM: true */ + +'use strict'; + +var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf'; +var DEFAULT_SCALE_DELTA = 1.1; +var MIN_SCALE = 0.25; +var MAX_SCALE = 10.0; +var VIEW_HISTORY_MEMORY = 20; +var SCALE_SELECT_CONTAINER_PADDING = 8; +var SCALE_SELECT_PADDING = 22; +var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading'; +var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; + +PDFJS.imageResourcesPath = './images/'; + PDFJS.workerSrc = '../build/pdf.worker.js'; + PDFJS.cMapUrl = '../web/cmaps/'; + PDFJS.cMapPacked = true; + +var mozL10n = document.mozL10n || document.webL10n; + + +var CSS_UNITS = 96.0 / 72.0; +var DEFAULT_SCALE = 'auto'; +var UNKNOWN_SCALE = 0; +var MAX_AUTO_SCALE = 1.25; +var SCROLLBAR_PADDING = 40; +var VERTICAL_PADDING = 5; + +// optimised CSS custom property getter/setter +var CustomStyle = (function CustomStyleClosure() { + + // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ + // animate-css-transforms-firefox-webkit.html + // in some versions of IE9 it is critical that ms appear in this list + // before Moz + var prefixes = ['ms', 'Moz', 'Webkit', 'O']; + var _cache = {}; + + function CustomStyle() {} + + CustomStyle.getProp = function get(propName, element) { + // check cache only when no element is given + if (arguments.length === 1 && typeof _cache[propName] === 'string') { + return _cache[propName]; + } + + element = element || document.documentElement; + var style = element.style, prefixed, uPropName; + + // test standard property first + if (typeof style[propName] === 'string') { + return (_cache[propName] = propName); + } + + // capitalize + uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); + + // test vendor specific properties + for (var i = 0, l = prefixes.length; i < l; i++) { + prefixed = prefixes[i] + uPropName; + if (typeof style[prefixed] === 'string') { + return (_cache[propName] = prefixed); + } + } + + //if all fails then set to undefined + return (_cache[propName] = 'undefined'); + }; + + CustomStyle.setProp = function set(propName, element, str) { + var prop = this.getProp(propName); + if (prop !== 'undefined') { + element.style[prop] = str; + } + }; + + return CustomStyle; +})(); + +function getFileName(url) { + var anchor = url.indexOf('#'); + var query = url.indexOf('?'); + var end = Math.min( + anchor > 0 ? anchor : url.length, + query > 0 ? query : url.length); + return url.substring(url.lastIndexOf('/', end) + 1, end); +} + +/** + * Returns scale factor for the canvas. It makes sense for the HiDPI displays. + * @return {Object} The object with horizontal (sx) and vertical (sy) + scales. The scaled property is set to false if scaling is + not required, true otherwise. + */ +function getOutputScale(ctx) { + var devicePixelRatio = window.devicePixelRatio || 1; + var backingStoreRatio = ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1; + var pixelRatio = devicePixelRatio / backingStoreRatio; + return { + sx: pixelRatio, + sy: pixelRatio, + scaled: pixelRatio !== 1 + }; +} + +/** + * Scrolls specified element into view of its parent. + * element {Object} The element to be visible. + * spot {Object} An object with optional top and left properties, + * specifying the offset from the top left edge. + */ +function scrollIntoView(element, spot) { + // Assuming offsetParent is available (it's not available when viewer is in + // hidden iframe or object). We have to scroll: if the offsetParent is not set + // producing the error. See also animationStartedClosure. + var parent = element.offsetParent; + var offsetY = element.offsetTop + element.clientTop; + var offsetX = element.offsetLeft + element.clientLeft; + if (!parent) { + console.error('offsetParent is not set -- cannot scroll'); + return; + } + while (parent.clientHeight === parent.scrollHeight) { + if (parent.dataset._scaleY) { + offsetY /= parent.dataset._scaleY; + offsetX /= parent.dataset._scaleX; + } + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; // no need to scroll + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; +} + +/** + * Helper function to start monitoring the scroll event and converting them into + * PDF.js friendly one: with scroll debounce and scroll direction. + */ +function watchScroll(viewAreaElement, callback) { + var debounceScroll = function debounceScroll(evt) { + if (rAF) { + return; + } + // schedule an invocation of scroll for next animation frame. + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + + var currentY = viewAreaElement.scrollTop; + var lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + + var state = { + down: true, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + + var rAF = null; + viewAreaElement.addEventListener('scroll', debounceScroll, true); + return state; +} + +/** + * Use binary search to find the index of the first item in a given array which + * passes a given condition. The items are expected to be sorted in the sense + * that if the condition is true for one item in the array, then it is also true + * for all following items. + * + * @returns {Number} Index of the first array element to pass the test, + * or |items.length| if no such element exists. + */ +function binarySearchFirstItem(items, condition) { + var minIndex = 0; + var maxIndex = items.length - 1; + + if (items.length === 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + + while (minIndex < maxIndex) { + var currentIndex = (minIndex + maxIndex) >> 1; + var currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; /* === maxIndex */ +} + +/** + * Generic helper to find out what elements are visible within a scroll pane. + */ +function getVisibleElements(scrollEl, views, sortByVisibility) { + var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; + var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; + + function isElementBottomBelowViewTop(view) { + var element = view.div; + var elementBottom = + element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + + var visible = [], view, element; + var currentHeight, viewHeight, hiddenHeight, percentHeight; + var currentWidth, viewWidth; + var firstVisibleElementInd = (views.length === 0) ? 0 : + binarySearchFirstItem(views, isElementBottomBelowViewTop); + + for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { + view = views[i]; + element = view.div; + currentHeight = element.offsetTop + element.clientTop; + viewHeight = element.clientHeight; + + if (currentHeight > bottom) { + break; + } + + currentWidth = element.offsetLeft + element.clientLeft; + viewWidth = element.clientWidth; + if (currentWidth + viewWidth < left || currentWidth > right) { + continue; + } + hiddenHeight = Math.max(0, top - currentHeight) + + Math.max(0, currentHeight + viewHeight - bottom); + percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0; + + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + view: view, + percent: percentHeight + }); + } + + var first = visible[0]; + var last = visible[visible.length - 1]; + + if (sortByVisibility) { + visible.sort(function(a, b) { + var pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; // ensure stability + }); + } + return {first: first, last: last, views: visible}; +} + +/** + * Event handler to suppress context menu. + */ +function noContextMenuHandler(e) { + e.preventDefault(); +} + +/** + * Returns the filename or guessed filename from the url (see issue 3455). + * url {String} The original PDF location. + * @return {String} Guessed PDF file name. + */ +function getPDFFileNameFromURL(url) { + var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + // SCHEME HOST 1.PATH 2.QUERY 3.REF + // Pattern to get last matching NAME.pdf + var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + var splitURI = reURI.exec(url); + var suggestedFilename = reFilename.exec(splitURI[1]) || + reFilename.exec(splitURI[2]) || + reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.indexOf('%') !== -1) { + // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf + try { + suggestedFilename = + reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch(e) { // Possible (extremely rare) errors: + // URIError "Malformed URI", e.g. for "%AA.pdf" + // TypeError "null has no properties", e.g. for "%2F.pdf" + } + } + } + return suggestedFilename || 'document.pdf'; +} + +var ProgressBar = (function ProgressBarClosure() { + + function clamp(v, min, max) { + return Math.min(Math.max(v, min), max); + } + + function ProgressBar(id, opts) { + this.visible = true; + + // Fetch the sub-elements for later. + this.div = document.querySelector(id + ' .progress'); + + // Get the loading bar element, so it can be resized to fit the viewer. + this.bar = this.div.parentNode; + + // Get options, with sensible defaults. + this.height = opts.height || 100; + this.width = opts.width || 100; + this.units = opts.units || '%'; + + // Initialize heights. + this.div.style.height = this.height + this.units; + this.percent = 0; + } + + ProgressBar.prototype = { + + updateBar: function ProgressBar_updateBar() { + if (this._indeterminate) { + this.div.classList.add('indeterminate'); + this.div.style.width = this.width + this.units; + return; + } + + this.div.classList.remove('indeterminate'); + var progressSize = this.width * this._percent / 100; + this.div.style.width = progressSize + this.units; + }, + + get percent() { + return this._percent; + }, + + set percent(val) { + this._indeterminate = isNaN(val); + this._percent = clamp(val, 0, 100); + this.updateBar(); + }, + + setWidth: function ProgressBar_setWidth(viewer) { + if (viewer) { + var container = viewer.parentNode; + var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.bar.setAttribute('style', 'width: calc(100% - ' + + scrollbarWidth + 'px);'); + } + } + }, + + hide: function ProgressBar_hide() { + if (!this.visible) { + return; + } + this.visible = false; + this.bar.classList.add('hidden'); + document.body.classList.remove('loadingInProgress'); + }, + + show: function ProgressBar_show() { + if (this.visible) { + return; + } + this.visible = true; + document.body.classList.add('loadingInProgress'); + this.bar.classList.remove('hidden'); + } + }; + + return ProgressBar; +})(); + + + +var DEFAULT_PREFERENCES = { + showPreviousViewOnLoad: true, + defaultZoomValue: '', + sidebarViewOnLoad: 0, + enableHandToolOnLoad: false, + enableWebGL: false, + pdfBugEnabled: false, + disableRange: false, + disableStream: false, + disableAutoFetch: false, + disableFontFace: false, + disableTextLayer: false, + useOnlyCssZoom: false +}; + + +var SidebarView = { + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3 +}; + +/** + * Preferences - Utility for storing persistent settings. + * Used for settings that should be applied to all opened documents, + * or every time the viewer is loaded. + */ +var Preferences = { + prefs: Object.create(DEFAULT_PREFERENCES), + isInitializedPromiseResolved: false, + initializedPromise: null, + + /** + * Initialize and fetch the current preference values from storage. + * @return {Promise} A promise that is resolved when the preferences + * have been initialized. + */ + initialize: function preferencesInitialize() { + return this.initializedPromise = + this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) { + this.isInitializedPromiseResolved = true; + if (prefObj) { + this.prefs = prefObj; + } + }.bind(this)); + }, + + /** + * Stub function for writing preferences to storage. + * NOTE: This should be overridden by a build-specific function defined below. + * @param {Object} prefObj The preferences that should be written to storage. + * @return {Promise} A promise that is resolved when the preference values + * have been written. + */ + _writeToStorage: function preferences_writeToStorage(prefObj) { + return Promise.resolve(); + }, + + /** + * Stub function for reading preferences from storage. + * NOTE: This should be overridden by a build-specific function defined below. + * @param {Object} prefObj The preferences that should be read from storage. + * @return {Promise} A promise that is resolved with an {Object} containing + * the preferences that have been read. + */ + _readFromStorage: function preferences_readFromStorage(prefObj) { + return Promise.resolve(); + }, + + /** + * Reset the preferences to their default values and update storage. + * @return {Promise} A promise that is resolved when the preference values + * have been reset. + */ + reset: function preferencesReset() { + return this.initializedPromise.then(function() { + this.prefs = Object.create(DEFAULT_PREFERENCES); + return this._writeToStorage(DEFAULT_PREFERENCES); + }.bind(this)); + }, + + /** + * Replace the current preference values with the ones from storage. + * @return {Promise} A promise that is resolved when the preference values + * have been updated. + */ + reload: function preferencesReload() { + return this.initializedPromise.then(function () { + this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) { + if (prefObj) { + this.prefs = prefObj; + } + }.bind(this)); + }.bind(this)); + }, + + /** + * Set the value of a preference. + * @param {string} name The name of the preference that should be changed. + * @param {boolean|number|string} value The new value of the preference. + * @return {Promise} A promise that is resolved when the value has been set, + * provided that the preference exists and the types match. + */ + set: function preferencesSet(name, value) { + return this.initializedPromise.then(function () { + if (DEFAULT_PREFERENCES[name] === undefined) { + throw new Error('preferencesSet: \'' + name + '\' is undefined.'); + } else if (value === undefined) { + throw new Error('preferencesSet: no value is specified.'); + } + var valueType = typeof value; + var defaultType = typeof DEFAULT_PREFERENCES[name]; + + if (valueType !== defaultType) { + if (valueType === 'number' && defaultType === 'string') { + value = value.toString(); + } else { + throw new Error('Preferences_set: \'' + value + '\' is a \"' + + valueType + '\", expected \"' + defaultType + '\".'); + } + } else { + if (valueType === 'number' && (value | 0) !== value) { + throw new Error('Preferences_set: \'' + value + + '\' must be an \"integer\".'); + } + } + this.prefs[name] = value; + return this._writeToStorage(this.prefs); + }.bind(this)); + }, + + /** + * Get the value of a preference. + * @param {string} name The name of the preference whose value is requested. + * @return {Promise} A promise that is resolved with a {boolean|number|string} + * containing the value of the preference. + */ + get: function preferencesGet(name) { + return this.initializedPromise.then(function () { + var defaultValue = DEFAULT_PREFERENCES[name]; + + if (defaultValue === undefined) { + throw new Error('preferencesGet: \'' + name + '\' is undefined.'); + } else { + var prefValue = this.prefs[name]; + + if (prefValue !== undefined) { + return prefValue; + } + } + return defaultValue; + }.bind(this)); + } +}; + + + +Preferences._writeToStorage = function (prefObj) { + return new Promise(function (resolve) { + localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj)); + resolve(); + }); +}; + +Preferences._readFromStorage = function (prefObj) { + return new Promise(function (resolve) { + var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences')); + resolve(readPrefs); + }); +}; + + +(function mozPrintCallbackPolyfillClosure() { + if ('mozPrintCallback' in document.createElement('canvas')) { + return; + } + // Cause positive result on feature-detection: + HTMLCanvasElement.prototype.mozPrintCallback = undefined; + + var canvases; // During print task: non-live NodeList of elements + var index; // Index of element that is being processed + + var print = window.print; + window.print = function print() { + if (canvases) { + console.warn('Ignored window.print() because of a pending print job.'); + return; + } + try { + dispatchEvent('beforeprint'); + } finally { + canvases = document.querySelectorAll('canvas'); + index = -1; + next(); + } + }; + + function dispatchEvent(eventType) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent(eventType, false, false, 'custom'); + window.dispatchEvent(event); + } + + function next() { + if (!canvases) { + return; // Print task cancelled by user (state reset in abort()) + } + + renderProgress(); + if (++index < canvases.length) { + var canvas = canvases[index]; + if (typeof canvas.mozPrintCallback === 'function') { + canvas.mozPrintCallback({ + context: canvas.getContext('2d'), + abort: abort, + done: next + }); + } else { + next(); + } + } else { + renderProgress(); + print.call(window); + setTimeout(abort, 20); // Tidy-up + } + } + + function abort() { + if (canvases) { + canvases = null; + renderProgress(); + dispatchEvent('afterprint'); + } + } + + function renderProgress() { + var progressContainer = document.getElementById('mozPrintCallback-shim'); + if (canvases) { + var progress = Math.round(100 * index / canvases.length); + var progressBar = progressContainer.querySelector('progress'); + var progressPerc = progressContainer.querySelector('.relative-progress'); + progressBar.value = progress; + progressPerc.textContent = progress + '%'; + progressContainer.removeAttribute('hidden'); + progressContainer.onclick = abort; + } else { + progressContainer.setAttribute('hidden', ''); + } + } + + var hasAttachEvent = !!document.attachEvent; + + window.addEventListener('keydown', function(event) { + // Intercept Cmd/Ctrl + P in all browsers. + // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera + if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) && + !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + if (hasAttachEvent) { + // Only attachEvent can cancel Ctrl + P dialog in IE <=10 + // attachEvent is gone in IE11, so the dialog will re-appear in IE11. + return; + } + event.preventDefault(); + if (event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } else { + event.stopPropagation(); + } + return; + } + if (event.keyCode === 27 && canvases) { // Esc + abort(); + } + }, true); + if (hasAttachEvent) { + document.attachEvent('onkeydown', function(event) { + event = event || window.event; + if (event.keyCode === 80/*P*/ && event.ctrlKey) { + event.keyCode = 0; + return false; + } + }); + } + + if ('onbeforeprint' in window) { + // Do not propagate before/afterprint events when they are not triggered + // from within this polyfill. (FF/IE). + var stopPropagationIfNeeded = function(event) { + if (event.detail !== 'custom' && event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } + }; + window.addEventListener('beforeprint', stopPropagationIfNeeded, false); + window.addEventListener('afterprint', stopPropagationIfNeeded, false); + } +})(); + + + +var DownloadManager = (function DownloadManagerClosure() { + + function download(blobUrl, filename) { + var a = document.createElement('a'); + if (a.click) { + // Use a.click() if available. Otherwise, Chrome might show + // "Unsafe JavaScript attempt to initiate a navigation change + // for frame with URL" and not open the PDF at all. + // Supported by (not mentioned = untested): + // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click) + // - Chrome 19 - 26 (18- does not support a.click) + // - Opera 9 - 12.15 + // - Internet Explorer 6 - 10 + // - Safari 6 (5.1- does not support a.click) + a.href = blobUrl; + a.target = '_parent'; + // Use a.download if available. This increases the likelihood that + // the file is downloaded instead of opened by another PDF plugin. + if ('download' in a) { + a.download = filename; + } + // must be in the document for IE and recent Firefox versions. + // (otherwise .click() is ignored) + (document.body || document.documentElement).appendChild(a); + a.click(); + a.parentNode.removeChild(a); + } else { + if (window.top === window && + blobUrl.split('#')[0] === window.location.href.split('#')[0]) { + // If _parent == self, then opening an identical URL with different + // location hash will only cause a navigation, not a download. + var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&'; + blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&'); + } + window.open(blobUrl, '_parent'); + } + } + + function DownloadManager() {} + + DownloadManager.prototype = { + downloadUrl: function DownloadManager_downloadUrl(url, filename) { + if (!PDFJS.isValidUrl(url, true)) { + return; // restricted/invalid URL + } + + download(url + '#pdfjs.action=download', filename); + }, + + downloadData: function DownloadManager_downloadData(data, filename, + contentType) { + if (navigator.msSaveBlob) { // IE10 and above + return navigator.msSaveBlob(new Blob([data], { type: contentType }), + filename); + } + + var blobUrl = PDFJS.createObjectURL(data, contentType); + download(blobUrl, filename); + }, + + download: function DownloadManager_download(blob, url, filename) { + if (!URL) { + // URL.createObjectURL is not supported + this.downloadUrl(url, filename); + return; + } + + if (navigator.msSaveBlob) { + // IE10 / IE11 + if (!navigator.msSaveBlob(blob, filename)) { + this.downloadUrl(url, filename); + } + return; + } + + var blobUrl = URL.createObjectURL(blob); + download(blobUrl, filename); + } + }; + + return DownloadManager; +})(); + + + + + +/** + * View History - This is a utility for saving various view parameters for + * recently opened files. + * + * The way that the view parameters are stored depends on how PDF.js is built, + * for 'node make ' the following cases exist: + * - FIREFOX or MOZCENTRAL - uses sessionStorage. + * - B2G - uses asyncStorage. + * - GENERIC or CHROME - uses localStorage, if it is available. + */ +var ViewHistory = (function ViewHistoryClosure() { + function ViewHistory(fingerprint) { + this.fingerprint = fingerprint; + this.isInitializedPromiseResolved = false; + this.initializedPromise = + this._readFromStorage().then(function (databaseStr) { + this.isInitializedPromiseResolved = true; + + var database = JSON.parse(databaseStr || '{}'); + if (!('files' in database)) { + database.files = []; + } + if (database.files.length >= VIEW_HISTORY_MEMORY) { + database.files.shift(); + } + var index; + for (var i = 0, length = database.files.length; i < length; i++) { + var branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + if (typeof index !== 'number') { + index = database.files.push({fingerprint: this.fingerprint}) - 1; + } + this.file = database.files[index]; + this.database = database; + }.bind(this)); + } + + ViewHistory.prototype = { + _writeToStorage: function ViewHistory_writeToStorage() { + return new Promise(function (resolve) { + var databaseStr = JSON.stringify(this.database); + + + + localStorage.setItem('database', databaseStr); + resolve(); + }.bind(this)); + }, + + _readFromStorage: function ViewHistory_readFromStorage() { + return new Promise(function (resolve) { + + + resolve(localStorage.getItem('database')); + }); + }, + + set: function ViewHistory_set(name, val) { + if (!this.isInitializedPromiseResolved) { + return; + } + this.file[name] = val; + return this._writeToStorage(); + }, + + setMultiple: function ViewHistory_setMultiple(properties) { + if (!this.isInitializedPromiseResolved) { + return; + } + for (var name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + }, + + get: function ViewHistory_get(name, defaultValue) { + if (!this.isInitializedPromiseResolved) { + return defaultValue; + } + return this.file[name] || defaultValue; + } + }; + + return ViewHistory; +})(); + + +/** + * Creates a "search bar" given a set of DOM elements that act as controls + * for searching or for setting search preferences in the UI. This object + * also sets up the appropriate events for the controls. Actual searching + * is done by PDFFindController. + */ +var PDFFindBar = (function PDFFindBarClosure() { + function PDFFindBar(options) { + this.opened = false; + this.bar = options.bar || null; + this.toggleButton = options.toggleButton || null; + this.findField = options.findField || null; + this.highlightAll = options.highlightAllCheckbox || null; + this.caseSensitive = options.caseSensitiveCheckbox || null; + this.findMsg = options.findMsg || null; + this.findStatusIcon = options.findStatusIcon || null; + this.findPreviousButton = options.findPreviousButton || null; + this.findNextButton = options.findNextButton || null; + this.findController = options.findController || null; + + if (this.findController === null) { + throw new Error('PDFFindBar cannot be used without a ' + + 'PDFFindController instance.'); + } + + // Add event listeners to the DOM elements. + var self = this; + this.toggleButton.addEventListener('click', function() { + self.toggle(); + }); + + this.findField.addEventListener('input', function() { + self.dispatchEvent(''); + }); + + this.bar.addEventListener('keydown', function(evt) { + switch (evt.keyCode) { + case 13: // Enter + if (evt.target === self.findField) { + self.dispatchEvent('again', evt.shiftKey); + } + break; + case 27: // Escape + self.close(); + break; + } + }); + + this.findPreviousButton.addEventListener('click', function() { + self.dispatchEvent('again', true); + }); + + this.findNextButton.addEventListener('click', function() { + self.dispatchEvent('again', false); + }); + + this.highlightAll.addEventListener('click', function() { + self.dispatchEvent('highlightallchange'); + }); + + this.caseSensitive.addEventListener('click', function() { + self.dispatchEvent('casesensitivitychange'); + }); + } + + PDFFindBar.prototype = { + dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('find' + type, true, true, { + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev + }); + return window.dispatchEvent(event); + }, + + updateUIState: function PDFFindBar_updateUIState(state, previous) { + var notFound = false; + var findMsg = ''; + var status = ''; + + switch (state) { + case FindStates.FIND_FOUND: + break; + + case FindStates.FIND_PENDING: + status = 'pending'; + break; + + case FindStates.FIND_NOTFOUND: + findMsg = mozL10n.get('find_not_found', null, 'Phrase not found'); + notFound = true; + break; + + case FindStates.FIND_WRAPPED: + if (previous) { + findMsg = mozL10n.get('find_reached_top', null, + 'Reached top of document, continued from bottom'); + } else { + findMsg = mozL10n.get('find_reached_bottom', null, + 'Reached end of document, continued from top'); + } + break; + } + + if (notFound) { + this.findField.classList.add('notFound'); + } else { + this.findField.classList.remove('notFound'); + } + + this.findField.setAttribute('data-status', status); + this.findMsg.textContent = findMsg; + }, + + open: function PDFFindBar_open() { + if (!this.opened) { + this.opened = true; + this.toggleButton.classList.add('toggled'); + this.bar.classList.remove('hidden'); + } + this.findField.select(); + this.findField.focus(); + }, + + close: function PDFFindBar_close() { + if (!this.opened) { + return; + } + this.opened = false; + this.toggleButton.classList.remove('toggled'); + this.bar.classList.add('hidden'); + this.findController.active = false; + }, + + toggle: function PDFFindBar_toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + }; + return PDFFindBar; +})(); + + +var FindStates = { + FIND_FOUND: 0, + FIND_NOTFOUND: 1, + FIND_WRAPPED: 2, + FIND_PENDING: 3 +}; + +var FIND_SCROLL_OFFSET_TOP = -50; +var FIND_SCROLL_OFFSET_LEFT = -400; + +/** + * Provides "search" or "find" functionality for the PDF. + * This object actually performs the search for a given string. + */ +var PDFFindController = (function PDFFindControllerClosure() { + function PDFFindController(options) { + this.startedTextExtraction = false; + this.extractTextPromises = []; + this.pendingFindMatches = {}; + this.active = false; // If active, find results will be highlighted. + this.pageContents = []; // Stores the text for each page. + this.pageMatches = []; + this.selected = { // Currently selected match. + pageIdx: -1, + matchIdx: -1 + }; + this.offset = { // Where the find algorithm currently is in the document. + pageIdx: null, + matchIdx: null + }; + this.pagesToSearch = null; + this.resumePageIdx = null; + this.state = null; + this.dirtyMatch = false; + this.findTimeout = null; + this.pdfViewer = options.pdfViewer || null; + this.integratedFind = options.integratedFind || false; + this.charactersToNormalize = { + '\u2018': '\'', // Left single quotation mark + '\u2019': '\'', // Right single quotation mark + '\u201A': '\'', // Single low-9 quotation mark + '\u201B': '\'', // Single high-reversed-9 quotation mark + '\u201C': '"', // Left double quotation mark + '\u201D': '"', // Right double quotation mark + '\u201E': '"', // Double low-9 quotation mark + '\u201F': '"', // Double high-reversed-9 quotation mark + '\u00BC': '1/4', // Vulgar fraction one quarter + '\u00BD': '1/2', // Vulgar fraction one half + '\u00BE': '3/4', // Vulgar fraction three quarters + '\u00A0': ' ' // No-break space + }; + this.findBar = options.findBar || null; + + // Compile the regular expression for text normalization once + var replace = Object.keys(this.charactersToNormalize).join(''); + this.normalizationRegex = new RegExp('[' + replace + ']', 'g'); + + var events = [ + 'find', + 'findagain', + 'findhighlightallchange', + 'findcasesensitivitychange' + ]; + + this.firstPagePromise = new Promise(function (resolve) { + this.resolveFirstPage = resolve; + }.bind(this)); + this.handleEvent = this.handleEvent.bind(this); + + for (var i = 0, len = events.length; i < len; i++) { + window.addEventListener(events[i], this.handleEvent); + } + } + + PDFFindController.prototype = { + setFindBar: function PDFFindController_setFindBar(findBar) { + this.findBar = findBar; + }, + + reset: function PDFFindController_reset() { + this.startedTextExtraction = false; + this.extractTextPromises = []; + this.active = false; + }, + + normalize: function PDFFindController_normalize(text) { + var self = this; + return text.replace(this.normalizationRegex, function (ch) { + return self.charactersToNormalize[ch]; + }); + }, + + calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) { + var pageContent = this.normalize(this.pageContents[pageIndex]); + var query = this.normalize(this.state.query); + var caseSensitive = this.state.caseSensitive; + var queryLen = query.length; + + if (queryLen === 0) { + return; // Do nothing: the matches should be wiped out already. + } + + if (!caseSensitive) { + pageContent = pageContent.toLowerCase(); + query = query.toLowerCase(); + } + + var matches = []; + var matchIdx = -queryLen; + while (true) { + matchIdx = pageContent.indexOf(query, matchIdx + queryLen); + if (matchIdx === -1) { + break; + } + matches.push(matchIdx); + } + this.pageMatches[pageIndex] = matches; + this.updatePage(pageIndex); + if (this.resumePageIdx === pageIndex) { + this.resumePageIdx = null; + this.nextPageMatch(); + } + }, + + extractText: function PDFFindController_extractText() { + if (this.startedTextExtraction) { + return; + } + this.startedTextExtraction = true; + + this.pageContents = []; + var extractTextPromisesResolves = []; + var numPages = this.pdfViewer.pagesCount; + for (var i = 0; i < numPages; i++) { + this.extractTextPromises.push(new Promise(function (resolve) { + extractTextPromisesResolves.push(resolve); + })); + } + + var self = this; + function extractPageText(pageIndex) { + self.pdfViewer.getPageTextContent(pageIndex).then( + function textContentResolved(textContent) { + var textItems = textContent.items; + var str = []; + + for (var i = 0, len = textItems.length; i < len; i++) { + str.push(textItems[i].str); + } + + // Store the pageContent as a string. + self.pageContents.push(str.join('')); + + extractTextPromisesResolves[pageIndex](pageIndex); + if ((pageIndex + 1) < self.pdfViewer.pagesCount) { + extractPageText(pageIndex + 1); + } + } + ); + } + extractPageText(0); + }, + + handleEvent: function PDFFindController_handleEvent(e) { + if (this.state === null || e.type !== 'findagain') { + this.dirtyMatch = true; + } + this.state = e.detail; + this.updateUIState(FindStates.FIND_PENDING); + + this.firstPagePromise.then(function() { + this.extractText(); + + clearTimeout(this.findTimeout); + if (e.type === 'find') { + // Only trigger the find action after 250ms of silence. + this.findTimeout = setTimeout(this.nextMatch.bind(this), 250); + } else { + this.nextMatch(); + } + }.bind(this)); + }, + + updatePage: function PDFFindController_updatePage(index) { + if (this.selected.pageIdx === index) { + // If the page is selected, scroll the page into view, which triggers + // rendering the page, which adds the textLayer. Once the textLayer is + // build, it will scroll onto the selected match. + this.pdfViewer.scrollPageIntoView(index + 1); + } + + var page = this.pdfViewer.getPageView(index); + if (page.textLayer) { + page.textLayer.updateMatches(); + } + }, + + nextMatch: function PDFFindController_nextMatch() { + var previous = this.state.findPrevious; + var currentPageIndex = this.pdfViewer.currentPageNumber - 1; + var numPages = this.pdfViewer.pagesCount; + + this.active = true; + + if (this.dirtyMatch) { + // Need to recalculate the matches, reset everything. + this.dirtyMatch = false; + this.selected.pageIdx = this.selected.matchIdx = -1; + this.offset.pageIdx = currentPageIndex; + this.offset.matchIdx = null; + this.hadMatch = false; + this.resumePageIdx = null; + this.pageMatches = []; + var self = this; + + for (var i = 0; i < numPages; i++) { + // Wipe out any previous highlighted matches. + this.updatePage(i); + + // As soon as the text is extracted start finding the matches. + if (!(i in this.pendingFindMatches)) { + this.pendingFindMatches[i] = true; + this.extractTextPromises[i].then(function(pageIdx) { + delete self.pendingFindMatches[pageIdx]; + self.calcFindMatch(pageIdx); + }); + } + } + } + + // If there's no query there's no point in searching. + if (this.state.query === '') { + this.updateUIState(FindStates.FIND_FOUND); + return; + } + + // If we're waiting on a page, we return since we can't do anything else. + if (this.resumePageIdx) { + return; + } + + var offset = this.offset; + // Keep track of how many pages we should maximally iterate through. + this.pagesToSearch = numPages; + // If there's already a matchIdx that means we are iterating through a + // page's matches. + if (offset.matchIdx !== null) { + var numPageMatches = this.pageMatches[offset.pageIdx].length; + if ((!previous && offset.matchIdx + 1 < numPageMatches) || + (previous && offset.matchIdx > 0)) { + // The simple case; we just have advance the matchIdx to select + // the next match on the page. + this.hadMatch = true; + offset.matchIdx = (previous ? offset.matchIdx - 1 : + offset.matchIdx + 1); + this.updateMatch(true); + return; + } + // We went beyond the current page's matches, so we advance to + // the next page. + this.advanceOffsetPage(previous); + } + // Start searching through the page. + this.nextPageMatch(); + }, + + matchesReady: function PDFFindController_matchesReady(matches) { + var offset = this.offset; + var numMatches = matches.length; + var previous = this.state.findPrevious; + + if (numMatches) { + // There were matches for the page, so initialize the matchIdx. + this.hadMatch = true; + offset.matchIdx = (previous ? numMatches - 1 : 0); + this.updateMatch(true); + return true; + } else { + // No matches, so attempt to search the next page. + this.advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this.pagesToSearch < 0) { + // No point in wrapping again, there were no matches. + this.updateMatch(false); + // while matches were not found, searching for a page + // with matches should nevertheless halt. + return true; + } + } + // Matches were not found (and searching is not done). + return false; + } + }, + + /** + * The method is called back from the text layer when match presentation + * is updated. + * @param {number} pageIndex - page index. + * @param {number} index - match index. + * @param {Array} elements - text layer div elements array. + * @param {number} beginIdx - start index of the div array for the match. + * @param {number} endIdx - end index of the div array for the match. + */ + updateMatchPosition: function PDFFindController_updateMatchPosition( + pageIndex, index, elements, beginIdx, endIdx) { + if (this.selected.matchIdx === index && + this.selected.pageIdx === pageIndex) { + scrollIntoView(elements[beginIdx], { + top: FIND_SCROLL_OFFSET_TOP, + left: FIND_SCROLL_OFFSET_LEFT + }); + } + }, + + nextPageMatch: function PDFFindController_nextPageMatch() { + if (this.resumePageIdx !== null) { + console.error('There can only be one pending page.'); + } + do { + var pageIdx = this.offset.pageIdx; + var matches = this.pageMatches[pageIdx]; + if (!matches) { + // The matches don't exist yet for processing by "matchesReady", + // so set a resume point for when they do exist. + this.resumePageIdx = pageIdx; + break; + } + } while (!this.matchesReady(matches)); + }, + + advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) { + var offset = this.offset; + var numPages = this.extractTextPromises.length; + offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1); + offset.matchIdx = null; + + this.pagesToSearch--; + + if (offset.pageIdx >= numPages || offset.pageIdx < 0) { + offset.pageIdx = (previous ? numPages - 1 : 0); + offset.wrapped = true; + } + }, + + updateMatch: function PDFFindController_updateMatch(found) { + var state = FindStates.FIND_NOTFOUND; + var wrapped = this.offset.wrapped; + this.offset.wrapped = false; + + if (found) { + var previousPage = this.selected.pageIdx; + this.selected.pageIdx = this.offset.pageIdx; + this.selected.matchIdx = this.offset.matchIdx; + state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND); + // Update the currently selected page to wipe out any selected matches. + if (previousPage !== -1 && previousPage !== this.selected.pageIdx) { + this.updatePage(previousPage); + } + } + + this.updateUIState(state, this.state.findPrevious); + if (this.selected.pageIdx !== -1) { + this.updatePage(this.selected.pageIdx); + } + }, + + updateUIState: function PDFFindController_updateUIState(state, previous) { + if (this.integratedFind) { + FirefoxCom.request('updateFindControlState', + { result: state, findPrevious: previous }); + return; + } + if (this.findBar === null) { + throw new Error('PDFFindController is not initialized with a ' + + 'PDFFindBar instance.'); + } + this.findBar.updateUIState(state, previous); + } + }; + return PDFFindController; +})(); + + +var PDFHistory = { + initialized: false, + initialDestination: null, + + /** + * @param {string} fingerprint + * @param {IPDFLinkService} linkService + */ + initialize: function pdfHistoryInitialize(fingerprint, linkService) { + this.initialized = true; + this.reInitialized = false; + this.allowHashChange = true; + this.historyUnlocked = true; + this.isViewerInPresentationMode = false; + + this.previousHash = window.location.hash.substring(1); + this.currentBookmark = ''; + this.currentPage = 0; + this.updatePreviousBookmark = false; + this.previousBookmark = ''; + this.previousPage = 0; + this.nextHashParam = ''; + + this.fingerprint = fingerprint; + this.linkService = linkService; + this.currentUid = this.uid = 0; + this.current = {}; + + var state = window.history.state; + if (this._isStateObjectDefined(state)) { + // This corresponds to navigating back to the document + // from another page in the browser history. + if (state.target.dest) { + this.initialDestination = state.target.dest; + } else { + linkService.setHash(state.target.hash); + } + this.currentUid = state.uid; + this.uid = state.uid + 1; + this.current = state.target; + } else { + // This corresponds to the loading of a new document. + if (state && state.fingerprint && + this.fingerprint !== state.fingerprint) { + // Reinitialize the browsing history when a new document + // is opened in the web viewer. + this.reInitialized = true; + } + this._pushOrReplaceState({ fingerprint: this.fingerprint }, true); + } + + var self = this; + window.addEventListener('popstate', function pdfHistoryPopstate(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + if (!self.historyUnlocked) { + return; + } + if (evt.state) { + // Move back/forward in the history. + self._goTo(evt.state); + } else { + // Handle the user modifying the hash of a loaded document. + self.previousHash = window.location.hash.substring(1); + + // If the history is empty when the hash changes, + // update the previous entry in the browser history. + if (self.uid === 0) { + var previousParams = (self.previousHash && self.currentBookmark && + self.previousHash !== self.currentBookmark) ? + { hash: self.currentBookmark, page: self.currentPage } : + { page: 1 }; + self.historyUnlocked = false; + self.allowHashChange = false; + window.history.back(); + self._pushToHistory(previousParams, false, true); + window.history.forward(); + self.historyUnlocked = true; + } + self._pushToHistory({ hash: self.previousHash }, false, true); + self._updatePreviousBookmark(); + } + }, false); + + function pdfHistoryBeforeUnload() { + var previousParams = self._getPreviousParams(null, true); + if (previousParams) { + var replacePrevious = (!self.current.dest && + self.current.hash !== self.previousHash); + self._pushToHistory(previousParams, false, replacePrevious); + self._updatePreviousBookmark(); + } + // Remove the event listener when navigating away from the document, + // since 'beforeunload' prevents Firefox from caching the document. + window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false); + } + window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); + + window.addEventListener('pageshow', function pdfHistoryPageShow(evt) { + // If the entire viewer (including the PDF file) is cached in the browser, + // we need to reattach the 'beforeunload' event listener since + // the 'DOMContentLoaded' event is not fired on 'pageshow'. + window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); + }, false); + + window.addEventListener('presentationmodechanged', function(e) { + self.isViewerInPresentationMode = !!e.detail.active; + }); + }, + + _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) { + return (state && state.uid >= 0 && + state.fingerprint && this.fingerprint === state.fingerprint && + state.target && state.target.hash) ? true : false; + }, + + _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, + replace) { + if (replace) { + window.history.replaceState(stateObj, '', document.URL); + } else { + window.history.pushState(stateObj, '', document.URL); + } + }, + + get isHashChangeUnlocked() { + if (!this.initialized) { + return true; + } + // If the current hash changes when moving back/forward in the history, + // this will trigger a 'popstate' event *as well* as a 'hashchange' event. + // Since the hash generally won't correspond to the exact the position + // stored in the history's state object, triggering the 'hashchange' event + // can thus corrupt the browser history. + // + // When the hash changes during a 'popstate' event, we *only* prevent the + // first 'hashchange' event and immediately reset allowHashChange. + // If it is not reset, the user would not be able to change the hash. + + var temp = this.allowHashChange; + this.allowHashChange = true; + return temp; + }, + + _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() { + if (this.updatePreviousBookmark && + this.currentBookmark && this.currentPage) { + this.previousBookmark = this.currentBookmark; + this.previousPage = this.currentPage; + this.updatePreviousBookmark = false; + } + }, + + updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, + pageNum) { + if (this.initialized) { + this.currentBookmark = bookmark.substring(1); + this.currentPage = pageNum | 0; + this._updatePreviousBookmark(); + } + }, + + updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) { + if (this.initialized) { + this.nextHashParam = param; + } + }, + + push: function pdfHistoryPush(params, isInitialBookmark) { + if (!(this.initialized && this.historyUnlocked)) { + return; + } + if (params.dest && !params.hash) { + params.hash = (this.current.hash && this.current.dest && + this.current.dest === params.dest) ? + this.current.hash : + this.linkService.getDestinationHash(params.dest).split('#')[1]; + } + if (params.page) { + params.page |= 0; + } + if (isInitialBookmark) { + var target = window.history.state.target; + if (!target) { + // Invoked when the user specifies an initial bookmark, + // thus setting initialBookmark, when the document is loaded. + this._pushToHistory(params, false); + this.previousHash = window.location.hash.substring(1); + } + this.updatePreviousBookmark = this.nextHashParam ? false : true; + if (target) { + // If the current document is reloaded, + // avoid creating duplicate entries in the history. + this._updatePreviousBookmark(); + } + return; + } + if (this.nextHashParam) { + if (this.nextHashParam === params.hash) { + this.nextHashParam = null; + this.updatePreviousBookmark = true; + return; + } else { + this.nextHashParam = null; + } + } + + if (params.hash) { + if (this.current.hash) { + if (this.current.hash !== params.hash) { + this._pushToHistory(params, true); + } else { + if (!this.current.page && params.page) { + this._pushToHistory(params, false, true); + } + this.updatePreviousBookmark = true; + } + } else { + this._pushToHistory(params, true); + } + } else if (this.current.page && params.page && + this.current.page !== params.page) { + this._pushToHistory(params, true); + } + }, + + _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, + beforeUnload) { + if (!(this.currentBookmark && this.currentPage)) { + return null; + } else if (this.updatePreviousBookmark) { + this.updatePreviousBookmark = false; + } + if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) { + // Prevent the history from getting stuck in the current state, + // effectively preventing the user from going back/forward in the history. + // + // This happens if the current position in the document didn't change when + // the history was previously updated. The reasons for this are either: + // 1. The current zoom value is such that the document does not need to, + // or cannot, be scrolled to display the destination. + // 2. The previous destination is broken, and doesn't actally point to a + // position within the document. + // (This is either due to a bad PDF generator, or the user making a + // mistake when entering a destination in the hash parameters.) + return null; + } + if ((!this.current.dest && !onlyCheckPage) || beforeUnload) { + if (this.previousBookmark === this.currentBookmark) { + return null; + } + } else if (this.current.page || onlyCheckPage) { + if (this.previousPage === this.currentPage) { + return null; + } + } else { + return null; + } + var params = { hash: this.currentBookmark, page: this.currentPage }; + if (this.isViewerInPresentationMode) { + params.hash = null; + } + return params; + }, + + _stateObj: function pdfHistory_stateObj(params) { + return { fingerprint: this.fingerprint, uid: this.uid, target: params }; + }, + + _pushToHistory: function pdfHistory_pushToHistory(params, + addPrevious, overwrite) { + if (!this.initialized) { + return; + } + if (!params.hash && params.page) { + params.hash = ('page=' + params.page); + } + if (addPrevious && !overwrite) { + var previousParams = this._getPreviousParams(); + if (previousParams) { + var replacePrevious = (!this.current.dest && + this.current.hash !== this.previousHash); + this._pushToHistory(previousParams, false, replacePrevious); + } + } + this._pushOrReplaceState(this._stateObj(params), + (overwrite || this.uid === 0)); + this.currentUid = this.uid++; + this.current = params; + this.updatePreviousBookmark = true; + }, + + _goTo: function pdfHistory_goTo(state) { + if (!(this.initialized && this.historyUnlocked && + this._isStateObjectDefined(state))) { + return; + } + if (!this.reInitialized && state.uid < this.currentUid) { + var previousParams = this._getPreviousParams(true); + if (previousParams) { + this._pushToHistory(this.current, false); + this._pushToHistory(previousParams, false); + this.currentUid = state.uid; + window.history.back(); + return; + } + } + this.historyUnlocked = false; + + if (state.target.dest) { + this.linkService.navigateTo(state.target.dest); + } else { + this.linkService.setHash(state.target.hash); + } + this.currentUid = state.uid; + if (state.uid > this.uid) { + this.uid = state.uid; + } + this.current = state.target; + this.updatePreviousBookmark = true; + + var currentHash = window.location.hash.substring(1); + if (this.previousHash !== currentHash) { + this.allowHashChange = false; + } + this.previousHash = currentHash; + + this.historyUnlocked = true; + }, + + back: function pdfHistoryBack() { + this.go(-1); + }, + + forward: function pdfHistoryForward() { + this.go(1); + }, + + go: function pdfHistoryGo(direction) { + if (this.initialized && this.historyUnlocked) { + var state = window.history.state; + if (direction === -1 && state && state.uid > 0) { + window.history.back(); + } else if (direction === 1 && state && state.uid < (this.uid - 1)) { + window.history.forward(); + } + } + } +}; + + +var SecondaryToolbar = { + opened: false, + previousContainerHeight: null, + newContainerHeight: null, + + initialize: function secondaryToolbarInitialize(options) { + this.toolbar = options.toolbar; + this.buttonContainer = this.toolbar.firstElementChild; + + // Define the toolbar buttons. + this.toggleButton = options.toggleButton; + this.presentationModeButton = options.presentationModeButton; + this.openFile = options.openFile; + this.print = options.print; + this.download = options.download; + this.viewBookmark = options.viewBookmark; + this.firstPage = options.firstPage; + this.lastPage = options.lastPage; + this.pageRotateCw = options.pageRotateCw; + this.pageRotateCcw = options.pageRotateCcw; + this.documentPropertiesButton = options.documentPropertiesButton; + + // Attach the event listeners. + var elements = [ + // Button to toggle the visibility of the secondary toolbar: + { element: this.toggleButton, handler: this.toggle }, + // All items within the secondary toolbar + // (except for toggleHandTool, hand_tool.js is responsible for it): + { element: this.presentationModeButton, + handler: this.presentationModeClick }, + { element: this.openFile, handler: this.openFileClick }, + { element: this.print, handler: this.printClick }, + { element: this.download, handler: this.downloadClick }, + { element: this.viewBookmark, handler: this.viewBookmarkClick }, + { element: this.firstPage, handler: this.firstPageClick }, + { element: this.lastPage, handler: this.lastPageClick }, + { element: this.pageRotateCw, handler: this.pageRotateCwClick }, + { element: this.pageRotateCcw, handler: this.pageRotateCcwClick }, + { element: this.documentPropertiesButton, + handler: this.documentPropertiesClick } + ]; + + for (var item in elements) { + var element = elements[item].element; + if (element) { + element.addEventListener('click', elements[item].handler.bind(this)); + } + } + }, + + // Event handling functions. + presentationModeClick: function secondaryToolbarPresentationModeClick(evt) { + PDFViewerApplication.requestPresentationMode(); + this.close(); + }, + + openFileClick: function secondaryToolbarOpenFileClick(evt) { + document.getElementById('fileInput').click(); + this.close(); + }, + + printClick: function secondaryToolbarPrintClick(evt) { + window.print(); + this.close(); + }, + + downloadClick: function secondaryToolbarDownloadClick(evt) { + PDFViewerApplication.download(); + this.close(); + }, + + viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) { + this.close(); + }, + + firstPageClick: function secondaryToolbarFirstPageClick(evt) { + PDFViewerApplication.page = 1; + this.close(); + }, + + lastPageClick: function secondaryToolbarLastPageClick(evt) { + if (PDFViewerApplication.pdfDocument) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + } + this.close(); + }, + + pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) { + PDFViewerApplication.rotatePages(90); + }, + + pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) { + PDFViewerApplication.rotatePages(-90); + }, + + documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) { + PDFViewerApplication.pdfDocumentProperties.open(); + this.close(); + }, + + // Misc. functions for interacting with the toolbar. + setMaxHeight: function secondaryToolbarSetMaxHeight(container) { + if (!container || !this.buttonContainer) { + return; + } + this.newContainerHeight = container.clientHeight; + if (this.previousContainerHeight === this.newContainerHeight) { + return; + } + this.buttonContainer.setAttribute('style', + 'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;'); + this.previousContainerHeight = this.newContainerHeight; + }, + + open: function secondaryToolbarOpen() { + if (this.opened) { + return; + } + this.opened = true; + this.toggleButton.classList.add('toggled'); + this.toolbar.classList.remove('hidden'); + }, + + close: function secondaryToolbarClose(target) { + if (!this.opened) { + return; + } else if (target && !this.toolbar.contains(target)) { + return; + } + this.opened = false; + this.toolbar.classList.add('hidden'); + this.toggleButton.classList.remove('toggled'); + }, + + toggle: function secondaryToolbarToggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } +}; + + +var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms +var DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms +var ACTIVE_SELECTOR = 'pdfPresentationMode'; +var CONTROLS_SELECTOR = 'pdfPresentationModeControls'; + +/** + * @typedef {Object} PDFPresentationModeOptions + * @property {HTMLDivElement} container - The container for the viewer element. + * @property {HTMLDivElement} viewer - (optional) The viewer element. + * @property {PDFThumbnailViewer} pdfThumbnailViewer - (optional) The thumbnail + * viewer. + * @property {Array} contextMenuItems - (optional) The menuitems that are added + * to the context menu in Presentation Mode. + */ + +/** + * @class + */ +var PDFPresentationMode = (function PDFPresentationModeClosure() { + /** + * @constructs PDFPresentationMode + * @param {PDFPresentationModeOptions} options + */ + function PDFPresentationMode(options) { + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + this.pdfThumbnailViewer = options.pdfThumbnailViewer || null; + var contextMenuItems = options.contextMenuItems || null; + + this.active = false; + this.args = null; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + + if (contextMenuItems) { + for (var i = 0, ii = contextMenuItems.length; i < ii; i++) { + var item = contextMenuItems[i]; + item.element.addEventListener('click', function (handler) { + this.contextMenuOpen = false; + handler(); + }.bind(this, item.handler)); + } + } + } + + PDFPresentationMode.prototype = { + /** + * Request the browser to enter fullscreen mode. + * @returns {boolean} Indicating if the request was successful. + */ + request: function PDFPresentationMode_request() { + if (this.switchInProgress || this.active || + !this.viewer.hasChildNodes()) { + return false; + } + this._addFullscreenChangeListeners(); + this._setSwitchInProgress(); + this._notifyStateChange(); + + if (this.container.requestFullscreen) { + this.container.requestFullscreen(); + } else if (this.container.mozRequestFullScreen) { + this.container.mozRequestFullScreen(); + } else if (this.container.webkitRequestFullscreen) { + this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + } else if (this.container.msRequestFullscreen) { + this.container.msRequestFullscreen(); + } else { + return false; + } + + this.args = { + page: PDFViewerApplication.page, + previousScale: PDFViewerApplication.currentScaleValue + }; + + return true; + }, + + /** + * Switches page when the user scrolls (using a scroll wheel or a touchpad) + * with large enough motion, to prevent accidental page switches. + * @param {number} delta - The delta value from the mouse event. + */ + mouseScroll: function PDFPresentationMode_mouseScroll(delta) { + if (!this.active) { + return; + } + var MOUSE_SCROLL_COOLDOWN_TIME = 50; + var PAGE_SWITCH_THRESHOLD = 120; + var PageSwitchDirection = { + UP: -1, + DOWN: 1 + }; + + var currentTime = (new Date()).getTime(); + var storedTime = this.mouseScrollTimeStamp; + + // If we've already switched page, avoid accidentally switching again. + if (currentTime > storedTime && + currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + // If the scroll direction changed, reset the accumulated scroll delta. + if ((this.mouseScrollDelta > 0 && delta < 0) || + (this.mouseScrollDelta < 0 && delta > 0)) { + this._resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + var pageSwitchDirection = (this.mouseScrollDelta > 0) ? + PageSwitchDirection.UP : PageSwitchDirection.DOWN; + var page = PDFViewerApplication.page; + this._resetMouseScrollState(); + + // If we're at the first/last page, we don't need to do anything. + if ((page === 1 && pageSwitchDirection === PageSwitchDirection.UP) || + (page === PDFViewerApplication.pagesCount && + pageSwitchDirection === PageSwitchDirection.DOWN)) { + return; + } + PDFViewerApplication.page = (page + pageSwitchDirection); + this.mouseScrollTimeStamp = currentTime; + } + }, + + get isFullscreen() { + return !!(document.fullscreenElement || + document.mozFullScreen || + document.webkitIsFullScreen || + document.msFullscreenElement); + }, + + /** + * @private + */ + _notifyStateChange: function PDFPresentationMode_notifyStateChange() { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('presentationmodechanged', true, true, { + active: this.active, + switchInProgress: !!this.switchInProgress + }); + window.dispatchEvent(event); + }, + + /** + * Used to initialize a timeout when requesting Presentation Mode, + * i.e. when the browser is requested to enter fullscreen mode. + * This timeout is used to prevent the current page from being scrolled + * partially, or completely, out of view when entering Presentation Mode. + * NOTE: This issue seems limited to certain zoom levels (e.g. page-width). + * @private + */ + _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() { + if (this.switchInProgress) { + clearTimeout(this.switchInProgress); + } + this.switchInProgress = setTimeout(function switchInProgressTimeout() { + this._removeFullscreenChangeListeners(); + delete this.switchInProgress; + this._notifyStateChange(); + }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS); + }, + + /** + * @private + */ + _resetSwitchInProgress: + function PDFPresentationMode_resetSwitchInProgress() { + if (this.switchInProgress) { + clearTimeout(this.switchInProgress); + delete this.switchInProgress; + } + }, + + /** + * @private + */ + _enter: function PDFPresentationMode_enter() { + this.active = true; + this._resetSwitchInProgress(); + this._notifyStateChange(); + this.container.classList.add(ACTIVE_SELECTOR); + + // Ensure that the correct page is scrolled into view when entering + // Presentation Mode, by waiting until fullscreen mode in enabled. + setTimeout(function enterPresentationModeTimeout() { + PDFViewerApplication.page = this.args.page; + PDFViewerApplication.setScale('page-fit', true); + }.bind(this), 0); + + this._addWindowListeners(); + this._showControls(); + this.contextMenuOpen = false; + this.container.setAttribute('contextmenu', 'viewerContextMenu'); + + // Text selection is disabled in Presentation Mode, thus it's not possible + // for the user to deselect text that is selected (e.g. with "Select all") + // when entering Presentation Mode, hence we remove any active selection. + window.getSelection().removeAllRanges(); + }, + + /** + * @private + */ + _exit: function PDFPresentationMode_exit() { + var page = PDFViewerApplication.page; + this.container.classList.remove(ACTIVE_SELECTOR); + + // Ensure that the correct page is scrolled into view when exiting + // Presentation Mode, by waiting until fullscreen mode is disabled. + setTimeout(function exitPresentationModeTimeout() { + this.active = false; + this._removeFullscreenChangeListeners(); + this._notifyStateChange(); + + PDFViewerApplication.setScale(this.args.previousScale, true); + PDFViewerApplication.page = page; + this.args = null; + }.bind(this), 0); + + this._removeWindowListeners(); + this._hideControls(); + this._resetMouseScrollState(); + this.container.removeAttribute('contextmenu'); + this.contextMenuOpen = false; + + if (this.pdfThumbnailViewer) { + this.pdfThumbnailViewer.ensureThumbnailVisible(page); + } + }, + + /** + * @private + */ + _mouseDown: function PDFPresentationMode_mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button === 0) { + // Enable clicking of links in presentation mode. Please note: + // Only links pointing to destinations in the current PDF document work. + var isInternalLink = (evt.target.href && + evt.target.classList.contains('internalLink')); + if (!isInternalLink) { + // Unless an internal link was clicked, advance one page. + evt.preventDefault(); + PDFViewerApplication.page += (evt.shiftKey ? -1 : 1); + } + } + }, + + /** + * @private + */ + _contextMenu: function PDFPresentationMode_contextMenu() { + this.contextMenuOpen = true; + }, + + /** + * @private + */ + _showControls: function PDFPresentationMode_showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(function showControlsTimeout() { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }.bind(this), DELAY_BEFORE_HIDING_CONTROLS); + }, + + /** + * @private + */ + _hideControls: function PDFPresentationMode_hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, + + /** + * Resets the properties used for tracking mouse scrolling events. + * @private + */ + _resetMouseScrollState: + function PDFPresentationMode_resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + }, + + /** + * @private + */ + _addWindowListeners: function PDFPresentationMode_addWindowListeners() { + this.showControlsBind = this._showControls.bind(this); + this.mouseDownBind = this._mouseDown.bind(this); + this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this); + this.contextMenuBind = this._contextMenu.bind(this); + + window.addEventListener('mousemove', this.showControlsBind); + window.addEventListener('mousedown', this.mouseDownBind); + window.addEventListener('keydown', this.resetMouseScrollStateBind); + window.addEventListener('contextmenu', this.contextMenuBind); + }, + + /** + * @private + */ + _removeWindowListeners: + function PDFPresentationMode_removeWindowListeners() { + window.removeEventListener('mousemove', this.showControlsBind); + window.removeEventListener('mousedown', this.mouseDownBind); + window.removeEventListener('keydown', this.resetMouseScrollStateBind); + window.removeEventListener('contextmenu', this.contextMenuBind); + + delete this.showControlsBind; + delete this.mouseDownBind; + delete this.resetMouseScrollStateBind; + delete this.contextMenuBind; + }, + + /** + * @private + */ + _fullscreenChange: function PDFPresentationMode_fullscreenChange() { + if (this.isFullscreen) { + this._enter(); + } else { + this._exit(); + } + }, + + /** + * @private + */ + _addFullscreenChangeListeners: + function PDFPresentationMode_addFullscreenChangeListeners() { + this.fullscreenChangeBind = this._fullscreenChange.bind(this); + + window.addEventListener('fullscreenchange', this.fullscreenChangeBind); + window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind); + window.addEventListener('webkitfullscreenchange', + this.fullscreenChangeBind); + window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind); + }, + + /** + * @private + */ + _removeFullscreenChangeListeners: + function PDFPresentationMode_removeFullscreenChangeListeners() { + window.removeEventListener('fullscreenchange', this.fullscreenChangeBind); + window.removeEventListener('mozfullscreenchange', + this.fullscreenChangeBind); + window.removeEventListener('webkitfullscreenchange', + this.fullscreenChangeBind); + window.removeEventListener('MSFullscreenChange', + this.fullscreenChangeBind); + + delete this.fullscreenChangeBind; + } + }; + + return PDFPresentationMode; +})(); + + +/* Copyright 2013 Rob Wu + * https://github.com/Rob--W/grab-to-pan.js + * + * 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. + */ + +'use strict'; + +var GrabToPan = (function GrabToPanClosure() { + /** + * Construct a GrabToPan instance for a given HTML element. + * @param options.element {Element} + * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)` + * @param options.onActiveChanged {function(boolean)} optional. Called + * when grab-to-pan is (de)activated. The first argument is a boolean that + * shows whether grab-to-pan is activated. + */ + function GrabToPan(options) { + this.element = options.element; + this.document = options.element.ownerDocument; + if (typeof options.ignoreTarget === 'function') { + this.ignoreTarget = options.ignoreTarget; + } + this.onActiveChanged = options.onActiveChanged; + + // Bind the contexts to ensure that `this` always points to + // the GrabToPan instance. + this.activate = this.activate.bind(this); + this.deactivate = this.deactivate.bind(this); + this.toggle = this.toggle.bind(this); + this._onmousedown = this._onmousedown.bind(this); + this._onmousemove = this._onmousemove.bind(this); + this._endPan = this._endPan.bind(this); + + // This overlay will be inserted in the document when the mouse moves during + // a grab operation, to ensure that the cursor has the desired appearance. + var overlay = this.overlay = document.createElement('div'); + overlay.className = 'grab-to-pan-grabbing'; + } + GrabToPan.prototype = { + /** + * Class name of element which can be grabbed + */ + CSS_CLASS_GRAB: 'grab-to-pan-grab', + + /** + * Bind a mousedown event to the element to enable grab-detection. + */ + activate: function GrabToPan_activate() { + if (!this.active) { + this.active = true; + this.element.addEventListener('mousedown', this._onmousedown, true); + this.element.classList.add(this.CSS_CLASS_GRAB); + if (this.onActiveChanged) { + this.onActiveChanged(true); + } + } + }, + + /** + * Removes all events. Any pending pan session is immediately stopped. + */ + deactivate: function GrabToPan_deactivate() { + if (this.active) { + this.active = false; + this.element.removeEventListener('mousedown', this._onmousedown, true); + this._endPan(); + this.element.classList.remove(this.CSS_CLASS_GRAB); + if (this.onActiveChanged) { + this.onActiveChanged(false); + } + } + }, + + toggle: function GrabToPan_toggle() { + if (this.active) { + this.deactivate(); + } else { + this.activate(); + } + }, + + /** + * Whether to not pan if the target element is clicked. + * Override this method to change the default behaviour. + * + * @param node {Element} The target of the event + * @return {boolean} Whether to not react to the click event. + */ + ignoreTarget: function GrabToPan_ignoreTarget(node) { + // Use matchesSelector to check whether the clicked element + // is (a child of) an input element / link + return node[matchesSelector]( + 'a[href], a[href] *, input, textarea, button, button *, select, option' + ); + }, + + /** + * @private + */ + _onmousedown: function GrabToPan__onmousedown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + /* jshint expr:true */ + event.originalTarget.tagName; + } catch (e) { + // Mozilla-specific: element is a scrollbar (XUL element) + return; + } + } + + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.document.addEventListener('mousemove', this._onmousemove, true); + this.document.addEventListener('mouseup', this._endPan, true); + // When a scroll event occurs before a mousemove, assume that the user + // dragged a scrollbar (necessary for Opera Presto, Safari and IE) + // (not needed for Chrome/Firefox) + this.element.addEventListener('scroll', this._endPan, true); + event.preventDefault(); + event.stopPropagation(); + this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING); + + var focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + }, + + /** + * @private + */ + _onmousemove: function GrabToPan__onmousemove(event) { + this.element.removeEventListener('scroll', this._endPan, true); + if (isLeftMouseReleased(event)) { + this._endPan(); + return; + } + var xDiff = event.clientX - this.clientXStart; + var yDiff = event.clientY - this.clientYStart; + this.element.scrollTop = this.scrollTopStart - yDiff; + this.element.scrollLeft = this.scrollLeftStart - xDiff; + if (!this.overlay.parentNode) { + document.body.appendChild(this.overlay); + } + }, + + /** + * @private + */ + _endPan: function GrabToPan__endPan() { + this.element.removeEventListener('scroll', this._endPan, true); + this.document.removeEventListener('mousemove', this._onmousemove, true); + this.document.removeEventListener('mouseup', this._endPan, true); + if (this.overlay.parentNode) { + this.overlay.parentNode.removeChild(this.overlay); + } + } + }; + + // Get the correct (vendor-prefixed) name of the matches method. + var matchesSelector; + ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) { + var name = prefix + 'atches'; + if (name in document.documentElement) { + matchesSelector = name; + } + name += 'Selector'; + if (name in document.documentElement) { + matchesSelector = name; + } + return matchesSelector; // If found, then truthy, and [].some() ends. + }); + + // Browser sniffing because it's impossible to feature-detect + // whether event.which for onmousemove is reliable + var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9; + var chrome = window.chrome; + var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app); + // ^ Chrome 15+ ^ Opera 15+ + var isSafari6plus = /Apple/.test(navigator.vendor) && + /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent); + + /** + * Whether the left mouse is not pressed. + * @param event {MouseEvent} + * @return {boolean} True if the left mouse button is not pressed. + * False if unsure or if the left mouse button is pressed. + */ + function isLeftMouseReleased(event) { + if ('buttons' in event && isNotIEorIsIE10plus) { + // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons + // Firefox 15+ + // Internet Explorer 10+ + return !(event.buttons | 1); + } + if (isChrome15OrOpera15plus || isSafari6plus) { + // Chrome 14+ + // Opera 15+ + // Safari 6.0+ + return event.which === 0; + } + } + + return GrabToPan; +})(); + +var HandTool = { + initialize: function handToolInitialize(options) { + var toggleHandTool = options.toggleHandTool; + this.handTool = new GrabToPan({ + element: options.container, + onActiveChanged: function(isActive) { + if (!toggleHandTool) { + return; + } + if (isActive) { + toggleHandTool.title = + mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool'); + toggleHandTool.firstElementChild.textContent = + mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool'); + } else { + toggleHandTool.title = + mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool'); + toggleHandTool.firstElementChild.textContent = + mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool'); + } + } + }); + if (toggleHandTool) { + toggleHandTool.addEventListener('click', this.toggle.bind(this), false); + + window.addEventListener('localized', function (evt) { + Preferences.get('enableHandToolOnLoad').then(function resolved(value) { + if (value) { + this.handTool.activate(); + } + }.bind(this), function rejected(reason) {}); + }.bind(this)); + + window.addEventListener('presentationmodechanged', function (evt) { + if (evt.detail.switchInProgress) { + return; + } + if (evt.detail.active) { + this.enterPresentationMode(); + } else { + this.exitPresentationMode(); + } + }.bind(this)); + } + }, + + toggle: function handToolToggle() { + this.handTool.toggle(); + SecondaryToolbar.close(); + }, + + enterPresentationMode: function handToolEnterPresentationMode() { + if (this.handTool.active) { + this.wasActive = true; + this.handTool.deactivate(); + } + }, + + exitPresentationMode: function handToolExitPresentationMode() { + if (this.wasActive) { + this.wasActive = null; + this.handTool.activate(); + } + } +}; + + +var OverlayManager = { + overlays: {}, + active: null, + + /** + * @param {string} name The name of the overlay that is registered. This must + * be equal to the ID of the overlay's DOM element. + * @param {function} callerCloseMethod (optional) The method that, if present, + * will call OverlayManager.close from the Object + * registering the overlay. Access to this method is + * necessary in order to run cleanup code when e.g. + * the overlay is force closed. The default is null. + * @param {boolean} canForceClose (optional) Indicates if opening the overlay + * will close an active overlay. The default is false. + * @returns {Promise} A promise that is resolved when the overlay has been + * registered. + */ + register: function overlayManagerRegister(name, + callerCloseMethod, canForceClose) { + return new Promise(function (resolve) { + var element, container; + if (!name || !(element = document.getElementById(name)) || + !(container = element.parentNode)) { + throw new Error('Not enough parameters.'); + } else if (this.overlays[name]) { + throw new Error('The overlay is already registered.'); + } + this.overlays[name] = { element: element, + container: container, + callerCloseMethod: (callerCloseMethod || null), + canForceClose: (canForceClose || false) }; + resolve(); + }.bind(this)); + }, + + /** + * @param {string} name The name of the overlay that is unregistered. + * @returns {Promise} A promise that is resolved when the overlay has been + * unregistered. + */ + unregister: function overlayManagerUnregister(name) { + return new Promise(function (resolve) { + if (!this.overlays[name]) { + throw new Error('The overlay does not exist.'); + } else if (this.active === name) { + throw new Error('The overlay cannot be removed while it is active.'); + } + delete this.overlays[name]; + + resolve(); + }.bind(this)); + }, + + /** + * @param {string} name The name of the overlay that should be opened. + * @returns {Promise} A promise that is resolved when the overlay has been + * opened. + */ + open: function overlayManagerOpen(name) { + return new Promise(function (resolve) { + if (!this.overlays[name]) { + throw new Error('The overlay does not exist.'); + } else if (this.active) { + if (this.overlays[name].canForceClose) { + this._closeThroughCaller(); + } else if (this.active === name) { + throw new Error('The overlay is already active.'); + } else { + throw new Error('Another overlay is currently active.'); + } + } + this.active = name; + this.overlays[this.active].element.classList.remove('hidden'); + this.overlays[this.active].container.classList.remove('hidden'); + + window.addEventListener('keydown', this._keyDown); + resolve(); + }.bind(this)); + }, + + /** + * @param {string} name The name of the overlay that should be closed. + * @returns {Promise} A promise that is resolved when the overlay has been + * closed. + */ + close: function overlayManagerClose(name) { + return new Promise(function (resolve) { + if (!this.overlays[name]) { + throw new Error('The overlay does not exist.'); + } else if (!this.active) { + throw new Error('The overlay is currently not active.'); + } else if (this.active !== name) { + throw new Error('Another overlay is currently active.'); + } + this.overlays[this.active].container.classList.add('hidden'); + this.overlays[this.active].element.classList.add('hidden'); + this.active = null; + + window.removeEventListener('keydown', this._keyDown); + resolve(); + }.bind(this)); + }, + + /** + * @private + */ + _keyDown: function overlayManager_keyDown(evt) { + var self = OverlayManager; + if (self.active && evt.keyCode === 27) { // Esc key. + self._closeThroughCaller(); + evt.preventDefault(); + } + }, + + /** + * @private + */ + _closeThroughCaller: function overlayManager_closeThroughCaller() { + if (this.overlays[this.active].callerCloseMethod) { + this.overlays[this.active].callerCloseMethod(); + } + if (this.active) { + this.close(this.active); + } + } +}; + + +var PasswordPrompt = { + overlayName: null, + updatePassword: null, + reason: null, + passwordField: null, + passwordText: null, + passwordSubmit: null, + passwordCancel: null, + + initialize: function secondaryToolbarInitialize(options) { + this.overlayName = options.overlayName; + this.passwordField = options.passwordField; + this.passwordText = options.passwordText; + this.passwordSubmit = options.passwordSubmit; + this.passwordCancel = options.passwordCancel; + + // Attach the event listeners. + this.passwordSubmit.addEventListener('click', + this.verifyPassword.bind(this)); + + this.passwordCancel.addEventListener('click', this.close.bind(this)); + + this.passwordField.addEventListener('keydown', function (e) { + if (e.keyCode === 13) { // Enter key + this.verifyPassword(); + } + }.bind(this)); + + OverlayManager.register(this.overlayName, this.close.bind(this), true); + }, + + open: function passwordPromptOpen() { + OverlayManager.open(this.overlayName).then(function () { + this.passwordField.focus(); + + var promptString = mozL10n.get('password_label', null, + 'Enter the password to open this PDF file.'); + + if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) { + promptString = mozL10n.get('password_invalid', null, + 'Invalid password. Please try again.'); + } + + this.passwordText.textContent = promptString; + }.bind(this)); + }, + + close: function passwordPromptClose() { + OverlayManager.close(this.overlayName).then(function () { + this.passwordField.value = ''; + }.bind(this)); + }, + + verifyPassword: function passwordPromptVerifyPassword() { + var password = this.passwordField.value; + if (password && password.length > 0) { + this.close(); + return this.updatePassword(password); + } + } +}; + + +/** + * @typedef {Object} PDFDocumentPropertiesOptions + * @property {string} overlayName - Name/identifier for the overlay. + * @property {Object} fields - Names and elements of the overlay's fields. + * @property {HTMLButtonElement} closeButton - Button for closing the overlay. + */ + +/** + * @class + */ +var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { + /** + * @constructs PDFDocumentProperties + * @param {PDFDocumentPropertiesOptions} options + */ + function PDFDocumentProperties(options) { + this.fields = options.fields; + this.overlayName = options.overlayName; + + this.rawFileSize = 0; + this.url = null; + this.pdfDocument = null; + + // Bind the event listener for the Close button. + if (options.closeButton) { + options.closeButton.addEventListener('click', this.close.bind(this)); + } + + this.dataAvailablePromise = new Promise(function (resolve) { + this.resolveDataAvailable = resolve; + }.bind(this)); + + OverlayManager.register(this.overlayName, this.close.bind(this)); + } + + PDFDocumentProperties.prototype = { + /** + * Open the document properties overlay. + */ + open: function PDFDocumentProperties_open() { + Promise.all([OverlayManager.open(this.overlayName), + this.dataAvailablePromise]).then(function () { + this._getProperties(); + }.bind(this)); + }, + + /** + * Close the document properties overlay. + */ + close: function PDFDocumentProperties_close() { + OverlayManager.close(this.overlayName); + }, + + /** + * Set the file size of the PDF document. This method is used to + * update the file size in the document properties overlay once it + * is known so we do not have to wait until the entire file is loaded. + * + * @param {number} fileSize - The file size of the PDF document. + */ + setFileSize: function PDFDocumentProperties_setFileSize(fileSize) { + if (fileSize > 0) { + this.rawFileSize = fileSize; + } + }, + + /** + * Set a reference to the PDF document and the URL in order + * to populate the overlay fields with the document properties. + * Note that the overlay will contain no information if this method + * is not called. + * + * @param {Object} pdfDocument - A reference to the PDF document. + * @param {string} url - The URL of the document. + */ + setDocumentAndUrl: + function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) { + this.pdfDocument = pdfDocument; + this.url = url; + this.resolveDataAvailable(); + }, + + /** + * @private + */ + _getProperties: function PDFDocumentProperties_getProperties() { + if (!OverlayManager.active) { + // If the dialog was closed before dataAvailablePromise was resolved, + // don't bother updating the properties. + return; + } + // Get the file size (if it hasn't already been set). + this.pdfDocument.getDownloadInfo().then(function(data) { + if (data.length === this.rawFileSize) { + return; + } + this.setFileSize(data.length); + this._updateUI(this.fields['fileSize'], this._parseFileSize()); + }.bind(this)); + + // Get the document properties. + this.pdfDocument.getMetadata().then(function(data) { + var content = { + 'fileName': getPDFFileNameFromURL(this.url), + 'fileSize': this._parseFileSize(), + 'title': data.info.Title, + 'author': data.info.Author, + 'subject': data.info.Subject, + 'keywords': data.info.Keywords, + 'creationDate': this._parseDate(data.info.CreationDate), + 'modificationDate': this._parseDate(data.info.ModDate), + 'creator': data.info.Creator, + 'producer': data.info.Producer, + 'version': data.info.PDFFormatVersion, + 'pageCount': this.pdfDocument.numPages + }; + + // Show the properties in the dialog. + for (var identifier in content) { + this._updateUI(this.fields[identifier], content[identifier]); + } + }.bind(this)); + }, + + /** + * @private + */ + _updateUI: function PDFDocumentProperties_updateUI(field, content) { + if (field && content !== undefined && content !== '') { + field.textContent = content; + } + }, + + /** + * @private + */ + _parseFileSize: function PDFDocumentProperties_parseFileSize() { + var fileSize = this.rawFileSize, kb = fileSize / 1024; + if (!kb) { + return; + } else if (kb < 1024) { + return mozL10n.get('document_properties_kb', { + size_kb: (+kb.toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }, '{{size_kb}} KB ({{size_b}} bytes)'); + } else { + return mozL10n.get('document_properties_mb', { + size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }, '{{size_mb}} MB ({{size_b}} bytes)'); + } + }, + + /** + * @private + */ + _parseDate: function PDFDocumentProperties_parseDate(inputDate) { + // This is implemented according to the PDF specification, but note that + // Adobe Reader doesn't handle changing the date to universal time + // and doesn't use the user's time zone (they're effectively ignoring + // the HH' and mm' parts of the date string). + var dateToParse = inputDate; + if (dateToParse === undefined) { + return ''; + } + + // Remove the D: prefix if it is available. + if (dateToParse.substring(0,2) === 'D:') { + dateToParse = dateToParse.substring(2); + } + + // Get all elements from the PDF date string. + // JavaScript's Date object expects the month to be between + // 0 and 11 instead of 1 and 12, so we're correcting for this. + var year = parseInt(dateToParse.substring(0,4), 10); + var month = parseInt(dateToParse.substring(4,6), 10) - 1; + var day = parseInt(dateToParse.substring(6,8), 10); + var hours = parseInt(dateToParse.substring(8,10), 10); + var minutes = parseInt(dateToParse.substring(10,12), 10); + var seconds = parseInt(dateToParse.substring(12,14), 10); + var utRel = dateToParse.substring(14,15); + var offsetHours = parseInt(dateToParse.substring(15,17), 10); + var offsetMinutes = parseInt(dateToParse.substring(18,20), 10); + + // As per spec, utRel = 'Z' means equal to universal time. + // The other cases ('-' and '+') have to be handled here. + if (utRel === '-') { + hours += offsetHours; + minutes += offsetMinutes; + } else if (utRel === '+') { + hours -= offsetHours; + minutes -= offsetMinutes; + } + + // Return the new date format from the user's locale. + var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds)); + var dateString = date.toLocaleDateString(); + var timeString = date.toLocaleTimeString(); + return mozL10n.get('document_properties_date_string', + {date: dateString, time: timeString}, + '{{date}}, {{time}}'); + } + }; + + return PDFDocumentProperties; +})(); + + +var PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3, +}; + +var IGNORE_CURRENT_POSITION_ON_ZOOM = false; +var DEFAULT_CACHE_SIZE = 10; + + +var CLEANUP_TIMEOUT = 30000; + +var RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 +}; + +/** + * Controls rendering of the views for pages and thumbnails. + * @class + */ +var PDFRenderingQueue = (function PDFRenderingQueueClosure() { + /** + * @constructs + */ + function PDFRenderingQueue() { + this.pdfViewer = null; + this.pdfThumbnailViewer = null; + this.onIdle = null; + + this.highestPriorityPage = null; + this.idleTimeout = null; + this.printing = false; + this.isThumbnailViewEnabled = false; + } + + PDFRenderingQueue.prototype = /** @lends PDFRenderingQueue.prototype */ { + /** + * @param {PDFViewer} pdfViewer + */ + setViewer: function PDFRenderingQueue_setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + }, + + /** + * @param {PDFThumbnailViewer} pdfThumbnailViewer + */ + setThumbnailViewer: + function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) { + this.pdfThumbnailViewer = pdfThumbnailViewer; + }, + + /** + * @param {IRenderableView} view + * @returns {boolean} + */ + isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) { + return this.highestPriorityPage === view.renderingId; + }, + + renderHighestPriority: function + PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) { + if (this.idleTimeout) { + clearTimeout(this.idleTimeout); + this.idleTimeout = null; + } + + // Pages have a higher priority than thumbnails, so check them first. + if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + // No pages needed rendering so check thumbnails. + if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) { + if (this.pdfThumbnailViewer.forceRendering()) { + return; + } + } + + if (this.printing) { + // If printing is currently ongoing do not reschedule cleanup. + return; + } + + if (this.onIdle) { + this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + }, + + getHighestPriority: function + PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) { + // The state has changed figure out which page has the highest priority to + // render next (if any). + // Priority: + // 1 visible pages + // 2 if last scrolled down page after the visible pages + // 2 if last scrolled up page before the visible pages + var visibleViews = visible.views; + + var numVisible = visibleViews.length; + if (numVisible === 0) { + return false; + } + for (var i = 0; i < numVisible; ++i) { + var view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + + // All the visible views have rendered, try to render next/previous pages. + if (scrolledDown) { + var nextPageIndex = visible.last.id; + // ID's start at 1 so no need to add 1. + if (views[nextPageIndex] && + !this.isViewFinished(views[nextPageIndex])) { + return views[nextPageIndex]; + } + } else { + var previousPageIndex = visible.first.id - 2; + if (views[previousPageIndex] && + !this.isViewFinished(views[previousPageIndex])) { + return views[previousPageIndex]; + } + } + // Everything that needs to be rendered has been. + return null; + }, + + /** + * @param {IRenderableView} view + * @returns {boolean} + */ + isViewFinished: function PDFRenderingQueue_isViewFinished(view) { + return view.renderingState === RenderingStates.FINISHED; + }, + + /** + * Render a page or thumbnail view. This calls the appropriate function + * based on the views state. If the view is already rendered it will return + * false. + * @param {IRenderableView} view + */ + renderView: function PDFRenderingQueue_renderView(view) { + var state = view.renderingState; + switch (state) { + case RenderingStates.FINISHED: + return false; + case RenderingStates.PAUSED: + this.highestPriorityPage = view.renderingId; + view.resume(); + break; + case RenderingStates.RUNNING: + this.highestPriorityPage = view.renderingId; + break; + case RenderingStates.INITIAL: + this.highestPriorityPage = view.renderingId; + var continueRendering = function () { + this.renderHighestPriority(); + }.bind(this); + view.draw().then(continueRendering, continueRendering); + break; + } + return true; + }, + }; + + return PDFRenderingQueue; +})(); + + +var TEXT_LAYER_RENDER_DELAY = 200; // ms + +/** + * @typedef {Object} PDFPageViewOptions + * @property {HTMLDivElement} container - The viewer element. + * @property {number} id - The page unique ID (normally its number). + * @property {number} scale - The page scale display. + * @property {PageViewport} defaultViewport - The page viewport. + * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. + * @property {IPDFTextLayerFactory} textLayerFactory + * @property {IPDFAnnotationsLayerFactory} annotationsLayerFactory + */ + +/** + * @class + * @implements {IRenderableView} + */ +var PDFPageView = (function PDFPageViewClosure() { + /** + * @constructs PDFPageView + * @param {PDFPageViewOptions} options + */ + function PDFPageView(options) { + var container = options.container; + var id = options.id; + var scale = options.scale; + var defaultViewport = options.defaultViewport; + var renderingQueue = options.renderingQueue; + var textLayerFactory = options.textLayerFactory; + var annotationsLayerFactory = options.annotationsLayerFactory; + + this.id = id; + this.renderingId = 'page' + id; + + this.rotation = 0; + this.scale = scale || 1.0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this.hasRestrictedScaling = false; + + this.renderingQueue = renderingQueue; + this.textLayerFactory = textLayerFactory; + this.annotationsLayerFactory = annotationsLayerFactory; + + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + + this.onBeforeDraw = null; + this.onAfterDraw = null; + + this.textLayer = null; + + this.zoomLayer = null; + + this.annotationLayer = null; + + var div = document.createElement('div'); + div.id = 'pageContainer' + this.id; + div.className = 'page'; + div.style.width = Math.floor(this.viewport.width) + 'px'; + div.style.height = Math.floor(this.viewport.height) + 'px'; + div.setAttribute('data-page-number', this.id); + this.div = div; + + container.appendChild(div); + } + + PDFPageView.prototype = { + setPdfPage: function PDFPageView_setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, + totalRotation); + this.stats = pdfPage.stats; + this.reset(); + }, + + destroy: function PDFPageView_destroy() { + this.zoomLayer = null; + this.reset(); + if (this.pdfPage) { + this.pdfPage.destroy(); + } + }, + + reset: function PDFPageView_reset(keepAnnotations) { + if (this.renderTask) { + this.renderTask.cancel(); + } + this.resume = null; + this.renderingState = RenderingStates.INITIAL; + + var div = this.div; + div.style.width = Math.floor(this.viewport.width) + 'px'; + div.style.height = Math.floor(this.viewport.height) + 'px'; + + var childNodes = div.childNodes; + var currentZoomLayer = this.zoomLayer || null; + var currentAnnotationNode = (keepAnnotations && this.annotationLayer && + this.annotationLayer.div) || null; + for (var i = childNodes.length - 1; i >= 0; i--) { + var node = childNodes[i]; + if (currentZoomLayer === node || currentAnnotationNode === node) { + continue; + } + div.removeChild(node); + } + div.removeAttribute('data-loaded'); + + if (keepAnnotations) { + if (this.annotationLayer) { + // Hide annotationLayer until all elements are resized + // so they are not displayed on the already-resized page + this.annotationLayer.hide(); + } + } else { + this.annotationLayer = null; + } + + if (this.canvas) { + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + + this.loadingIconDiv = document.createElement('div'); + this.loadingIconDiv.className = 'loadingIcon'; + div.appendChild(this.loadingIconDiv); + }, + + update: function PDFPageView_update(scale, rotation) { + this.scale = scale || this.scale; + + if (typeof rotation !== 'undefined') { + this.rotation = rotation; + } + + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * CSS_UNITS, + rotation: totalRotation + }); + + var isScalingRestricted = false; + if (this.canvas && PDFJS.maxCanvasPixels > 0) { + var ctx = this.canvas.getContext('2d'); + var outputScale = getOutputScale(ctx); + var pixelsInViewport = this.viewport.width * this.viewport.height; + var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport); + if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) * + ((Math.floor(this.viewport.height) * outputScale.sy) | 0) > + PDFJS.maxCanvasPixels) { + isScalingRestricted = true; + } + } + + if (this.canvas && + (PDFJS.useOnlyCssZoom || + (this.hasRestrictedScaling && isScalingRestricted))) { + this.cssTransform(this.canvas, true); + return; + } else if (this.canvas && !this.zoomLayer) { + this.zoomLayer = this.canvas.parentNode; + this.zoomLayer.style.position = 'absolute'; + } + if (this.zoomLayer) { + this.cssTransform(this.zoomLayer.firstChild); + } + this.reset(true); + }, + + /** + * Called when moved in the parent's container. + */ + updatePosition: function PDFPageView_updatePosition() { + if (this.textLayer) { + this.textLayer.render(TEXT_LAYER_RENDER_DELAY); + } + }, + + cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) { + // Scale canvas, canvas wrapper, and page container. + var width = this.viewport.width; + var height = this.viewport.height; + var div = this.div; + canvas.style.width = canvas.parentNode.style.width = div.style.width = + Math.floor(width) + 'px'; + canvas.style.height = canvas.parentNode.style.height = div.style.height = + Math.floor(height) + 'px'; + // The canvas may have been originally rotated, rotate relative to that. + var relativeRotation = this.viewport.rotation - canvas._viewport.rotation; + var absRotation = Math.abs(relativeRotation); + var scaleX = 1, scaleY = 1; + if (absRotation === 90 || absRotation === 270) { + // Scale x and y because of the rotation. + scaleX = height / width; + scaleY = width / height; + } + var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + + 'scale(' + scaleX + ',' + scaleY + ')'; + CustomStyle.setProp('transform', canvas, cssTransform); + + if (this.textLayer) { + // Rotating the text layer is more complicated since the divs inside the + // the text layer are rotated. + // TODO: This could probably be simplified by drawing the text layer in + // one orientation then rotating overall. + var textLayerViewport = this.textLayer.viewport; + var textRelativeRotation = this.viewport.rotation - + textLayerViewport.rotation; + var textAbsRotation = Math.abs(textRelativeRotation); + var scale = width / textLayerViewport.width; + if (textAbsRotation === 90 || textAbsRotation === 270) { + scale = width / textLayerViewport.height; + } + var textLayerDiv = this.textLayer.textLayerDiv; + var transX, transY; + switch (textAbsRotation) { + case 0: + transX = transY = 0; + break; + case 90: + transX = 0; + transY = '-' + textLayerDiv.style.height; + break; + case 180: + transX = '-' + textLayerDiv.style.width; + transY = '-' + textLayerDiv.style.height; + break; + case 270: + transX = '-' + textLayerDiv.style.width; + transY = 0; + break; + default: + console.error('Bad rotation value.'); + break; + } + CustomStyle.setProp('transform', textLayerDiv, + 'rotate(' + textAbsRotation + 'deg) ' + + 'scale(' + scale + ', ' + scale + ') ' + + 'translate(' + transX + ', ' + transY + ')'); + CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%'); + } + + if (redrawAnnotations && this.annotationLayer) { + this.annotationLayer.setupAnnotations(this.viewport); + } + }, + + get width() { + return this.viewport.width; + }, + + get height() { + return this.viewport.height; + }, + + getPagePoint: function PDFPageView_getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + }, + + draw: function PDFPageView_draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error('Must be in new state before drawing'); + } + + this.renderingState = RenderingStates.RUNNING; + + var pdfPage = this.pdfPage; + var viewport = this.viewport; + var div = this.div; + // Wrap the canvas so if it has a css transform for highdpi the overflow + // will be hidden in FF. + var canvasWrapper = document.createElement('div'); + canvasWrapper.style.width = div.style.width; + canvasWrapper.style.height = div.style.height; + canvasWrapper.classList.add('canvasWrapper'); + + var canvas = document.createElement('canvas'); + canvas.id = 'page' + this.id; + canvasWrapper.appendChild(canvas); + if (this.annotationLayer) { + // annotationLayer needs to stay on top + div.insertBefore(canvasWrapper, this.annotationLayer.div); + } else { + div.appendChild(canvasWrapper); + } + this.canvas = canvas; + + var ctx = canvas.getContext('2d'); + var outputScale = getOutputScale(ctx); + + if (PDFJS.useOnlyCssZoom) { + var actualSizeViewport = viewport.clone({ scale: CSS_UNITS }); + // Use a scale that will make the canvas be the original intended size + // of the page. + outputScale.sx *= actualSizeViewport.width / viewport.width; + outputScale.sy *= actualSizeViewport.height / viewport.height; + outputScale.scaled = true; + } + + if (PDFJS.maxCanvasPixels > 0) { + var pixelsInViewport = viewport.width * viewport.height; + var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport); + if (outputScale.sx > maxScale || outputScale.sy > maxScale) { + outputScale.sx = maxScale; + outputScale.sy = maxScale; + outputScale.scaled = true; + this.hasRestrictedScaling = true; + } else { + this.hasRestrictedScaling = false; + } + } + + canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0; + canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0; + canvas.style.width = Math.floor(viewport.width) + 'px'; + canvas.style.height = Math.floor(viewport.height) + 'px'; + // Add the viewport so it's known what it was originally drawn with. + canvas._viewport = viewport; + + var textLayerDiv = null; + var textLayer = null; + if (this.textLayerFactory) { + textLayerDiv = document.createElement('div'); + textLayerDiv.className = 'textLayer'; + textLayerDiv.style.width = canvas.style.width; + textLayerDiv.style.height = canvas.style.height; + if (this.annotationLayer) { + // annotationLayer needs to stay on top + div.insertBefore(textLayerDiv, this.annotationLayer.div); + } else { + div.appendChild(textLayerDiv); + } + + textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, + this.id - 1, + this.viewport); + } + this.textLayer = textLayer; + + if (outputScale.scaled) { + // Used by the mozCurrentTransform polyfill in src/display/canvas.js. + ctx._transformMatrix = [outputScale.sx, 0, 0, outputScale.sy, 0, 0]; + ctx.scale(outputScale.sx, outputScale.sy); + } + + var resolveRenderPromise, rejectRenderPromise; + var promise = new Promise(function (resolve, reject) { + resolveRenderPromise = resolve; + rejectRenderPromise = reject; + }); + + // Rendering area + + var self = this; + function pageViewDrawCallback(error) { + // The renderTask may have been replaced by a new one, so only remove + // the reference to the renderTask if it matches the one that is + // triggering this callback. + if (renderTask === self.renderTask) { + self.renderTask = null; + } + + if (error === 'cancelled') { + rejectRenderPromise(error); + return; + } + + self.renderingState = RenderingStates.FINISHED; + + if (self.loadingIconDiv) { + div.removeChild(self.loadingIconDiv); + delete self.loadingIconDiv; + } + + if (self.zoomLayer) { + div.removeChild(self.zoomLayer); + self.zoomLayer = null; + } + + self.error = error; + self.stats = pdfPage.stats; + if (self.onAfterDraw) { + self.onAfterDraw(); + } + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagerendered', true, true, { + pageNumber: self.id + }); + div.dispatchEvent(event); + // This custom event is deprecated, and will be removed in the future, + // please use the |pagerendered| event instead. + var deprecatedEvent = document.createEvent('CustomEvent'); + deprecatedEvent.initCustomEvent('pagerender', true, true, { + pageNumber: pdfPage.pageNumber + }); + div.dispatchEvent(deprecatedEvent); + + if (!error) { + resolveRenderPromise(undefined); + } else { + rejectRenderPromise(error); + } + } + + var renderContinueCallback = null; + if (this.renderingQueue) { + renderContinueCallback = function renderContinueCallback(cont) { + if (!self.renderingQueue.isHighestPriority(self)) { + self.renderingState = RenderingStates.PAUSED; + self.resume = function resumeCallback() { + self.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + } + + var renderContext = { + canvasContext: ctx, + viewport: this.viewport, + // intent: 'default', // === 'display' + continueCallback: renderContinueCallback + }; + var renderTask = this.renderTask = this.pdfPage.render(renderContext); + + this.renderTask.promise.then( + function pdfPageRenderCallback() { + pageViewDrawCallback(null); + if (textLayer) { + self.pdfPage.getTextContent().then( + function textContentResolved(textContent) { + textLayer.setTextContent(textContent); + textLayer.render(TEXT_LAYER_RENDER_DELAY); + } + ); + } + }, + function pdfPageRenderError(error) { + pageViewDrawCallback(error); + } + ); + + if (this.annotationsLayerFactory) { + if (!this.annotationLayer) { + this.annotationLayer = this.annotationsLayerFactory. + createAnnotationsLayerBuilder(div, this.pdfPage); + } + this.annotationLayer.setupAnnotations(this.viewport); + } + div.setAttribute('data-loaded', true); + + if (self.onBeforeDraw) { + self.onBeforeDraw(); + } + return promise; + }, + + beforePrint: function PDFPageView_beforePrint() { + var pdfPage = this.pdfPage; + + var viewport = pdfPage.getViewport(1); + // Use the same hack we use for high dpi displays for printing to get + // better output until bug 811002 is fixed in FF. + var PRINT_OUTPUT_SCALE = 2; + var canvas = document.createElement('canvas'); + + // The logical size of the canvas. + canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE; + canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE; + + // The rendered size of the canvas, relative to the size of canvasWrapper. + canvas.style.width = (PRINT_OUTPUT_SCALE * 100) + '%'; + canvas.style.height = (PRINT_OUTPUT_SCALE * 100) + '%'; + + var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' + + (1 / PRINT_OUTPUT_SCALE) + ')'; + CustomStyle.setProp('transform' , canvas, cssScale); + CustomStyle.setProp('transformOrigin' , canvas, '0% 0%'); + + var printContainer = document.getElementById('printContainer'); + var canvasWrapper = document.createElement('div'); + canvasWrapper.style.width = viewport.width + 'pt'; + canvasWrapper.style.height = viewport.height + 'pt'; + canvasWrapper.appendChild(canvas); + printContainer.appendChild(canvasWrapper); + + canvas.mozPrintCallback = function(obj) { + var ctx = obj.context; + + ctx.save(); + ctx.fillStyle = 'rgb(255, 255, 255)'; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.restore(); + // Used by the mozCurrentTransform polyfill in src/display/canvas.js. + ctx._transformMatrix = + [PRINT_OUTPUT_SCALE, 0, 0, PRINT_OUTPUT_SCALE, 0, 0]; + ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE); + + var renderContext = { + canvasContext: ctx, + viewport: viewport, + intent: 'print' + }; + + pdfPage.render(renderContext).promise.then(function() { + // Tell the printEngine that rendering this canvas/page has finished. + obj.done(); + }, function(error) { + console.error(error); + // Tell the printEngine that rendering this canvas/page has failed. + // This will make the print proces stop. + if ('abort' in obj) { + obj.abort(); + } else { + obj.done(); + } + }); + }; + }, + }; + + return PDFPageView; +})(); + + +var MAX_TEXT_DIVS_TO_RENDER = 100000; + +var NonWhitespaceRegexp = /\S/; + +function isAllWhitespace(str) { + return !NonWhitespaceRegexp.test(str); +} + +/** + * @typedef {Object} TextLayerBuilderOptions + * @property {HTMLDivElement} textLayerDiv - The text layer container. + * @property {number} pageIndex - The page index. + * @property {PageViewport} viewport - The viewport of the text layer. + * @property {PDFFindController} findController + */ + +/** + * TextLayerBuilder provides text-selection functionality for the PDF. + * It does this by creating overlay divs over the PDF text. These divs + * contain text that matches the PDF text they are overlaying. This object + * also provides a way to highlight text that is being searched for. + * @class + */ +var TextLayerBuilder = (function TextLayerBuilderClosure() { + function TextLayerBuilder(options) { + this.textLayerDiv = options.textLayerDiv; + this.renderingDone = false; + this.divContentDone = false; + this.pageIdx = options.pageIndex; + this.pageNumber = this.pageIdx + 1; + this.matches = []; + this.viewport = options.viewport; + this.textDivs = []; + this.findController = options.findController || null; + } + + TextLayerBuilder.prototype = { + _finishRendering: function TextLayerBuilder_finishRendering() { + this.renderingDone = true; + + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('textlayerrendered', true, true, { + pageNumber: this.pageNumber + }); + this.textLayerDiv.dispatchEvent(event); + }, + + renderLayer: function TextLayerBuilder_renderLayer() { + var textLayerFrag = document.createDocumentFragment(); + var textDivs = this.textDivs; + var textDivsLength = textDivs.length; + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + // No point in rendering many divs as it would make the browser + // unusable even after the divs are rendered. + if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { + this._finishRendering(); + return; + } + + var lastFontSize; + var lastFontFamily; + for (var i = 0; i < textDivsLength; i++) { + var textDiv = textDivs[i]; + if (textDiv.dataset.isWhitespace !== undefined) { + continue; + } + + var fontSize = textDiv.style.fontSize; + var fontFamily = textDiv.style.fontFamily; + + // Only build font string and set to context if different from last. + if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { + ctx.font = fontSize + ' ' + fontFamily; + lastFontSize = fontSize; + lastFontFamily = fontFamily; + } + + var width = ctx.measureText(textDiv.textContent).width; + if (width > 0) { + textLayerFrag.appendChild(textDiv); + var transform; + if (textDiv.dataset.canvasWidth !== undefined) { + // Dataset values come of type string. + var textScale = textDiv.dataset.canvasWidth / width; + transform = 'scaleX(' + textScale + ')'; + } else { + transform = ''; + } + var rotation = textDiv.dataset.angle; + if (rotation) { + transform = 'rotate(' + rotation + 'deg) ' + transform; + } + if (transform) { + CustomStyle.setProp('transform' , textDiv, transform); + } + } + } + + this.textLayerDiv.appendChild(textLayerFrag); + this._finishRendering(); + this.updateMatches(); + }, + + /** + * Renders the text layer. + * @param {number} timeout (optional) if specified, the rendering waits + * for specified amount of ms. + */ + render: function TextLayerBuilder_render(timeout) { + if (!this.divContentDone || this.renderingDone) { + return; + } + + if (this.renderTimer) { + clearTimeout(this.renderTimer); + this.renderTimer = null; + } + + if (!timeout) { // Render right away + this.renderLayer(); + } else { // Schedule + var self = this; + this.renderTimer = setTimeout(function() { + self.renderLayer(); + self.renderTimer = null; + }, timeout); + } + }, + + appendText: function TextLayerBuilder_appendText(geom, styles) { + var style = styles[geom.fontName]; + var textDiv = document.createElement('div'); + this.textDivs.push(textDiv); + if (isAllWhitespace(geom.str)) { + textDiv.dataset.isWhitespace = true; + return; + } + var tx = PDFJS.Util.transform(this.viewport.transform, geom.transform); + var angle = Math.atan2(tx[1], tx[0]); + if (style.vertical) { + angle += Math.PI / 2; + } + var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3])); + var fontAscent = fontHeight; + if (style.ascent) { + fontAscent = style.ascent * fontAscent; + } else if (style.descent) { + fontAscent = (1 + style.descent) * fontAscent; + } + + var left; + var top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + (fontAscent * Math.sin(angle)); + top = tx[5] - (fontAscent * Math.cos(angle)); + } + textDiv.style.left = left + 'px'; + textDiv.style.top = top + 'px'; + textDiv.style.fontSize = fontHeight + 'px'; + textDiv.style.fontFamily = style.fontFamily; + + textDiv.textContent = geom.str; + // |fontName| is only used by the Font Inspector. This test will succeed + // when e.g. the Font Inspector is off but the Stepper is on, but it's + // not worth the effort to do a more accurate test. + if (PDFJS.pdfBug) { + textDiv.dataset.fontName = geom.fontName; + } + // Storing into dataset will convert number into string. + if (angle !== 0) { + textDiv.dataset.angle = angle * (180 / Math.PI); + } + // We don't bother scaling single-char text divs, because it has very + // little effect on text highlighting. This makes scrolling on docs with + // lots of such divs a lot faster. + if (textDiv.textContent.length > 1) { + if (style.vertical) { + textDiv.dataset.canvasWidth = geom.height * this.viewport.scale; + } else { + textDiv.dataset.canvasWidth = geom.width * this.viewport.scale; + } + } + }, + + setTextContent: function TextLayerBuilder_setTextContent(textContent) { + this.textContent = textContent; + + var textItems = textContent.items; + for (var i = 0, len = textItems.length; i < len; i++) { + this.appendText(textItems[i], textContent.styles); + } + this.divContentDone = true; + }, + + convertMatches: function TextLayerBuilder_convertMatches(matches) { + var i = 0; + var iIndex = 0; + var bidiTexts = this.textContent.items; + var end = bidiTexts.length - 1; + var queryLen = (this.findController === null ? + 0 : this.findController.state.query.length); + var ret = []; + + for (var m = 0, len = matches.length; m < len; m++) { + // Calculate the start position. + var matchIdx = matches[m]; + + // Loop over the divIdxs. + while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) { + iIndex += bidiTexts[i].str.length; + i++; + } + + if (i === bidiTexts.length) { + console.error('Could not find a matching mapping'); + } + + var match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + + // Calculate the end position. + matchIdx += queryLen; + + // Somewhat the same array as above, but use > instead of >= to get + // the end position right. + while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) { + iIndex += bidiTexts[i].str.length; + i++; + } + + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + ret.push(match); + } + + return ret; + }, + + renderMatches: function TextLayerBuilder_renderMatches(matches) { + // Early exit if there is nothing to render. + if (matches.length === 0) { + return; + } + + var bidiTexts = this.textContent.items; + var textDivs = this.textDivs; + var prevEnd = null; + var pageIdx = this.pageIdx; + var isSelectedPage = (this.findController === null ? + false : (pageIdx === this.findController.selected.pageIdx)); + var selectedMatchIdx = (this.findController === null ? + -1 : this.findController.selected.matchIdx); + var highlightAll = (this.findController === null ? + false : this.findController.state.highlightAll); + var infinity = { + divIdx: -1, + offset: undefined + }; + + function beginText(begin, className) { + var divIdx = begin.divIdx; + textDivs[divIdx].textContent = ''; + appendTextToDiv(divIdx, 0, begin.offset, className); + } + + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + var div = textDivs[divIdx]; + var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset); + var node = document.createTextNode(content); + if (className) { + var span = document.createElement('span'); + span.className = className; + span.appendChild(node); + div.appendChild(span); + return; + } + div.appendChild(node); + } + + var i0 = selectedMatchIdx, i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + // Not highlighting all and this isn't the selected page, so do nothing. + return; + } + + for (var i = i0; i < i1; i++) { + var match = matches[i]; + var begin = match.begin; + var end = match.end; + var isSelected = (isSelectedPage && i === selectedMatchIdx); + var highlightSuffix = (isSelected ? ' selected' : ''); + + if (this.findController) { + this.findController.updateMatchPosition(pageIdx, i, textDivs, + begin.divIdx, end.divIdx); + } + + // Match inside new div. + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + // If there was a previous div, then add the text at the end. + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + // Clear the divs and set the content until the starting point. + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + + if (begin.divIdx === end.divIdx) { + appendTextToDiv(begin.divIdx, begin.offset, end.offset, + 'highlight' + highlightSuffix); + } else { + appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, + 'highlight begin' + highlightSuffix); + for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = 'highlight middle' + highlightSuffix; + } + beginText(end, 'highlight end' + highlightSuffix); + } + prevEnd = end; + } + + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + }, + + updateMatches: function TextLayerBuilder_updateMatches() { + // Only show matches when all rendering is done. + if (!this.renderingDone) { + return; + } + + // Clear all matches. + var matches = this.matches; + var textDivs = this.textDivs; + var bidiTexts = this.textContent.items; + var clearedUntilDivIdx = -1; + + // Clear all current matches. + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (var n = begin, end = match.end.divIdx; n <= end; n++) { + var div = textDivs[n]; + div.textContent = bidiTexts[n].str; + div.className = ''; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + + if (this.findController === null || !this.findController.active) { + return; + } + + // Convert the matches on the page controller into the match format + // used for the textLayer. + this.matches = this.convertMatches(this.findController === null ? + [] : (this.findController.pageMatches[this.pageIdx] || [])); + this.renderMatches(this.matches); + } + }; + return TextLayerBuilder; +})(); + +/** + * @constructor + * @implements IPDFTextLayerFactory + */ +function DefaultTextLayerFactory() {} +DefaultTextLayerFactory.prototype = { + /** + * @param {HTMLDivElement} textLayerDiv + * @param {number} pageIndex + * @param {PageViewport} viewport + * @returns {TextLayerBuilder} + */ + createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { + return new TextLayerBuilder({ + textLayerDiv: textLayerDiv, + pageIndex: pageIndex, + viewport: viewport + }); + } +}; + + +/** + * @typedef {Object} AnnotationsLayerBuilderOptions + * @property {HTMLDivElement} pageDiv + * @property {PDFPage} pdfPage + * @property {IPDFLinkService} linkService + */ + +/** + * @class + */ +var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { + /** + * @param {AnnotationsLayerBuilderOptions} options + * @constructs AnnotationsLayerBuilder + */ + function AnnotationsLayerBuilder(options) { + this.pageDiv = options.pageDiv; + this.pdfPage = options.pdfPage; + this.linkService = options.linkService; + + this.div = null; + } + AnnotationsLayerBuilder.prototype = + /** @lends AnnotationsLayerBuilder.prototype */ { + + /** + * @param {PageViewport} viewport + */ + setupAnnotations: + function AnnotationsLayerBuilder_setupAnnotations(viewport) { + function bindLink(link, dest) { + link.href = linkService.getDestinationHash(dest); + link.onclick = function annotationsLayerBuilderLinksOnclick() { + if (dest) { + linkService.navigateTo(dest); + } + return false; + }; + if (dest) { + link.className = 'internalLink'; + } + } + + function bindNamedAction(link, action) { + link.href = linkService.getAnchorUrl(''); + link.onclick = function annotationsLayerBuilderNamedActionOnClick() { + linkService.executeNamedAction(action); + return false; + }; + link.className = 'internalLink'; + } + + var linkService = this.linkService; + var pdfPage = this.pdfPage; + var self = this; + + pdfPage.getAnnotations().then(function (annotationsData) { + viewport = viewport.clone({ dontFlip: true }); + var transform = viewport.transform; + var transformStr = 'matrix(' + transform.join(',') + ')'; + var data, element, i, ii; + + if (self.div) { + // If an annotationLayer already exists, refresh its children's + // transformation matrices + for (i = 0, ii = annotationsData.length; i < ii; i++) { + data = annotationsData[i]; + element = self.div.querySelector( + '[data-annotation-id="' + data.id + '"]'); + if (element) { + CustomStyle.setProp('transform', element, transformStr); + } + } + // See PDFPageView.reset() + self.div.removeAttribute('hidden'); + } else { + for (i = 0, ii = annotationsData.length; i < ii; i++) { + data = annotationsData[i]; + if (!data || !data.hasHtml) { + continue; + } + + element = PDFJS.AnnotationUtils.getHtmlElement(data, + pdfPage.commonObjs); + element.setAttribute('data-annotation-id', data.id); + if (typeof mozL10n !== 'undefined') { + mozL10n.translate(element); + } + + var rect = data.rect; + var view = pdfPage.view; + rect = PDFJS.Util.normalizeRect([ + rect[0], + view[3] - rect[1] + view[1], + rect[2], + view[3] - rect[3] + view[1] + ]); + element.style.left = rect[0] + 'px'; + element.style.top = rect[1] + 'px'; + element.style.position = 'absolute'; + + CustomStyle.setProp('transform', element, transformStr); + var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px'; + CustomStyle.setProp('transformOrigin', element, transformOriginStr); + + if (data.subtype === 'Link' && !data.url) { + var link = element.getElementsByTagName('a')[0]; + if (link) { + if (data.action) { + bindNamedAction(link, data.action); + } else { + bindLink(link, ('dest' in data) ? data.dest : null); + } + } + } + + if (!self.div) { + var annotationLayerDiv = document.createElement('div'); + annotationLayerDiv.className = 'annotationLayer'; + self.pageDiv.appendChild(annotationLayerDiv); + self.div = annotationLayerDiv; + } + + self.div.appendChild(element); + } + } + }); + }, + + hide: function () { + if (!this.div) { + return; + } + this.div.setAttribute('hidden', 'true'); + } + }; + return AnnotationsLayerBuilder; +})(); + +/** + * @constructor + * @implements IPDFAnnotationsLayerFactory + */ +function DefaultAnnotationsLayerFactory() {} +DefaultAnnotationsLayerFactory.prototype = { + /** + * @param {HTMLDivElement} pageDiv + * @param {PDFPage} pdfPage + * @returns {AnnotationsLayerBuilder} + */ + createAnnotationsLayerBuilder: function (pageDiv, pdfPage) { + return new AnnotationsLayerBuilder({ + pageDiv: pageDiv, + pdfPage: pdfPage + }); + } +}; + + +/** + * @typedef {Object} PDFViewerOptions + * @property {HTMLDivElement} container - The container for the viewer element. + * @property {HTMLDivElement} viewer - (optional) The viewer element. + * @property {IPDFLinkService} linkService - The navigation/linking service. + * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering + * queue object. + * @property {boolean} removePageBorders - (optional) Removes the border shadow + * around the pages. The default is false. + */ + +/** + * Simple viewer control to display PDF content/pages. + * @class + * @implements {IRenderableView} + */ +var PDFViewer = (function pdfViewer() { + function PDFPageViewBuffer(size) { + var data = []; + this.push = function cachePush(view) { + var i = data.indexOf(view); + if (i >= 0) { + data.splice(i, 1); + } + data.push(view); + if (data.length > size) { + data.shift().destroy(); + } + }; + this.resize = function (newSize) { + size = newSize; + while (data.length > size) { + data.shift().destroy(); + } + }; + } + + /** + * @constructs PDFViewer + * @param {PDFViewerOptions} options + */ + function PDFViewer(options) { + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + this.linkService = options.linkService || new SimpleLinkService(this); + this.removePageBorders = options.removePageBorders || false; + + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + // Custom rendering queue is not specified, using default one + this.renderingQueue = new PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); + this.updateInProgress = false; + this.presentationModeState = PresentationModeState.UNKNOWN; + this._resetView(); + + if (this.removePageBorders) { + this.viewer.classList.add('removePageBorders'); + } + } + + PDFViewer.prototype = /** @lends PDFViewer.prototype */{ + get pagesCount() { + return this._pages.length; + }, + + getPageView: function (index) { + return this._pages[index]; + }, + + get currentPageNumber() { + return this._currentPageNumber; + }, + + set currentPageNumber(val) { + if (!this.pdfDocument) { + this._currentPageNumber = val; + return; + } + + var event = document.createEvent('UIEvents'); + event.initUIEvent('pagechange', true, true, window, 0); + event.updateInProgress = this.updateInProgress; + + if (!(0 < val && val <= this.pagesCount)) { + event.pageNumber = this._currentPageNumber; + event.previousPageNumber = val; + this.container.dispatchEvent(event); + return; + } + + event.previousPageNumber = this._currentPageNumber; + this._currentPageNumber = val; + event.pageNumber = val; + this.container.dispatchEvent(event); + }, + + /** + * @returns {number} + */ + get currentScale() { + return this._currentScale; + }, + + /** + * @param {number} val - Scale of the pages in percents. + */ + set currentScale(val) { + if (isNaN(val)) { + throw new Error('Invalid numeric scale'); + } + if (!this.pdfDocument) { + this._currentScale = val; + this._currentScaleValue = val.toString(); + return; + } + this._setScale(val, false); + }, + + /** + * @returns {string} + */ + get currentScaleValue() { + return this._currentScaleValue; + }, + + /** + * @param val - The scale of the pages (in percent or predefined value). + */ + set currentScaleValue(val) { + if (!this.pdfDocument) { + this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val; + this._currentScaleValue = val; + return; + } + this._setScale(val, false); + }, + + /** + * @returns {number} + */ + get pagesRotation() { + return this._pagesRotation; + }, + + /** + * @param {number} rotation - The rotation of the pages (0, 90, 180, 270). + */ + set pagesRotation(rotation) { + this._pagesRotation = rotation; + + for (var i = 0, l = this._pages.length; i < l; i++) { + var pageView = this._pages[i]; + pageView.update(pageView.scale, rotation); + } + + this._setScale(this._currentScaleValue, true); + }, + + /** + * @param pdfDocument {PDFDocument} + */ + setDocument: function (pdfDocument) { + if (this.pdfDocument) { + this._resetView(); + } + + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + + var pagesCount = pdfDocument.numPages; + var pagesRefMap = this.pagesRefMap = {}; + var self = this; + + var resolvePagesPromise; + var pagesPromise = new Promise(function (resolve) { + resolvePagesPromise = resolve; + }); + this.pagesPromise = pagesPromise; + pagesPromise.then(function () { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagesloaded', true, true, { + pagesCount: pagesCount + }); + self.container.dispatchEvent(event); + }); + + var isOnePageRenderedResolved = false; + var resolveOnePageRendered = null; + var onePageRendered = new Promise(function (resolve) { + resolveOnePageRendered = resolve; + }); + this.onePageRendered = onePageRendered; + + var bindOnAfterAndBeforeDraw = function (pageView) { + pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { + // Add the page to the buffer at the start of drawing. That way it can + // be evicted from the buffer and destroyed even if we pause its + // rendering. + self._buffer.push(this); + }; + // when page is painted, using the image as thumbnail base + pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { + if (!isOnePageRenderedResolved) { + isOnePageRenderedResolved = true; + resolveOnePageRendered(); + } + }; + }; + + var firstPagePromise = pdfDocument.getPage(1); + this.firstPagePromise = firstPagePromise; + + // Fetch a single page so we can get a viewport that will be the default + // viewport for all pages + return firstPagePromise.then(function(pdfPage) { + var scale = this._currentScale || 1.0; + var viewport = pdfPage.getViewport(scale * CSS_UNITS); + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + var textLayerFactory = null; + if (!PDFJS.disableTextLayer) { + textLayerFactory = this; + } + var pageView = new PDFPageView({ + container: this.viewer, + id: pageNum, + scale: scale, + defaultViewport: viewport.clone(), + renderingQueue: this.renderingQueue, + textLayerFactory: textLayerFactory, + annotationsLayerFactory: this + }); + bindOnAfterAndBeforeDraw(pageView); + this._pages.push(pageView); + } + + // Fetch all the pages since the viewport is needed before printing + // starts to create the correct size canvas. Wait until one page is + // rendered so we don't tie up too many resources early on. + onePageRendered.then(function () { + if (!PDFJS.disableAutoFetch) { + var getPagesLeft = pagesCount; + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) { + var pageView = self._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + var refStr = pdfPage.ref.num + ' ' + pdfPage.ref.gen + ' R'; + pagesRefMap[refStr] = pageNum; + getPagesLeft--; + if (!getPagesLeft) { + resolvePagesPromise(); + } + }.bind(null, pageNum)); + } + } else { + // XXX: Printing is semi-broken with auto fetch disabled. + resolvePagesPromise(); + } + }); + + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagesinit', true, true, null); + self.container.dispatchEvent(event); + + if (this.defaultRenderingQueue) { + this.update(); + } + + if (this.findController) { + this.findController.resolveFirstPage(); + } + }.bind(this)); + }, + + _resetView: function () { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = UNKNOWN_SCALE; + this._currentScaleValue = null; + this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._pagesRequests = []; + + var container = this.viewer; + while (container.hasChildNodes()) { + container.removeChild(container.lastChild); + } + }, + + _scrollUpdate: function () { + if (this.pagesCount === 0) { + return; + } + this.update(); + for (var i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].updatePosition(); + } + }, + + _setScaleDispatchEvent: function pdfViewer_setScaleDispatchEvent( + newScale, newValue, preset) { + var event = document.createEvent('UIEvents'); + event.initUIEvent('scalechange', true, true, window, 0); + event.scale = newScale; + if (preset) { + event.presetValue = newValue; + } + this.container.dispatchEvent(event); + }, + + _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages( + newScale, newValue, noScroll, preset) { + this._currentScaleValue = newValue; + if (newScale === this._currentScale) { + if (preset) { + this._setScaleDispatchEvent(newScale, newValue, true); + } + return; + } + + for (var i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].update(newScale); + } + this._currentScale = newScale; + + if (!noScroll) { + var page = this._currentPageNumber, dest; + if (this._location && !IGNORE_CURRENT_POSITION_ON_ZOOM && + !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [null, { name: 'XYZ' }, this._location.left, + this._location.top, null]; + } + this.scrollPageIntoView(page, dest); + } + + this._setScaleDispatchEvent(newScale, newValue, preset); + }, + + _setScale: function pdfViewer_setScale(value, noScroll) { + if (value === 'custom') { + return; + } + var scale = parseFloat(value); + + if (scale > 0) { + this._setScaleUpdatePages(scale, value, noScroll, false); + } else { + var currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + var hPadding = (this.isInPresentationMode || this.removePageBorders) ? + 0 : SCROLLBAR_PADDING; + var vPadding = (this.isInPresentationMode || this.removePageBorders) ? + 0 : VERTICAL_PADDING; + var pageWidthScale = (this.container.clientWidth - hPadding) / + currentPage.width * currentPage.scale; + var pageHeightScale = (this.container.clientHeight - vPadding) / + currentPage.height * currentPage.scale; + switch (value) { + case 'page-actual': + scale = 1; + break; + case 'page-width': + scale = pageWidthScale; + break; + case 'page-height': + scale = pageHeightScale; + break; + case 'page-fit': + scale = Math.min(pageWidthScale, pageHeightScale); + break; + case 'auto': + var isLandscape = (currentPage.width > currentPage.height); + // For pages in landscape mode, fit the page height to the viewer + // *unless* the page would thus become too wide to fit horizontally. + var horizontalScale = isLandscape ? + Math.min(pageHeightScale, pageWidthScale) : pageWidthScale; + scale = Math.min(MAX_AUTO_SCALE, horizontalScale); + break; + default: + console.error('pdfViewSetScale: \'' + value + + '\' is an unknown zoom value.'); + return; + } + this._setScaleUpdatePages(scale, value, noScroll, true); + } + }, + + /** + * Scrolls page into view. + * @param {number} pageNumber + * @param {Array} dest - (optional) original PDF destination array: + * + */ + scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber, + dest) { + var pageView = this._pages[pageNumber - 1]; + + if (this.isInPresentationMode) { + if (this.linkService.page !== pageView.id) { + // Avoid breaking getVisiblePages in presentation mode. + this.linkService.page = pageView.id; + return; + } + dest = null; + // Fixes the case when PDF has different page sizes. + this._setScale(this.currentScaleValue, true); + } + if (!dest) { + scrollIntoView(pageView.div); + return; + } + + var x = 0, y = 0; + var width = 0, height = 0, widthScale, heightScale; + var changeOrientation = (pageView.rotation % 180 === 0 ? false : true); + var pageWidth = (changeOrientation ? pageView.height : pageView.width) / + pageView.scale / CSS_UNITS; + var pageHeight = (changeOrientation ? pageView.width : pageView.height) / + pageView.scale / CSS_UNITS; + var scale = 0; + switch (dest[1].name) { + case 'XYZ': + x = dest[2]; + y = dest[3]; + scale = dest[4]; + // If x and/or y coordinates are not supplied, default to + // _top_ left of the page (not the obvious bottom left, + // since aligning the bottom of the intended page with the + // top of the window is rarely helpful). + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case 'Fit': + case 'FitB': + scale = 'page-fit'; + break; + case 'FitH': + case 'FitBH': + y = dest[2]; + scale = 'page-width'; + break; + case 'FitV': + case 'FitBV': + x = dest[2]; + width = pageWidth; + height = pageHeight; + scale = 'page-height'; + break; + case 'FitR': + x = dest[2]; + y = dest[3]; + width = dest[4] - x; + height = dest[5] - y; + var viewerContainer = this.container; + var hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING; + var vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING; + + widthScale = (viewerContainer.clientWidth - hPadding) / + width / CSS_UNITS; + heightScale = (viewerContainer.clientHeight - vPadding) / + height / CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + return; + } + + if (scale && scale !== this.currentScale) { + this.currentScaleValue = scale; + } else if (this.currentScale === UNKNOWN_SCALE) { + this.currentScaleValue = DEFAULT_SCALE; + } + + if (scale === 'page-fit' && !dest[4]) { + scrollIntoView(pageView.div); + return; + } + + var boundingRect = [ + pageView.viewport.convertToViewportPoint(x, y), + pageView.viewport.convertToViewportPoint(x + width, y + height) + ]; + var left = Math.min(boundingRect[0][0], boundingRect[1][0]); + var top = Math.min(boundingRect[0][1], boundingRect[1][1]); + + scrollIntoView(pageView.div, { left: left, top: top }); + }, + + _updateLocation: function (firstPage) { + var currentScale = this._currentScale; + var currentScaleValue = this._currentScaleValue; + var normalizedScaleValue = + parseFloat(currentScaleValue) === currentScale ? + Math.round(currentScale * 10000) / 100 : currentScaleValue; + + var pageNumber = firstPage.id; + var pdfOpenParams = '#page=' + pageNumber; + pdfOpenParams += '&zoom=' + normalizedScaleValue; + var currentPageView = this._pages[pageNumber - 1]; + var container = this.container; + var topLeft = currentPageView.getPagePoint( + (container.scrollLeft - firstPage.x), + (container.scrollTop - firstPage.y)); + var intLeft = Math.round(topLeft[0]); + var intTop = Math.round(topLeft[1]); + pdfOpenParams += ',' + intLeft + ',' + intTop; + + this._location = { + pageNumber: pageNumber, + scale: normalizedScaleValue, + top: intTop, + left: intLeft, + pdfOpenParams: pdfOpenParams + }; + }, + + update: function () { + var visible = this._getVisiblePages(); + var visiblePages = visible.views; + if (visiblePages.length === 0) { + return; + } + + this.updateInProgress = true; + + var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, + 2 * visiblePages.length + 1); + this._buffer.resize(suggestedCacheSize); + + this.renderingQueue.renderHighestPriority(visible); + + var currentId = this.currentPageNumber; + var firstPage = visible.first; + + for (var i = 0, ii = visiblePages.length, stillFullyVisible = false; + i < ii; ++i) { + var page = visiblePages[i]; + + if (page.percent < 100) { + break; + } + if (page.id === currentId) { + stillFullyVisible = true; + break; + } + } + + if (!stillFullyVisible) { + currentId = visiblePages[0].id; + } + + if (!this.isInPresentationMode) { + this.currentPageNumber = currentId; + } + + this._updateLocation(firstPage); + + this.updateInProgress = false; + + var event = document.createEvent('UIEvents'); + event.initUIEvent('updateviewarea', true, true, window, 0); + event.location = this._location; + this.container.dispatchEvent(event); + }, + + containsElement: function (element) { + return this.container.contains(element); + }, + + focus: function () { + this.container.focus(); + }, + + get isInPresentationMode() { + return this.presentationModeState === PresentationModeState.FULLSCREEN; + }, + + get isChangingPresentationMode() { + return this.PresentationModeState === PresentationModeState.CHANGING; + }, + + get isHorizontalScrollbarEnabled() { + return (this.isInPresentationMode ? + false : (this.container.scrollWidth > this.container.clientWidth)); + }, + + _getVisiblePages: function () { + if (!this.isInPresentationMode) { + return getVisibleElements(this.container, this._pages, true); + } else { + // The algorithm in getVisibleElements doesn't work in all browsers and + // configurations when presentation mode is active. + var visible = []; + var currentPage = this._pages[this._currentPageNumber - 1]; + visible.push({ id: currentPage.id, view: currentPage }); + return { first: currentPage, last: currentPage, views: visible }; + } + }, + + cleanup: function () { + for (var i = 0, ii = this._pages.length; i < ii; i++) { + if (this._pages[i] && + this._pages[i].renderingState !== RenderingStates.FINISHED) { + this._pages[i].reset(); + } + } + }, + + /** + * @param {PDFPageView} pageView + * @returns {PDFPage} + * @private + */ + _ensurePdfPageLoaded: function (pageView) { + if (pageView.pdfPage) { + return Promise.resolve(pageView.pdfPage); + } + var pageNumber = pageView.id; + if (this._pagesRequests[pageNumber]) { + return this._pagesRequests[pageNumber]; + } + var promise = this.pdfDocument.getPage(pageNumber).then( + function (pdfPage) { + pageView.setPdfPage(pdfPage); + this._pagesRequests[pageNumber] = null; + return pdfPage; + }.bind(this)); + this._pagesRequests[pageNumber] = promise; + return promise; + }, + + forceRendering: function (currentlyVisiblePages) { + var visiblePages = currentlyVisiblePages || this._getVisiblePages(); + var pageView = this.renderingQueue.getHighestPriority(visiblePages, + this._pages, + this.scroll.down); + if (pageView) { + this._ensurePdfPageLoaded(pageView).then(function () { + this.renderingQueue.renderView(pageView); + }.bind(this)); + return true; + } + return false; + }, + + getPageTextContent: function (pageIndex) { + return this.pdfDocument.getPage(pageIndex + 1).then(function (page) { + return page.getTextContent(); + }); + }, + + /** + * @param {HTMLDivElement} textLayerDiv + * @param {number} pageIndex + * @param {PageViewport} viewport + * @returns {TextLayerBuilder} + */ + createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { + return new TextLayerBuilder({ + textLayerDiv: textLayerDiv, + pageIndex: pageIndex, + viewport: viewport, + findController: this.isInPresentationMode ? null : this.findController + }); + }, + + /** + * @param {HTMLDivElement} pageDiv + * @param {PDFPage} pdfPage + * @returns {AnnotationsLayerBuilder} + */ + createAnnotationsLayerBuilder: function (pageDiv, pdfPage) { + return new AnnotationsLayerBuilder({ + pageDiv: pageDiv, + pdfPage: pdfPage, + linkService: this.linkService + }); + }, + + setFindController: function (findController) { + this.findController = findController; + }, + }; + + return PDFViewer; +})(); + +var SimpleLinkService = (function SimpleLinkServiceClosure() { + function SimpleLinkService(pdfViewer) { + this.pdfViewer = pdfViewer; + } + SimpleLinkService.prototype = { + /** + * @returns {number} + */ + get page() { + return this.pdfViewer.currentPageNumber; + }, + /** + * @param {number} value + */ + set page(value) { + this.pdfViewer.currentPageNumber = value; + }, + /** + * @param dest - The PDF destination object. + */ + navigateTo: function (dest) {}, + /** + * @param dest - The PDF destination object. + * @returns {string} The hyperlink to the PDF object. + */ + getDestinationHash: function (dest) { + return '#'; + }, + /** + * @param hash - The PDF parameters/hash. + * @returns {string} The hyperlink to the PDF object. + */ + getAnchorUrl: function (hash) { + return '#'; + }, + /** + * @param {string} hash + */ + setHash: function (hash) {}, + /** + * @param {string} action + */ + executeNamedAction: function (action) {}, + }; + return SimpleLinkService; +})(); + + +var THUMBNAIL_SCROLL_MARGIN = -19; + + +var THUMBNAIL_WIDTH = 98; // px +var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px + +/** + * @typedef {Object} PDFThumbnailViewOptions + * @property {HTMLDivElement} container - The viewer element. + * @property {number} id - The thumbnail's unique ID (normally its number). + * @property {PageViewport} defaultViewport - The page viewport. + * @property {IPDFLinkService} linkService - The navigation/linking service. + * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. + */ + +/** + * @class + * @implements {IRenderableView} + */ +var PDFThumbnailView = (function PDFThumbnailViewClosure() { + function getTempCanvas(width, height) { + var tempCanvas = PDFThumbnailView.tempImageCache; + if (!tempCanvas) { + tempCanvas = document.createElement('canvas'); + PDFThumbnailView.tempImageCache = tempCanvas; + } + tempCanvas.width = width; + tempCanvas.height = height; + + // Since this is a temporary canvas, we need to fill the canvas with a white + // background ourselves. |_getPageDrawContext| uses CSS rules for this. + var ctx = tempCanvas.getContext('2d'); + ctx.save(); + ctx.fillStyle = 'rgb(255, 255, 255)'; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return tempCanvas; + } + + /** + * @constructs PDFThumbnailView + * @param {PDFThumbnailViewOptions} options + */ + function PDFThumbnailView(options) { + var container = options.container; + var id = options.id; + var defaultViewport = options.defaultViewport; + var linkService = options.linkService; + var renderingQueue = options.renderingQueue; + + this.id = id; + this.renderingId = 'thumbnail' + id; + + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + + this.linkService = linkService; + this.renderingQueue = renderingQueue; + + this.hasImage = false; + this.resume = null; + this.renderingState = RenderingStates.INITIAL; + + this.pageWidth = this.viewport.width; + this.pageHeight = this.viewport.height; + this.pageRatio = this.pageWidth / this.pageHeight; + + this.canvasWidth = THUMBNAIL_WIDTH; + this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0; + this.scale = this.canvasWidth / this.pageWidth; + + var anchor = document.createElement('a'); + anchor.href = linkService.getAnchorUrl('#page=' + id); + anchor.title = mozL10n.get('thumb_page_title', {page: id}, 'Page {{page}}'); + anchor.onclick = function stopNavigation() { + linkService.page = id; + return false; + }; + + var div = document.createElement('div'); + div.id = 'thumbnailContainer' + id; + div.className = 'thumbnail'; + this.div = div; + + if (id === 1) { + // Highlight the thumbnail of the first page when no page number is + // specified (or exists in cache) when the document is loaded. + div.classList.add('selected'); + } + + var ring = document.createElement('div'); + ring.className = 'thumbnailSelectionRing'; + var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; + ring.style.width = this.canvasWidth + borderAdjustment + 'px'; + ring.style.height = this.canvasHeight + borderAdjustment + 'px'; + this.ring = ring; + + div.appendChild(ring); + anchor.appendChild(div); + container.appendChild(anchor); + } + + PDFThumbnailView.prototype = { + setPdfPage: function PDFThumbnailView_setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport(1, totalRotation); + this.reset(); + }, + + reset: function PDFThumbnailView_reset() { + if (this.renderTask) { + this.renderTask.cancel(); + } + this.hasImage = false; + this.resume = null; + this.renderingState = RenderingStates.INITIAL; + + this.pageWidth = this.viewport.width; + this.pageHeight = this.viewport.height; + this.pageRatio = this.pageWidth / this.pageHeight; + + this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0; + this.scale = (this.canvasWidth / this.pageWidth); + + this.div.removeAttribute('data-loaded'); + var ring = this.ring; + var childNodes = ring.childNodes; + for (var i = childNodes.length - 1; i >= 0; i--) { + ring.removeChild(childNodes[i]); + } + var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; + ring.style.width = this.canvasWidth + borderAdjustment + 'px'; + ring.style.height = this.canvasHeight + borderAdjustment + 'px'; + + if (this.canvas) { + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + }, + + update: function PDFThumbnailView_update(rotation) { + if (typeof rotation !== 'undefined') { + this.rotation = rotation; + } + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + }, + + /** + * @private + */ + _getPageDrawContext: + function PDFThumbnailView_getPageDrawContext(noCtxScale) { + var canvas = document.createElement('canvas'); + canvas.id = this.renderingId; + + canvas.className = 'thumbnailImage'; + canvas.setAttribute('aria-label', mozL10n.get('thumb_page_canvas', + {page: this.id}, 'Thumbnail of Page {{page}}')); + + this.canvas = canvas; + this.div.setAttribute('data-loaded', true); + this.ring.appendChild(canvas); + + var ctx = canvas.getContext('2d'); + var outputScale = getOutputScale(ctx); + canvas.width = (this.canvasWidth * outputScale.sx) | 0; + canvas.height = (this.canvasHeight * outputScale.sy) | 0; + canvas.style.width = this.canvasWidth + 'px'; + canvas.style.height = this.canvasHeight + 'px'; + if (!noCtxScale && outputScale.scaled) { + ctx.scale(outputScale.sx, outputScale.sy); + } + return ctx; + }, + + draw: function PDFThumbnailView_draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error('Must be in new state before drawing'); + } + if (this.hasImage) { + return Promise.resolve(undefined); + } + this.hasImage = true; + this.renderingState = RenderingStates.RUNNING; + + var resolveRenderPromise, rejectRenderPromise; + var promise = new Promise(function (resolve, reject) { + resolveRenderPromise = resolve; + rejectRenderPromise = reject; + }); + + var self = this; + function thumbnailDrawCallback(error) { + // The renderTask may have been replaced by a new one, so only remove + // the reference to the renderTask if it matches the one that is + // triggering this callback. + if (renderTask === self.renderTask) { + self.renderTask = null; + } + if (error === 'cancelled') { + rejectRenderPromise(error); + return; + } + self.renderingState = RenderingStates.FINISHED; + + if (!error) { + resolveRenderPromise(undefined); + } else { + rejectRenderPromise(error); + } + } + + var ctx = this._getPageDrawContext(); + var drawViewport = this.viewport.clone({ scale: this.scale }); + var renderContinueCallback = function renderContinueCallback(cont) { + if (!self.renderingQueue.isHighestPriority(self)) { + self.renderingState = RenderingStates.PAUSED; + self.resume = function resumeCallback() { + self.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + + var renderContext = { + canvasContext: ctx, + viewport: drawViewport, + continueCallback: renderContinueCallback + }; + var renderTask = this.renderTask = this.pdfPage.render(renderContext); + + renderTask.promise.then( + function pdfPageRenderCallback() { + thumbnailDrawCallback(null); + }, + function pdfPageRenderError(error) { + thumbnailDrawCallback(error); + } + ); + return promise; + }, + + setImage: function PDFThumbnailView_setImage(pageView) { + var img = pageView.canvas; + if (this.hasImage || !img) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pageView.pdfPage); + } + this.hasImage = true; + this.renderingState = RenderingStates.FINISHED; + + var ctx = this._getPageDrawContext(true); + var canvas = ctx.canvas; + + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, + 0, 0, canvas.width, canvas.height); + return; + } + // drawImage does an awful job of rescaling the image, doing it gradually. + var MAX_NUM_SCALING_STEPS = 3; + var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; + var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; + var reducedImage = getTempCanvas(reducedWidth, reducedHeight); + var reducedImageCtx = reducedImage.getContext('2d'); + + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, + 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, + 0, 0, reducedWidth, reducedHeight, + 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, + 0, 0, canvas.width, canvas.height); + } + }; + + return PDFThumbnailView; +})(); + +PDFThumbnailView.tempImageCache = null; + + +/** + * @typedef {Object} PDFThumbnailViewerOptions + * @property {HTMLDivElement} container - The container for the thumbnail + * elements. + * @property {IPDFLinkService} linkService - The navigation/linking service. + * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. + */ + +/** + * Simple viewer control to display thumbnails for pages. + * @class + * @implements {IRenderableView} + */ +var PDFThumbnailViewer = (function PDFThumbnailViewerClosure() { + /** + * @constructs PDFThumbnailViewer + * @param {PDFThumbnailViewerOptions} options + */ + function PDFThumbnailViewer(options) { + this.container = options.container; + this.renderingQueue = options.renderingQueue; + this.linkService = options.linkService; + + this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this)); + this._resetView(); + } + + PDFThumbnailViewer.prototype = { + /** + * @private + */ + _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + }, + + getThumbnail: function PDFThumbnailViewer_getThumbnail(index) { + return this.thumbnails[index]; + }, + + /** + * @private + */ + _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() { + return getVisibleElements(this.container, this.thumbnails); + }, + + scrollThumbnailIntoView: + function PDFThumbnailViewer_scrollThumbnailIntoView(page) { + var selected = document.querySelector('.thumbnail.selected'); + if (selected) { + selected.classList.remove('selected'); + } + var thumbnail = document.getElementById('thumbnailContainer' + page); + if (thumbnail) { + thumbnail.classList.add('selected'); + } + var visibleThumbs = this._getVisibleThumbs(); + var numVisibleThumbs = visibleThumbs.views.length; + + // If the thumbnail isn't currently visible, scroll it into view. + if (numVisibleThumbs > 0) { + var first = visibleThumbs.first.id; + // Account for only one thumbnail being visible. + var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first); + if (page <= first || page >= last) { + scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN }); + } + } + }, + + get pagesRotation() { + return this._pagesRotation; + }, + + set pagesRotation(rotation) { + this._pagesRotation = rotation; + for (var i = 0, l = this.thumbnails.length; i < l; i++) { + var thumb = this.thumbnails[i]; + thumb.update(rotation); + } + }, + + cleanup: function PDFThumbnailViewer_cleanup() { + var tempCanvas = PDFThumbnailView.tempImageCache; + if (tempCanvas) { + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + tempCanvas.width = 0; + tempCanvas.height = 0; + } + PDFThumbnailView.tempImageCache = null; + }, + + /** + * @private + */ + _resetView: function PDFThumbnailViewer_resetView() { + this.thumbnails = []; + this._pagesRotation = 0; + this._pagesRequests = []; + }, + + setDocument: function PDFThumbnailViewer_setDocument(pdfDocument) { + if (this.pdfDocument) { + // cleanup of the elements and views + var thumbsView = this.container; + while (thumbsView.hasChildNodes()) { + thumbsView.removeChild(thumbsView.lastChild); + } + this._resetView(); + } + + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return Promise.resolve(); + } + + return pdfDocument.getPage(1).then(function (firstPage) { + var pagesCount = pdfDocument.numPages; + var viewport = firstPage.getViewport(1.0); + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + var thumbnail = new PDFThumbnailView({ + container: this.container, + id: pageNum, + defaultViewport: viewport.clone(), + linkService: this.linkService, + renderingQueue: this.renderingQueue + }); + this.thumbnails.push(thumbnail); + } + }.bind(this)); + }, + + /** + * @param {PDFPageView} pageView + * @returns {PDFPage} + * @private + */ + _ensurePdfPageLoaded: + function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return Promise.resolve(thumbView.pdfPage); + } + var pageNumber = thumbView.id; + if (this._pagesRequests[pageNumber]) { + return this._pagesRequests[pageNumber]; + } + var promise = this.pdfDocument.getPage(pageNumber).then( + function (pdfPage) { + thumbView.setPdfPage(pdfPage); + this._pagesRequests[pageNumber] = null; + return pdfPage; + }.bind(this)); + this._pagesRequests[pageNumber] = promise; + return promise; + }, + + ensureThumbnailVisible: + function PDFThumbnailViewer_ensureThumbnailVisible(page) { + // Ensure that the thumbnail of the current page is visible + // when switching from another view. + scrollIntoView(document.getElementById('thumbnailContainer' + page)); + }, + + forceRendering: function () { + var visibleThumbs = this._getVisibleThumbs(); + var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, + this.thumbnails, + this.scroll.down); + if (thumbView) { + this._ensurePdfPageLoaded(thumbView).then(function () { + this.renderingQueue.renderView(thumbView); + }.bind(this)); + return true; + } + return false; + } + }; + + return PDFThumbnailViewer; +})(); + + +/** + * @typedef {Object} PDFOutlineViewOptions + * @property {HTMLDivElement} container - The viewer element. + * @property {Array} outline - An array of outline objects. + * @property {IPDFLinkService} linkService - The navigation/linking service. + */ + +/** + * @class + */ +var PDFOutlineView = (function PDFOutlineViewClosure() { + /** + * @constructs PDFOutlineView + * @param {PDFOutlineViewOptions} options + */ + function PDFOutlineView(options) { + this.container = options.container; + this.outline = options.outline; + this.linkService = options.linkService; + } + + PDFOutlineView.prototype = { + reset: function PDFOutlineView_reset() { + var container = this.container; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + }, + + /** + * @private + */ + _dispatchEvent: function PDFOutlineView_dispatchEvent(outlineCount) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('outlineloaded', true, true, { + outlineCount: outlineCount + }); + this.container.dispatchEvent(event); + }, + + /** + * @private + */ + _bindLink: function PDFOutlineView_bindLink(element, item) { + var linkService = this.linkService; + element.href = linkService.getDestinationHash(item.dest); + element.onclick = function goToDestination(e) { + linkService.navigateTo(item.dest); + return false; + }; + }, + + render: function PDFOutlineView_render() { + var outline = this.outline; + var outlineCount = 0; + + this.reset(); + + if (!outline) { + this._dispatchEvent(outlineCount); + return; + } + + var queue = [{ parent: this.container, items: this.outline }]; + while (queue.length > 0) { + var levelData = queue.shift(); + for (var i = 0, len = levelData.items.length; i < len; i++) { + var item = levelData.items[i]; + var div = document.createElement('div'); + div.className = 'outlineItem'; + var element = document.createElement('a'); + this._bindLink(element, item); + element.textContent = item.title; + div.appendChild(element); + + if (item.items.length > 0) { + var itemsDiv = document.createElement('div'); + itemsDiv.className = 'outlineItems'; + div.appendChild(itemsDiv); + queue.push({ parent: itemsDiv, items: item.items }); + } + + levelData.parent.appendChild(div); + outlineCount++; + } + } + + this._dispatchEvent(outlineCount); + } + }; + + return PDFOutlineView; +})(); + + +/** + * @typedef {Object} PDFAttachmentViewOptions + * @property {HTMLDivElement} container - The viewer element. + * @property {Array} attachments - An array of attachment objects. + * @property {DownloadManager} downloadManager - The download manager. + */ + +/** + * @class + */ +var PDFAttachmentView = (function PDFAttachmentViewClosure() { + /** + * @constructs PDFAttachmentView + * @param {PDFAttachmentViewOptions} options + */ + function PDFAttachmentView(options) { + this.container = options.container; + this.attachments = options.attachments; + this.downloadManager = options.downloadManager; + } + + PDFAttachmentView.prototype = { + reset: function PDFAttachmentView_reset() { + var container = this.container; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + }, + + /** + * @private + */ + _dispatchEvent: function PDFAttachmentView_dispatchEvent(attachmentsCount) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('attachmentsloaded', true, true, { + attachmentsCount: attachmentsCount + }); + this.container.dispatchEvent(event); + }, + + /** + * @private + */ + _bindLink: function PDFAttachmentView_bindLink(button, content, filename) { + button.onclick = function downloadFile(e) { + this.downloadManager.downloadData(content, filename, ''); + return false; + }.bind(this); + }, + + render: function PDFAttachmentView_render() { + var attachments = this.attachments; + var attachmentsCount = 0; + + this.reset(); + + if (!attachments) { + this._dispatchEvent(attachmentsCount); + return; + } + + var names = Object.keys(attachments).sort(function(a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }); + attachmentsCount = names.length; + + for (var i = 0; i < attachmentsCount; i++) { + var item = attachments[names[i]]; + var filename = getFileName(item.filename); + var div = document.createElement('div'); + div.className = 'attachmentsItem'; + var button = document.createElement('button'); + this._bindLink(button, item.content, filename); + button.textContent = filename; + div.appendChild(button); + this.container.appendChild(div); + } + + this._dispatchEvent(attachmentsCount); + } + }; + + return PDFAttachmentView; +})(); + + +var PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + initialized: false, + fellback: false, + pdfDocument: null, + sidebarOpen: false, + printing: false, + /** @type {PDFViewer} */ + pdfViewer: null, + /** @type {PDFThumbnailViewer} */ + pdfThumbnailViewer: null, + /** @type {PDFRenderingQueue} */ + pdfRenderingQueue: null, + /** @type {PDFPresentationMode} */ + pdfPresentationMode: null, + /** @type {PDFDocumentProperties} */ + pdfDocumentProperties: null, + pageRotation: 0, + updateScaleControls: true, + isInitialViewSet: false, + animationStartedPromise: null, + preferenceSidebarViewOnLoad: SidebarView.NONE, + preferencePdfBugEnabled: false, + preferenceShowPreviousViewOnLoad: true, + preferenceDefaultZoomValue: '', + isViewerEmbedded: (window.parent !== window), + url: '', + + // called once when the document is loaded + initialize: function pdfViewInitialize() { + var pdfRenderingQueue = new PDFRenderingQueue(); + pdfRenderingQueue.onIdle = this.cleanup.bind(this); + this.pdfRenderingQueue = pdfRenderingQueue; + + var container = document.getElementById('viewerContainer'); + var viewer = document.getElementById('viewer'); + this.pdfViewer = new PDFViewer({ + container: container, + viewer: viewer, + renderingQueue: pdfRenderingQueue, + linkService: this + }); + pdfRenderingQueue.setViewer(this.pdfViewer); + + var thumbnailContainer = document.getElementById('thumbnailView'); + this.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: thumbnailContainer, + renderingQueue: pdfRenderingQueue, + linkService: this + }); + pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + + Preferences.initialize(); + + this.findController = new PDFFindController({ + pdfViewer: this.pdfViewer, + integratedFind: this.supportsIntegratedFind + }); + this.pdfViewer.setFindController(this.findController); + + this.findBar = new PDFFindBar({ + bar: document.getElementById('findbar'), + toggleButton: document.getElementById('viewFind'), + findField: document.getElementById('findInput'), + highlightAllCheckbox: document.getElementById('findHighlightAll'), + caseSensitiveCheckbox: document.getElementById('findMatchCase'), + findMsg: document.getElementById('findMsg'), + findStatusIcon: document.getElementById('findStatusIcon'), + findPreviousButton: document.getElementById('findPrevious'), + findNextButton: document.getElementById('findNext'), + findController: this.findController + }); + + this.findController.setFindBar(this.findBar); + + HandTool.initialize({ + container: container, + toggleHandTool: document.getElementById('toggleHandTool') + }); + + this.pdfDocumentProperties = new PDFDocumentProperties({ + overlayName: 'documentPropertiesOverlay', + closeButton: document.getElementById('documentPropertiesClose'), + fields: { + 'fileName': document.getElementById('fileNameField'), + 'fileSize': document.getElementById('fileSizeField'), + 'title': document.getElementById('titleField'), + 'author': document.getElementById('authorField'), + 'subject': document.getElementById('subjectField'), + 'keywords': document.getElementById('keywordsField'), + 'creationDate': document.getElementById('creationDateField'), + 'modificationDate': document.getElementById('modificationDateField'), + 'creator': document.getElementById('creatorField'), + 'producer': document.getElementById('producerField'), + 'version': document.getElementById('versionField'), + 'pageCount': document.getElementById('pageCountField') + } + }); + + SecondaryToolbar.initialize({ + toolbar: document.getElementById('secondaryToolbar'), + toggleButton: document.getElementById('secondaryToolbarToggle'), + presentationModeButton: + document.getElementById('secondaryPresentationMode'), + openFile: document.getElementById('secondaryOpenFile'), + print: document.getElementById('secondaryPrint'), + download: document.getElementById('secondaryDownload'), + viewBookmark: document.getElementById('secondaryViewBookmark'), + firstPage: document.getElementById('firstPage'), + lastPage: document.getElementById('lastPage'), + pageRotateCw: document.getElementById('pageRotateCw'), + pageRotateCcw: document.getElementById('pageRotateCcw'), + documentPropertiesButton: document.getElementById('documentProperties') + }); + + if (this.supportsFullscreen) { + var toolbar = SecondaryToolbar; + this.pdfPresentationMode = new PDFPresentationMode({ + container: container, + viewer: viewer, + pdfThumbnailViewer: this.pdfThumbnailViewer, + contextMenuItems: [ + { element: document.getElementById('contextFirstPage'), + handler: toolbar.firstPageClick.bind(toolbar) }, + { element: document.getElementById('contextLastPage'), + handler: toolbar.lastPageClick.bind(toolbar) }, + { element: document.getElementById('contextPageRotateCw'), + handler: toolbar.pageRotateCwClick.bind(toolbar) }, + { element: document.getElementById('contextPageRotateCcw'), + handler: toolbar.pageRotateCcwClick.bind(toolbar) } + ] + }); + } + + PasswordPrompt.initialize({ + overlayName: 'passwordOverlay', + passwordField: document.getElementById('password'), + passwordText: document.getElementById('passwordText'), + passwordSubmit: document.getElementById('passwordSubmit'), + passwordCancel: document.getElementById('passwordCancel') + }); + + var self = this; + var initializedPromise = Promise.all([ + Preferences.get('enableWebGL').then(function resolved(value) { + PDFJS.disableWebGL = !value; + }), + Preferences.get('sidebarViewOnLoad').then(function resolved(value) { + self.preferenceSidebarViewOnLoad = value; + }), + Preferences.get('pdfBugEnabled').then(function resolved(value) { + self.preferencePdfBugEnabled = value; + }), + Preferences.get('showPreviousViewOnLoad').then(function resolved(value) { + self.preferenceShowPreviousViewOnLoad = value; + }), + Preferences.get('defaultZoomValue').then(function resolved(value) { + self.preferenceDefaultZoomValue = value; + }), + Preferences.get('disableTextLayer').then(function resolved(value) { + if (PDFJS.disableTextLayer === true) { + return; + } + PDFJS.disableTextLayer = value; + }), + Preferences.get('disableRange').then(function resolved(value) { + if (PDFJS.disableRange === true) { + return; + } + PDFJS.disableRange = value; + }), + Preferences.get('disableAutoFetch').then(function resolved(value) { + PDFJS.disableAutoFetch = value; + }), + Preferences.get('disableFontFace').then(function resolved(value) { + if (PDFJS.disableFontFace === true) { + return; + } + PDFJS.disableFontFace = value; + }), + Preferences.get('useOnlyCssZoom').then(function resolved(value) { + PDFJS.useOnlyCssZoom = value; + }) + // TODO move more preferences and other async stuff here + ]).catch(function (reason) { }); + + return initializedPromise.then(function () { + PDFViewerApplication.initialized = true; + }); + }, + + zoomIn: function pdfViewZoomIn(ticks) { + var newScale = this.pdfViewer.currentScale; + do { + newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); + newScale = Math.ceil(newScale * 10) / 10; + newScale = Math.min(MAX_SCALE, newScale); + } while (--ticks > 0 && newScale < MAX_SCALE); + this.setScale(newScale, true); + }, + + zoomOut: function pdfViewZoomOut(ticks) { + var newScale = this.pdfViewer.currentScale; + do { + newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); + newScale = Math.floor(newScale * 10) / 10; + newScale = Math.max(MIN_SCALE, newScale); + } while (--ticks > 0 && newScale > MIN_SCALE); + this.setScale(newScale, true); + }, + + get currentScaleValue() { + return this.pdfViewer.currentScaleValue; + }, + + get pagesCount() { + return this.pdfDocument.numPages; + }, + + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + + get page() { + return this.pdfViewer.currentPageNumber; + }, + + get supportsPrinting() { + var canvas = document.createElement('canvas'); + var value = 'mozPrintCallback' in canvas; + + return PDFJS.shadow(this, 'supportsPrinting', value); + }, + + get supportsFullscreen() { + var doc = document.documentElement; + var support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || + doc.webkitRequestFullScreen || doc.msRequestFullscreen); + + if (document.fullscreenEnabled === false || + document.mozFullScreenEnabled === false || + document.webkitFullscreenEnabled === false || + document.msFullscreenEnabled === false) { + support = false; + } + if (support && PDFJS.disableFullscreen === true) { + support = false; + } + + return PDFJS.shadow(this, 'supportsFullscreen', support); + }, + + get supportsIntegratedFind() { + var support = false; + + return PDFJS.shadow(this, 'supportsIntegratedFind', support); + }, + + get supportsDocumentFonts() { + var support = true; + + return PDFJS.shadow(this, 'supportsDocumentFonts', support); + }, + + get supportsDocumentColors() { + var support = true; + + return PDFJS.shadow(this, 'supportsDocumentColors', support); + }, + + get loadingBar() { + var bar = new ProgressBar('#loadingBar', {}); + + return PDFJS.shadow(this, 'loadingBar', bar); + }, + + + setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { + this.url = url; + try { + this.setTitle(decodeURIComponent(getFileName(url)) || url); + } catch (e) { + // decodeURIComponent may throw URIError, + // fall back to using the unprocessed url in that case + this.setTitle(url); + } + }, + + setTitle: function pdfViewSetTitle(title) { + if (this.isViewerEmbedded) { + // Embedded PDF viewers should not be changing their parent page's title. + return; + } + //document.title = title; + }, + + close: function pdfViewClose() { + var errorWrapper = document.getElementById('errorWrapper'); + errorWrapper.setAttribute('hidden', 'true'); + + if (!this.pdfDocument) { + return; + } + + this.pdfDocument.destroy(); + this.pdfDocument = null; + + this.pdfThumbnailViewer.setDocument(null); + this.pdfViewer.setDocument(null); + + if (typeof PDFBug !== 'undefined') { + PDFBug.cleanup(); + } + }, + + // TODO(mack): This function signature should really be pdfViewOpen(url, args) + open: function pdfViewOpen(file, scale, password, + pdfDataRangeTransport, args) { + if (this.pdfDocument) { + // Reload the preferences if a document was previously opened. + Preferences.reload(); + } + this.close(); + + var parameters = {password: password}; + if (typeof file === 'string') { // URL + this.setTitleUsingUrl(file); + parameters.url = file; + } else if (file && 'byteLength' in file) { // ArrayBuffer + parameters.data = file; + } else if (file.url && file.originalUrl) { + this.setTitleUsingUrl(file.originalUrl); + parameters.url = file.url; + } + if (args) { + for (var prop in args) { + parameters[prop] = args[prop]; + } + } + + var self = this; + self.loading = true; + self.downloadComplete = false; + + var passwordNeeded = function passwordNeeded(updatePassword, reason) { + PasswordPrompt.updatePassword = updatePassword; + PasswordPrompt.reason = reason; + PasswordPrompt.open(); + }; + + function getDocumentProgress(progressData) { + self.progress(progressData.loaded / progressData.total); + } + + PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded, + getDocumentProgress).then( + function getDocumentCallback(pdfDocument) { + self.load(pdfDocument, scale); + self.loading = false; + }, + function getDocumentError(exception) { + var message = exception && exception.message; + var loadingErrorMessage = mozL10n.get('loading_error', null, + 'An error occurred while loading the PDF.'); + + if (exception instanceof PDFJS.InvalidPDFException) { + // change error message also for other builds + loadingErrorMessage = mozL10n.get('invalid_file_error', null, + 'Invalid or corrupted PDF file.'); + } else if (exception instanceof PDFJS.MissingPDFException) { + // special message for missing PDF's + loadingErrorMessage = mozL10n.get('missing_file_error', null, + 'Missing PDF file.'); + } else if (exception instanceof PDFJS.UnexpectedResponseException) { + loadingErrorMessage = mozL10n.get('unexpected_response_error', null, + 'Unexpected server response.'); + } + + var moreInfo = { + message: message + }; + self.error(loadingErrorMessage, moreInfo); + self.loading = false; + } + ); + + if (args && args.length) { + PDFViewerApplication.pdfDocumentProperties.setFileSize(args.length); + } + }, + + download: function pdfViewDownload() { + function downloadByUrl() { + downloadManager.downloadUrl(url, filename); + } + + var url = this.url.split('#')[0]; + var filename = getPDFFileNameFromURL(url); + var downloadManager = new DownloadManager(); + downloadManager.onerror = function (err) { + // This error won't really be helpful because it's likely the + // fallback won't work either (or is already open). + PDFViewerApplication.error('PDF failed to download.'); + }; + + if (!this.pdfDocument) { // the PDF is not ready yet + downloadByUrl(); + return; + } + + if (!this.downloadComplete) { // the PDF is still downloading + downloadByUrl(); + return; + } + + this.pdfDocument.getData().then( + function getDataSuccess(data) { + var blob = PDFJS.createBlob(data, 'application/pdf'); + downloadManager.download(blob, url, filename); + }, + downloadByUrl // Error occurred try downloading with just the url. + ).then(null, downloadByUrl); + }, + + fallback: function pdfViewFallback(featureId) { + }, + + navigateTo: function pdfViewNavigateTo(dest) { + var destString = ''; + var self = this; + + var goToDestination = function(destRef) { + self.pendingRefStr = null; + // dest array looks like that: + var pageNumber = destRef instanceof Object ? + self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : + (destRef + 1); + if (pageNumber) { + if (pageNumber > self.pagesCount) { + pageNumber = self.pagesCount; + } + self.pdfViewer.scrollPageIntoView(pageNumber, dest); + + // Update the browsing history. + PDFHistory.push({ dest: dest, hash: destString, page: pageNumber }); + } else { + self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { + var pageNum = pageIndex + 1; + self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] = pageNum; + goToDestination(destRef); + }); + } + }; + + var destinationPromise; + if (typeof dest === 'string') { + destString = dest; + destinationPromise = this.pdfDocument.getDestination(dest); + } else { + destinationPromise = Promise.resolve(dest); + } + destinationPromise.then(function(destination) { + dest = destination; + if (!(destination instanceof Array)) { + return; // invalid destination + } + goToDestination(destination[0]); + }); + }, + + executeNamedAction: function pdfViewExecuteNamedAction(action) { + // See PDF reference, table 8.45 - Named action + switch (action) { + case 'GoToPage': + document.getElementById('pageNumber').focus(); + break; + + case 'GoBack': + PDFHistory.back(); + break; + + case 'GoForward': + PDFHistory.forward(); + break; + + case 'Find': + if (!this.supportsIntegratedFind) { + this.findBar.toggle(); + } + break; + + case 'NextPage': + this.page++; + break; + + case 'PrevPage': + this.page--; + break; + + case 'LastPage': + this.page = this.pagesCount; + break; + + case 'FirstPage': + this.page = 1; + break; + + default: + break; // No action according to spec + } + }, + + getDestinationHash: function pdfViewGetDestinationHash(dest) { + if (typeof dest === 'string') { + return this.getAnchorUrl('#' + escape(dest)); + } + if (dest instanceof Array) { + var destRef = dest[0]; // see navigateTo method for dest format + var pageNumber = destRef instanceof Object ? + this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : + (destRef + 1); + if (pageNumber) { + var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber); + var destKind = dest[1]; + if (typeof destKind === 'object' && 'name' in destKind && + destKind.name === 'XYZ') { + var scale = (dest[4] || this.currentScaleValue); + var scaleNumber = parseFloat(scale); + if (scaleNumber) { + scale = scaleNumber * 100; + } + pdfOpenParams += '&zoom=' + scale; + if (dest[2] || dest[3]) { + pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0); + } + } + return pdfOpenParams; + } + } + return ''; + }, + + /** + * Prefix the full url on anchor links to make sure that links are resolved + * relative to the current URL instead of the one defined in . + * @param {String} anchor The anchor hash, including the #. + */ + getAnchorUrl: function getAnchorUrl(anchor) { + return anchor; + }, + + /** + * Show the error box. + * @param {String} message A message that is human readable. + * @param {Object} moreInfo (optional) Further information about the error + * that is more technical. Should have a 'message' + * and optionally a 'stack' property. + */ + error: function pdfViewError(message, moreInfo) { + var moreInfoText = mozL10n.get('error_version_info', + {version: PDFJS.version || '?', build: PDFJS.build || '?'}, + 'PDF.js v{{version}} (build: {{build}})') + '\n'; + if (moreInfo) { + moreInfoText += + mozL10n.get('error_message', {message: moreInfo.message}, + 'Message: {{message}}'); + if (moreInfo.stack) { + moreInfoText += '\n' + + mozL10n.get('error_stack', {stack: moreInfo.stack}, + 'Stack: {{stack}}'); + } else { + if (moreInfo.filename) { + moreInfoText += '\n' + + mozL10n.get('error_file', {file: moreInfo.filename}, + 'File: {{file}}'); + } + if (moreInfo.lineNumber) { + moreInfoText += '\n' + + mozL10n.get('error_line', {line: moreInfo.lineNumber}, + 'Line: {{line}}'); + } + } + } + + var errorWrapper = document.getElementById('errorWrapper'); + errorWrapper.removeAttribute('hidden'); + + var errorMessage = document.getElementById('errorMessage'); + errorMessage.textContent = message; + + var closeButton = document.getElementById('errorClose'); + closeButton.onclick = function() { + errorWrapper.setAttribute('hidden', 'true'); + }; + + var errorMoreInfo = document.getElementById('errorMoreInfo'); + var moreInfoButton = document.getElementById('errorShowMore'); + var lessInfoButton = document.getElementById('errorShowLess'); + moreInfoButton.onclick = function() { + errorMoreInfo.removeAttribute('hidden'); + moreInfoButton.setAttribute('hidden', 'true'); + lessInfoButton.removeAttribute('hidden'); + errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px'; + }; + lessInfoButton.onclick = function() { + errorMoreInfo.setAttribute('hidden', 'true'); + moreInfoButton.removeAttribute('hidden'); + lessInfoButton.setAttribute('hidden', 'true'); + }; + moreInfoButton.oncontextmenu = noContextMenuHandler; + lessInfoButton.oncontextmenu = noContextMenuHandler; + closeButton.oncontextmenu = noContextMenuHandler; + moreInfoButton.removeAttribute('hidden'); + lessInfoButton.setAttribute('hidden', 'true'); + errorMoreInfo.value = moreInfoText; + }, + + progress: function pdfViewProgress(level) { + var percent = Math.round(level * 100); + // When we transition from full request to range requests, it's possible + // that we discard some of the loaded data. This can cause the loading + // bar to move backwards. So prevent this by only updating the bar if it + // increases. + if (percent > this.loadingBar.percent || isNaN(percent)) { + this.loadingBar.percent = percent; + + // When disableAutoFetch is enabled, it's not uncommon for the entire file + // to never be fetched (depends on e.g. the file structure). In this case + // the loading bar will not be completely filled, nor will it be hidden. + // To prevent displaying a partially filled loading bar permanently, we + // hide it when no data has been loaded during a certain amount of time. + if (PDFJS.disableAutoFetch && percent) { + if (this.disableAutoFetchLoadingBarTimeout) { + clearTimeout(this.disableAutoFetchLoadingBarTimeout); + this.disableAutoFetchLoadingBarTimeout = null; + } + this.loadingBar.show(); + + this.disableAutoFetchLoadingBarTimeout = setTimeout(function () { + this.loadingBar.hide(); + this.disableAutoFetchLoadingBarTimeout = null; + }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT); + } + } + }, + + load: function pdfViewLoad(pdfDocument, scale) { + var self = this; + scale = scale || UNKNOWN_SCALE; + + this.findController.reset(); + + this.pdfDocument = pdfDocument; + + this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url); + + var downloadedPromise = pdfDocument.getDownloadInfo().then(function() { + self.downloadComplete = true; + self.loadingBar.hide(); + }); + + var pagesCount = pdfDocument.numPages; + document.getElementById('numPages').textContent = + mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}'); + document.getElementById('pageNumber').max = pagesCount; + + var id = this.documentFingerprint = pdfDocument.fingerprint; + var store = this.store = new ViewHistory(id); + + var pdfViewer = this.pdfViewer; + pdfViewer.currentScale = scale; + pdfViewer.setDocument(pdfDocument); + var firstPagePromise = pdfViewer.firstPagePromise; + var pagesPromise = pdfViewer.pagesPromise; + var onePageRendered = pdfViewer.onePageRendered; + + this.pageRotation = 0; + this.isInitialViewSet = false; + this.pagesRefMap = pdfViewer.pagesRefMap; + + this.pdfThumbnailViewer.setDocument(pdfDocument); + + firstPagePromise.then(function(pdfPage) { + downloadedPromise.then(function () { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('documentload', true, true, {}); + window.dispatchEvent(event); + }); + + self.loadingBar.setWidth(document.getElementById('viewer')); + + if (!PDFJS.disableHistory && !self.isViewerEmbedded) { + // The browsing history is only enabled when the viewer is standalone, + // i.e. not when it is embedded in a web page. + if (!self.preferenceShowPreviousViewOnLoad && window.history.state) { + window.history.replaceState(null, ''); + } + PDFHistory.initialize(self.documentFingerprint, self); + } + + store.initializedPromise.then(function resolved() { + var storedHash = null; + if (self.preferenceShowPreviousViewOnLoad && + store.get('exists', false)) { + var pageNum = store.get('page', '1'); + var zoom = self.preferenceDefaultZoomValue || + store.get('zoom', self.pdfViewer.currentScale); + var left = store.get('scrollLeft', '0'); + var top = store.get('scrollTop', '0'); + + storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' + + left + ',' + top; + } else if (self.preferenceDefaultZoomValue) { + storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue; + } + self.setInitialView(storedHash, scale); + + // Make all navigation keys work on document load, + // unless the viewer is embedded in a web page. + if (!self.isViewerEmbedded) { + self.pdfViewer.focus(); + } + }, function rejected(reason) { + console.error(reason); + self.setInitialView(null, scale); + }); + }); + + pagesPromise.then(function() { + if (self.supportsPrinting) { + pdfDocument.getJavaScript().then(function(javaScript) { + if (javaScript.length) { + console.warn('Warning: JavaScript is not supported'); + self.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript); + } + // Hack to support auto printing. + var regex = /\bprint\s*\(/g; + for (var i = 0, ii = javaScript.length; i < ii; i++) { + var js = javaScript[i]; + if (js && regex.test(js)) { + setTimeout(function() { + window.print(); + }); + return; + } + } + }); + } + }); + + // outline depends on pagesRefMap + var promises = [pagesPromise, this.animationStartedPromise]; + Promise.all(promises).then(function() { + pdfDocument.getOutline().then(function(outline) { + var container = document.getElementById('outlineView'); + self.outline = new PDFOutlineView({ + container: container, + outline: outline, + linkService: self + }); + self.outline.render(); + document.getElementById('viewOutline').disabled = !outline; + + if (!outline && !container.classList.contains('hidden')) { + self.switchSidebarView('thumbs'); + } + if (outline && + self.preferenceSidebarViewOnLoad === SidebarView.OUTLINE) { + self.switchSidebarView('outline', true); + } + }); + pdfDocument.getAttachments().then(function(attachments) { + var container = document.getElementById('attachmentsView'); + self.attachments = new PDFAttachmentView({ + container: container, + attachments: attachments, + downloadManager: new DownloadManager() + }); + self.attachments.render(); + document.getElementById('viewAttachments').disabled = !attachments; + + if (!attachments && !container.classList.contains('hidden')) { + self.switchSidebarView('thumbs'); + } + if (attachments && + self.preferenceSidebarViewOnLoad === SidebarView.ATTACHMENTS) { + self.switchSidebarView('attachments', true); + } + }); + }); + + if (self.preferenceSidebarViewOnLoad === SidebarView.THUMBS) { + Promise.all([firstPagePromise, onePageRendered]).then(function () { + self.switchSidebarView('thumbs', true); + }); + } + + pdfDocument.getMetadata().then(function(data) { + var info = data.info, metadata = data.metadata; + self.documentInfo = info; + self.metadata = metadata; + + // Provides some basic debug information + console.log('PDF ' + pdfDocument.fingerprint + ' [' + + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + + ' / ' + (info.Creator || '-').trim() + ']' + + ' (PDF.js: ' + (PDFJS.version || '-') + + (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')'); + + var pdfTitle; + if (metadata && metadata.has('dc:title')) { + var title = metadata.get('dc:title'); + // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled' + if (title !== 'Untitled') { + pdfTitle = title; + } + } + + if (!pdfTitle && info && info['Title']) { + pdfTitle = info['Title']; + } + + if (pdfTitle) { + self.setTitle(pdfTitle + ' - ' + document.title); + } + + if (info.IsAcroFormPresent) { + console.warn('Warning: AcroForm/XFA is not supported'); + self.fallback(PDFJS.UNSUPPORTED_FEATURES.forms); + } + + }); + }, + + setInitialView: function pdfViewSetInitialView(storedHash, scale) { + this.isInitialViewSet = true; + + // When opening a new file (when one is already loaded in the viewer): + // Reset 'currentPageNumber', since otherwise the page's scale will be wrong + // if 'currentPageNumber' is larger than the number of pages in the file. + document.getElementById('pageNumber').value = + this.pdfViewer.currentPageNumber = 1; + + if (PDFHistory.initialDestination) { + this.navigateTo(PDFHistory.initialDestination); + PDFHistory.initialDestination = null; + } else if (this.initialBookmark) { + this.setHash(this.initialBookmark); + PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + this.setHash(storedHash); + } else if (scale) { + this.setScale(scale, true); + this.page = 1; + } + + if (this.pdfViewer.currentScale === UNKNOWN_SCALE) { + // Scale was not initialized: invalid bookmark or scale was not specified. + // Setting the default one. + this.setScale(DEFAULT_SCALE, true); + } + }, + + cleanup: function pdfViewCleanup() { + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer.cleanup(); + this.pdfDocument.cleanup(); + }, + + forceRendering: function pdfViewForceRendering() { + this.pdfRenderingQueue.printing = this.printing; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.sidebarOpen; + this.pdfRenderingQueue.renderHighestPriority(); + }, + + setHash: function pdfViewSetHash(hash) { + if (!this.isInitialViewSet) { + this.initialBookmark = hash; + return; + } + if (!hash) { + return; + } + + if (hash.indexOf('=') >= 0) { + var params = this.parseQueryString(hash); + // borrowing syntax from "Parameters for Opening PDF Files" + if ('nameddest' in params) { + PDFHistory.updateNextHashParam(params.nameddest); + this.navigateTo(params.nameddest); + return; + } + var pageNumber, dest; + if ('page' in params) { + pageNumber = (params.page | 0) || 1; + } + if ('zoom' in params) { + // Build the destination array. + var zoomArgs = params.zoom.split(','); // scale,left,top + var zoomArg = zoomArgs[0]; + var zoomArgNumber = parseFloat(zoomArg); + + if (zoomArg.indexOf('Fit') === -1) { + // If the zoomArg is a number, it has to get divided by 100. If it's + // a string, it should stay as it is. + dest = [null, { name: 'XYZ' }, + zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null, + zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null, + (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)]; + } else { + if (zoomArg === 'Fit' || zoomArg === 'FitB') { + dest = [null, { name: zoomArg }]; + } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') || + (zoomArg === 'FitV' || zoomArg === 'FitBV')) { + dest = [null, { name: zoomArg }, + zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null]; + } else if (zoomArg === 'FitR') { + if (zoomArgs.length !== 5) { + console.error('pdfViewSetHash: ' + + 'Not enough parameters for \'FitR\'.'); + } else { + dest = [null, { name: zoomArg }, + (zoomArgs[1] | 0), (zoomArgs[2] | 0), + (zoomArgs[3] | 0), (zoomArgs[4] | 0)]; + } + } else { + console.error('pdfViewSetHash: \'' + zoomArg + + '\' is not a valid zoom value.'); + } + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest); + } else if (pageNumber) { + this.page = pageNumber; // simple page + } + if ('pagemode' in params) { + if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks' || + params.pagemode === 'attachments') { + this.switchSidebarView((params.pagemode === 'bookmarks' ? + 'outline' : params.pagemode), true); + } else if (params.pagemode === 'none' && this.sidebarOpen) { + document.getElementById('sidebarToggle').click(); + } + } + } else if (/^\d+$/.test(hash)) { // page number + this.page = hash; + } else { // named destination + PDFHistory.updateNextHashParam(unescape(hash)); + this.navigateTo(unescape(hash)); + } + }, + + refreshThumbnailViewer: function pdfViewRefreshThumbnailViewer() { + var pdfViewer = this.pdfViewer; + var thumbnailViewer = this.pdfThumbnailViewer; + + // set thumbnail images of rendered pages + var pagesCount = pdfViewer.pagesCount; + for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) { + var pageView = pdfViewer.getPageView(pageIndex); + if (pageView && pageView.renderingState === RenderingStates.FINISHED) { + var thumbnailView = thumbnailViewer.getThumbnail(pageIndex); + thumbnailView.setImage(pageView); + } + } + + thumbnailViewer.scrollThumbnailIntoView(this.page); + }, + + switchSidebarView: function pdfViewSwitchSidebarView(view, openSidebar) { + if (openSidebar && !this.sidebarOpen) { + document.getElementById('sidebarToggle').click(); + } + var thumbsView = document.getElementById('thumbnailView'); + var outlineView = document.getElementById('outlineView'); + var attachmentsView = document.getElementById('attachmentsView'); + + var thumbsButton = document.getElementById('viewThumbnail'); + var outlineButton = document.getElementById('viewOutline'); + var attachmentsButton = document.getElementById('viewAttachments'); + + switch (view) { + case 'thumbs': + var wasAnotherViewVisible = thumbsView.classList.contains('hidden'); + + thumbsButton.classList.add('toggled'); + outlineButton.classList.remove('toggled'); + attachmentsButton.classList.remove('toggled'); + thumbsView.classList.remove('hidden'); + outlineView.classList.add('hidden'); + attachmentsView.classList.add('hidden'); + + this.forceRendering(); + + if (wasAnotherViewVisible) { + this.pdfThumbnailViewer.ensureThumbnailVisible(this.page); + } + break; + + case 'outline': + thumbsButton.classList.remove('toggled'); + outlineButton.classList.add('toggled'); + attachmentsButton.classList.remove('toggled'); + thumbsView.classList.add('hidden'); + outlineView.classList.remove('hidden'); + attachmentsView.classList.add('hidden'); + + if (outlineButton.getAttribute('disabled')) { + return; + } + break; + + case 'attachments': + thumbsButton.classList.remove('toggled'); + outlineButton.classList.remove('toggled'); + attachmentsButton.classList.add('toggled'); + thumbsView.classList.add('hidden'); + outlineView.classList.add('hidden'); + attachmentsView.classList.remove('hidden'); + + if (attachmentsButton.getAttribute('disabled')) { + return; + } + break; + } + }, + + // Helper function to parse query string (e.g. ?param1=value&parm2=...). + parseQueryString: function pdfViewParseQueryString(query) { + var parts = query.split('&'); + var params = {}; + for (var i = 0, ii = parts.length; i < ii; ++i) { + var param = parts[i].split('='); + var key = param[0].toLowerCase(); + var value = param.length > 1 ? param[1] : null; + params[decodeURIComponent(key)] = decodeURIComponent(value); + } + return params; + }, + + beforePrint: function pdfViewSetupBeforePrint() { + if (!this.supportsPrinting) { + var printMessage = mozL10n.get('printing_not_supported', null, + 'Warning: Printing is not fully supported by this browser.'); + this.error(printMessage); + return; + } + + var alertNotReady = false; + var i, ii; + if (!this.pagesCount) { + alertNotReady = true; + } else { + for (i = 0, ii = this.pagesCount; i < ii; ++i) { + if (!this.pdfViewer.getPageView(i).pdfPage) { + alertNotReady = true; + break; + } + } + } + if (alertNotReady) { + var notReadyMessage = mozL10n.get('printing_not_ready', null, + 'Warning: The PDF is not fully loaded for printing.'); + window.alert(notReadyMessage); + return; + } + + this.printing = true; + this.forceRendering(); + + var body = document.querySelector('body'); + body.setAttribute('data-mozPrintCallback', true); + + if (!this.hasEqualPageSizes) { + console.warn('Not all pages have the same size. The printed result ' + + 'may be incorrect!'); + } + + // Insert a @page + size rule to make sure that the page size is correctly + // set. Note that we assume that all pages have the same size, because + // variable-size pages are not supported yet (at least in Chrome & Firefox). + // TODO(robwu): Use named pages when size calculation bugs get resolved + // (e.g. https://crbug.com/355116) AND when support for named pages is + // added (http://www.w3.org/TR/css3-page/#using-named-pages). + // In browsers where @page + size is not supported (such as Firefox, + // https://bugzil.la/851441), the next stylesheet will be ignored and the + // user has to select the correct paper size in the UI if wanted. + this.pageStyleSheet = document.createElement('style'); + var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1); + this.pageStyleSheet.textContent = + // "size: " is what we need. But also add "A4" because + // Firefox incorrectly reports support for the other value. + '@supports ((size:A4) and (size:1pt 1pt)) {' + + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + + // The canvas and each ancestor node must have a height of 100% to make + // sure that each canvas is printed on exactly one page. + '#printContainer {height:100%}' + + '#printContainer > div {width:100% !important;height:100% !important;}' + + '}'; + body.appendChild(this.pageStyleSheet); + + for (i = 0, ii = this.pagesCount; i < ii; ++i) { + this.pdfViewer.getPageView(i).beforePrint(); + } + + }, + + // Whether all pages of the PDF have the same width and height. + get hasEqualPageSizes() { + var firstPage = this.pdfViewer.getPageView(0); + for (var i = 1, ii = this.pagesCount; i < ii; ++i) { + var pageView = this.pdfViewer.getPageView(i); + if (pageView.width !== firstPage.width || + pageView.height !== firstPage.height) { + return false; + } + } + return true; + }, + + afterPrint: function pdfViewSetupAfterPrint() { + var div = document.getElementById('printContainer'); + while (div.hasChildNodes()) { + div.removeChild(div.lastChild); + } + + if (this.pageStyleSheet && this.pageStyleSheet.parentNode) { + this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet); + this.pageStyleSheet = null; + } + + this.printing = false; + this.forceRendering(); + }, + + setScale: function (value, resetAutoSettings) { + this.updateScaleControls = !!resetAutoSettings; + this.pdfViewer.currentScaleValue = value; + this.updateScaleControls = true; + }, + + rotatePages: function pdfViewRotatePages(delta) { + var pageNumber = this.page; + this.pageRotation = (this.pageRotation + 360 + delta) % 360; + this.pdfViewer.pagesRotation = this.pageRotation; + this.pdfThumbnailViewer.pagesRotation = this.pageRotation; + + this.forceRendering(); + + this.pdfViewer.scrollPageIntoView(pageNumber); + }, + + requestPresentationMode: function pdfViewRequestPresentationMode() { + if (!this.pdfPresentationMode) { + return; + } + this.pdfPresentationMode.request(); + }, + + /** + * @param {number} delta - The delta value from the mouse event. + */ + scrollPresentationMode: function pdfViewScrollPresentationMode(delta) { + if (!this.pdfPresentationMode) { + return; + } + this.pdfPresentationMode.mouseScroll(delta); + } +}; +window.PDFView = PDFViewerApplication; // obsolete name, using it as an alias + + +function webViewerLoad(evt) { + PDFViewerApplication.initialize().then(webViewerInitialized); +} + +function webViewerInitialized() { + var queryString = document.location.search.substring(1); + var params = PDFViewerApplication.parseQueryString(queryString); + var file = 'file' in params ? params.file : DEFAULT_URL; + + var fileInput = document.createElement('input'); + fileInput.id = 'fileInput'; + fileInput.className = 'fileInput'; + fileInput.setAttribute('type', 'file'); + fileInput.oncontextmenu = noContextMenuHandler; + document.body.appendChild(fileInput); + + if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { + document.getElementById('openFile').setAttribute('hidden', 'true'); + document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true'); + } else { + document.getElementById('fileInput').value = null; + } + + var locale = PDFJS.locale || navigator.language; + + if (PDFViewerApplication.preferencePdfBugEnabled) { + // Special debugging flags in the hash section of the URL. + var hash = document.location.hash.substring(1); + var hashParams = PDFViewerApplication.parseQueryString(hash); + + if ('disableworker' in hashParams) { + PDFJS.disableWorker = (hashParams['disableworker'] === 'true'); + } + if ('disablerange' in hashParams) { + PDFJS.disableRange = (hashParams['disablerange'] === 'true'); + } + if ('disablestream' in hashParams) { + PDFJS.disableStream = (hashParams['disablestream'] === 'true'); + } + if ('disableautofetch' in hashParams) { + PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true'); + } + if ('disablefontface' in hashParams) { + PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true'); + } + if ('disablehistory' in hashParams) { + PDFJS.disableHistory = (hashParams['disablehistory'] === 'true'); + } + if ('webgl' in hashParams) { + PDFJS.disableWebGL = (hashParams['webgl'] !== 'true'); + } + if ('useonlycsszoom' in hashParams) { + PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true'); + } + if ('verbosity' in hashParams) { + PDFJS.verbosity = hashParams['verbosity'] | 0; + } + if ('ignorecurrentpositiononzoom' in hashParams) { + IGNORE_CURRENT_POSITION_ON_ZOOM = + (hashParams['ignorecurrentpositiononzoom'] === 'true'); + } + if ('locale' in hashParams) { + locale = hashParams['locale']; + } + if ('textlayer' in hashParams) { + switch (hashParams['textlayer']) { + case 'off': + PDFJS.disableTextLayer = true; + break; + case 'visible': + case 'shadow': + case 'hover': + var viewer = document.getElementById('viewer'); + viewer.classList.add('textLayer-' + hashParams['textlayer']); + break; + } + } + if ('pdfbug' in hashParams) { + PDFJS.pdfBug = true; + var pdfBug = hashParams['pdfbug']; + var enabled = pdfBug.split(','); + PDFBug.enable(enabled); + PDFBug.init(); + } + } + + mozL10n.setLanguage(locale); + + if (!PDFViewerApplication.supportsPrinting) { + document.getElementById('print').classList.add('hidden'); + document.getElementById('secondaryPrint').classList.add('hidden'); + } + + if (!PDFViewerApplication.supportsFullscreen) { + document.getElementById('presentationMode').classList.add('hidden'); + document.getElementById('secondaryPresentationMode'). + classList.add('hidden'); + } + + if (PDFViewerApplication.supportsIntegratedFind) { + document.getElementById('viewFind').classList.add('hidden'); + } + + // Listen for unsupported features to trigger the fallback UI. + PDFJS.UnsupportedManager.listen( + PDFViewerApplication.fallback.bind(PDFViewerApplication)); + + // Suppress context menus for some controls + document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler; + + var mainContainer = document.getElementById('mainContainer'); + var outerContainer = document.getElementById('outerContainer'); + mainContainer.addEventListener('transitionend', function(e) { + if (e.target === mainContainer) { + var event = document.createEvent('UIEvents'); + event.initUIEvent('resize', false, false, window, 0); + window.dispatchEvent(event); + outerContainer.classList.remove('sidebarMoving'); + } + }, true); + + document.getElementById('sidebarToggle').addEventListener('click', + function() { + this.classList.toggle('toggled'); + outerContainer.classList.add('sidebarMoving'); + outerContainer.classList.toggle('sidebarOpen'); + PDFViewerApplication.sidebarOpen = + outerContainer.classList.contains('sidebarOpen'); + if (PDFViewerApplication.sidebarOpen) { + PDFViewerApplication.refreshThumbnailViewer(); + } + PDFViewerApplication.forceRendering(); + }); + + document.getElementById('viewThumbnail').addEventListener('click', + function() { + PDFViewerApplication.switchSidebarView('thumbs'); + }); + + document.getElementById('viewOutline').addEventListener('click', + function() { + PDFViewerApplication.switchSidebarView('outline'); + }); + + document.getElementById('viewAttachments').addEventListener('click', + function() { + PDFViewerApplication.switchSidebarView('attachments'); + }); + + document.getElementById('previous').addEventListener('click', + function() { + PDFViewerApplication.page--; + }); + + document.getElementById('next').addEventListener('click', + function() { + PDFViewerApplication.page++; + }); + + document.getElementById('zoomIn').addEventListener('click', + function() { + PDFViewerApplication.zoomIn(); + }); + + document.getElementById('zoomOut').addEventListener('click', + function() { + PDFViewerApplication.zoomOut(); + }); + + document.getElementById('pageNumber').addEventListener('click', function() { + this.select(); + }); + + document.getElementById('pageNumber').addEventListener('change', function() { + // Handle the user inputting a floating point number. + PDFViewerApplication.page = (this.value | 0); + + if (this.value !== (this.value | 0).toString()) { + this.value = PDFViewerApplication.page; + } + }); + + document.getElementById('scaleSelect').addEventListener('change', + function() { + PDFViewerApplication.setScale(this.value, false); + }); + + document.getElementById('presentationMode').addEventListener('click', + SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar)); + + document.getElementById('openFile').addEventListener('click', + SecondaryToolbar.openFileClick.bind(SecondaryToolbar)); + + document.getElementById('print').addEventListener('click', + SecondaryToolbar.printClick.bind(SecondaryToolbar)); + + document.getElementById('download').addEventListener('click', + SecondaryToolbar.downloadClick.bind(SecondaryToolbar)); + + + if (file && file.lastIndexOf('file:', 0) === 0) { + // file:-scheme. Load the contents in the main thread because QtWebKit + // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded + // very quickly, so there is no need to set up progress event listeners. + PDFViewerApplication.setTitleUsingUrl(file); + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + PDFViewerApplication.open(new Uint8Array(xhr.response), 0); + }; + try { + xhr.open('GET', file); + xhr.responseType = 'arraybuffer'; + xhr.send(); + } catch (e) { + PDFViewerApplication.error(mozL10n.get('loading_error', null, + 'An error occurred while loading the PDF.'), e); + } + return; + } + + if (file) { + PDFViewerApplication.open(file, 0); + } +} + +document.addEventListener('DOMContentLoaded', webViewerLoad, true); + +document.addEventListener('pagerendered', function (e) { + var pageNumber = e.detail.pageNumber; + var pageIndex = pageNumber - 1; + var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); + + if (PDFViewerApplication.sidebarOpen) { + var thumbnailView = PDFViewerApplication.pdfThumbnailViewer. + getThumbnail(pageIndex); + thumbnailView.setImage(pageView); + } + + if (PDFJS.pdfBug && Stats.enabled && pageView.stats) { + Stats.add(pageNumber, pageView.stats); + } + + if (pageView.error) { + PDFViewerApplication.error(mozL10n.get('rendering_error', null, + 'An error occurred while rendering the page.'), pageView.error); + } + + // If the page is still visible when it has finished rendering, + // ensure that the page number input loading indicator is hidden. + if (pageNumber === PDFViewerApplication.page) { + var pageNumberInput = document.getElementById('pageNumber'); + pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); + } + +}, true); + +document.addEventListener('textlayerrendered', function (e) { + var pageIndex = e.detail.pageNumber - 1; + var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); + +}, true); + +window.addEventListener('presentationmodechanged', function (e) { + var active = e.detail.active; + var switchInProgress = e.detail.switchInProgress; + PDFViewerApplication.pdfViewer.presentationModeState = + switchInProgress ? PresentationModeState.CHANGING : + active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL; +}); + +function updateViewarea() { + if (!PDFViewerApplication.initialized) { + return; + } + PDFViewerApplication.pdfViewer.update(); +} + +window.addEventListener('updateviewarea', function (evt) { + if (!PDFViewerApplication.initialized) { + return; + } + var location = evt.location; + + PDFViewerApplication.store.initializedPromise.then(function() { + PDFViewerApplication.store.setMultiple({ + 'exists': true, + 'page': location.pageNumber, + 'zoom': location.scale, + 'scrollLeft': location.left, + 'scrollTop': location.top + }).catch(function() { + // unable to write to storage + }); + }); + var href = PDFViewerApplication.getAnchorUrl(location.pdfOpenParams); + document.getElementById('viewBookmark').href = href; + document.getElementById('secondaryViewBookmark').href = href; + + // Update the current bookmark in the browsing history. + PDFHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber); + + // Show/hide the loading indicator in the page number input element. + var pageNumberInput = document.getElementById('pageNumber'); + var currentPage = + PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1); + + if (currentPage.renderingState === RenderingStates.FINISHED) { + pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); + } else { + pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR); + } +}, true); + +window.addEventListener('resize', function webViewerResize(evt) { + if (PDFViewerApplication.initialized && + (document.getElementById('pageAutoOption').selected || + /* Note: the scale is constant for |pageActualOption|. */ + document.getElementById('pageFitOption').selected || + document.getElementById('pageWidthOption').selected)) { + var selectedScale = document.getElementById('scaleSelect').value; + PDFViewerApplication.setScale(selectedScale, false); + } + updateViewarea(); + + // Set the 'max-height' CSS property of the secondary toolbar. + SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer')); +}); + +window.addEventListener('hashchange', function webViewerHashchange(evt) { + if (PDFHistory.isHashChangeUnlocked) { + PDFViewerApplication.setHash(document.location.hash.substring(1)); + } +}); + +window.addEventListener('change', function webViewerChange(evt) { + var files = evt.target.files; + if (!files || files.length === 0) { + return; + } + var file = files[0]; + + if (!PDFJS.disableCreateObjectURL && + typeof URL !== 'undefined' && URL.createObjectURL) { + PDFViewerApplication.open(URL.createObjectURL(file), 0); + } else { + // Read the local file into a Uint8Array. + var fileReader = new FileReader(); + fileReader.onload = function webViewerChangeFileReaderOnload(evt) { + var buffer = evt.target.result; + var uint8Array = new Uint8Array(buffer); + PDFViewerApplication.open(uint8Array, 0); + }; + fileReader.readAsArrayBuffer(file); + } + + PDFViewerApplication.setTitleUsingUrl(file.name); + + // URL does not reflect proper document location - hiding some icons. + document.getElementById('viewBookmark').setAttribute('hidden', 'true'); + document.getElementById('secondaryViewBookmark'). + setAttribute('hidden', 'true'); + document.getElementById('download').setAttribute('hidden', 'true'); + document.getElementById('secondaryDownload').setAttribute('hidden', 'true'); +}, true); + +function selectScaleOption(value) { + var options = document.getElementById('scaleSelect').options; + var predefinedValueFound = false; + for (var i = 0; i < options.length; i++) { + var option = options[i]; + if (option.value !== value) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + return predefinedValueFound; +} + +window.addEventListener('localized', function localized(evt) { + document.getElementsByTagName('html')[0].dir = mozL10n.getDirection(); + + PDFViewerApplication.animationStartedPromise.then(function() { + // Adjust the width of the zoom box to fit the content. + // Note: If the window is narrow enough that the zoom box is not visible, + // we temporarily show it to be able to adjust its width. + var container = document.getElementById('scaleSelectContainer'); + if (container.clientWidth === 0) { + container.setAttribute('style', 'display: inherit;'); + } + if (container.clientWidth > 0) { + var select = document.getElementById('scaleSelect'); + select.setAttribute('style', 'min-width: inherit;'); + var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING; + select.setAttribute('style', 'min-width: ' + + (width + SCALE_SELECT_PADDING) + 'px;'); + container.setAttribute('style', 'min-width: ' + width + 'px; ' + + 'max-width: ' + width + 'px;'); + } + + // Set the 'max-height' CSS property of the secondary toolbar. + SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer')); + }); +}, true); + +window.addEventListener('scalechange', function scalechange(evt) { + document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE); + document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE); + + var customScaleOption = document.getElementById('customScaleOption'); + customScaleOption.selected = false; + + if (!PDFViewerApplication.updateScaleControls && + (document.getElementById('pageAutoOption').selected || + document.getElementById('pageActualOption').selected || + document.getElementById('pageFitOption').selected || + document.getElementById('pageWidthOption').selected)) { + updateViewarea(); + return; + } + + if (evt.presetValue) { + selectScaleOption(evt.presetValue); + updateViewarea(); + return; + } + + var predefinedValueFound = selectScaleOption('' + evt.scale); + if (!predefinedValueFound) { + var customScale = Math.round(evt.scale * 10000) / 100; + customScaleOption.textContent = + mozL10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%'); + customScaleOption.selected = true; + } + updateViewarea(); +}, true); + +window.addEventListener('pagechange', function pagechange(evt) { + var page = evt.pageNumber; + if (evt.previousPageNumber !== page) { + document.getElementById('pageNumber').value = page; + if (PDFViewerApplication.sidebarOpen) { + PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page); + } + } + var numPages = PDFViewerApplication.pagesCount; + + document.getElementById('previous').disabled = (page <= 1); + document.getElementById('next').disabled = (page >= numPages); + + document.getElementById('firstPage').disabled = (page <= 1); + document.getElementById('lastPage').disabled = (page >= numPages); + + // we need to update stats + if (PDFJS.pdfBug && Stats.enabled) { + var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1); + if (pageView.stats) { + Stats.add(page, pageView.stats); + } + } + + // checking if the this.page was called from the updateViewarea function + if (evt.updateInProgress) { + return; + } + // Avoid scrolling the first page during loading + if (this.loading && page === 1) { + return; + } + PDFViewerApplication.pdfViewer.scrollPageIntoView(page); +}, true); + +function handleMouseWheel(evt) { + var MOUSE_WHEEL_DELTA_FACTOR = 40; + var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail : + evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR; + var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn'; + + if (PDFViewerApplication.pdfViewer.isInPresentationMode) { + evt.preventDefault(); + PDFViewerApplication.scrollPresentationMode(ticks * + MOUSE_WHEEL_DELTA_FACTOR); + } else if (evt.ctrlKey || evt.metaKey) { + // Only zoom the pages, not the entire viewer. + evt.preventDefault(); + PDFViewerApplication[direction](Math.abs(ticks)); + } +} + +window.addEventListener('DOMMouseScroll', handleMouseWheel); +window.addEventListener('mousewheel', handleMouseWheel); + +window.addEventListener('click', function click(evt) { + if (SecondaryToolbar.opened && + PDFViewerApplication.pdfViewer.containsElement(evt.target)) { + SecondaryToolbar.close(); + } +}, false); + +window.addEventListener('keydown', function keydown(evt) { + if (OverlayManager.active) { + return; + } + + var handled = false; + var cmd = (evt.ctrlKey ? 1 : 0) | + (evt.altKey ? 2 : 0) | + (evt.shiftKey ? 4 : 0) | + (evt.metaKey ? 8 : 0); + + var pdfViewer = PDFViewerApplication.pdfViewer; + var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode; + + // First, handle the key bindings that are independent whether an input + // control is selected or not. + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + // either CTRL or META key with optional SHIFT. + switch (evt.keyCode) { + case 70: // f + if (!PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.findBar.open(); + handled = true; + } + break; + case 71: // g + if (!PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.findBar.dispatchEvent('again', + cmd === 5 || cmd === 12); + handled = true; + } + break; + case 61: // FF/Mac '=' + case 107: // FF '+' and '=' + case 187: // Chrome '+' + case 171: // FF with German keyboard + if (!isViewerInPresentationMode) { + PDFViewerApplication.zoomIn(); + } + handled = true; + break; + case 173: // FF/Mac '-' + case 109: // FF '-' + case 189: // Chrome '-' + if (!isViewerInPresentationMode) { + PDFViewerApplication.zoomOut(); + } + handled = true; + break; + case 48: // '0' + case 96: // '0' on Numpad of Swedish keyboard + if (!isViewerInPresentationMode) { + // keeping it unhandled (to restore page zoom to 100%) + setTimeout(function () { + // ... and resetting the scale after browser adjusts its scale + PDFViewerApplication.setScale(DEFAULT_SCALE, true); + }); + handled = false; + } + break; + } + } + + // CTRL or META without shift + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: // s + PDFViewerApplication.download(); + handled = true; + break; + } + } + + // CTRL+ALT or Option+Command + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: // p + PDFViewerApplication.requestPresentationMode(); + handled = true; + break; + case 71: // g + // focuses input#pageNumber field + document.getElementById('pageNumber').select(); + handled = true; + break; + } + } + + if (handled) { + evt.preventDefault(); + return; + } + + // Some shortcuts should not get handled if a control/input element + // is selected. + var curElement = document.activeElement || document.querySelector(':focus'); + var curElementTagName = curElement && curElement.tagName.toUpperCase(); + if (curElementTagName === 'INPUT' || + curElementTagName === 'TEXTAREA' || + curElementTagName === 'SELECT') { + // Make sure that the secondary toolbar is closed when Escape is pressed. + if (evt.keyCode !== 27) { // 'Esc' + return; + } + } + + if (cmd === 0) { // no control key pressed at all. + switch (evt.keyCode) { + case 38: // up arrow + case 33: // pg up + case 8: // backspace + if (!isViewerInPresentationMode && + PDFViewerApplication.currentScaleValue !== 'page-fit') { + break; + } + /* in presentation mode */ + /* falls through */ + case 37: // left arrow + // horizontal scrolling using arrow keys + if (pdfViewer.isHorizontalScrollbarEnabled) { + break; + } + /* falls through */ + case 75: // 'k' + case 80: // 'p' + PDFViewerApplication.page--; + handled = true; + break; + case 27: // esc key + if (SecondaryToolbar.opened) { + SecondaryToolbar.close(); + handled = true; + } + if (!PDFViewerApplication.supportsIntegratedFind && + PDFViewerApplication.findBar.opened) { + PDFViewerApplication.findBar.close(); + handled = true; + } + break; + case 40: // down arrow + case 34: // pg down + case 32: // spacebar + if (!isViewerInPresentationMode && + PDFViewerApplication.currentScaleValue !== 'page-fit') { + break; + } + /* falls through */ + case 39: // right arrow + // horizontal scrolling using arrow keys + if (pdfViewer.isHorizontalScrollbarEnabled) { + break; + } + /* falls through */ + case 74: // 'j' + case 78: // 'n' + PDFViewerApplication.page++; + handled = true; + break; + + case 36: // home + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + } + break; + case 35: // end + if (isViewerInPresentationMode || (PDFViewerApplication.pdfDocument && + PDFViewerApplication.page < PDFViewerApplication.pagesCount)) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + } + break; + + case 72: // 'h' + if (!isViewerInPresentationMode) { + HandTool.toggle(); + } + break; + case 82: // 'r' + PDFViewerApplication.rotatePages(90); + break; + } + } + + if (cmd === 4) { // shift-key + switch (evt.keyCode) { + case 32: // spacebar + if (!isViewerInPresentationMode && + PDFViewerApplication.currentScaleValue !== 'page-fit') { + break; + } + PDFViewerApplication.page--; + handled = true; + break; + + case 82: // 'r' + PDFViewerApplication.rotatePages(-90); + break; + } + } + + if (!handled && !isViewerInPresentationMode) { + // 33=Page Up 34=Page Down 35=End 36=Home + // 37=Left 38=Up 39=Right 40=Down + if (evt.keyCode >= 33 && evt.keyCode <= 40 && + !pdfViewer.containsElement(curElement)) { + // The page container is not focused, but a page navigation key has been + // pressed. Change the focus to the viewer container to make sure that + // navigation by keyboard works as expected. + pdfViewer.focus(); + } + // 32=Spacebar + if (evt.keyCode === 32 && curElementTagName !== 'BUTTON' && + !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + } + + if (cmd === 2) { // alt-key + switch (evt.keyCode) { + case 37: // left arrow + if (isViewerInPresentationMode) { + PDFHistory.back(); + handled = true; + } + break; + case 39: // right arrow + if (isViewerInPresentationMode) { + PDFHistory.forward(); + handled = true; + } + break; + } + } + + if (handled) { + evt.preventDefault(); + } +}); + +window.addEventListener('beforeprint', function beforePrint(evt) { + PDFViewerApplication.beforePrint(); +}); + +window.addEventListener('afterprint', function afterPrint(evt) { + PDFViewerApplication.afterPrint(); +}); + +(function animationStartedClosure() { + // The offsetParent is not set until the pdf.js iframe or object is visible. + // Waiting for first animation. + PDFViewerApplication.animationStartedPromise = new Promise( + function (resolve) { + window.requestAnimationFrame(resolve); + }); +})(); + + diff --git a/jero-boot-single-startup/src/main/resources/static/view/userlist.html b/jero-boot-single-startup/src/main/resources/static/view/userlist.html new file mode 100644 index 00000000..049c8225 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/static/view/userlist.html @@ -0,0 +1,122 @@ + + + + + iview example + + + + + + +
    + +
    + + + \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/templates/demo3.ftl b/jero-boot-single-startup/src/main/resources/templates/demo3.ftl new file mode 100644 index 00000000..d75badce --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/templates/demo3.ftl @@ -0,0 +1,17 @@ + + + +Spring Boot FreeMarker + + + Freemarker HTML

    + + Sessionid: ${sessionid!}

    + + + <#list userList as item> + ${item!}
    + +
    + + \ No newline at end of file diff --git a/jero-boot-single-startup/src/main/resources/templates/pdfPreviewIframe.ftl b/jero-boot-single-startup/src/main/resources/templates/pdfPreviewIframe.ftl new file mode 100644 index 00000000..1ed4cff1 --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/templates/pdfPreviewIframe.ftl @@ -0,0 +1,30 @@ +<#assign base=springMacroRequestContext.getContextUrl("")> + + + + + + + +PDF预览 + + + + + diff --git a/jero-boot-single-startup/src/main/resources/templates/thirdLogin.ftl b/jero-boot-single-startup/src/main/resources/templates/thirdLogin.ftl new file mode 100644 index 00000000..dd3ab8af --- /dev/null +++ b/jero-boot-single-startup/src/main/resources/templates/thirdLogin.ftl @@ -0,0 +1,28 @@ + + + + + + + 第三方登录 + + +登陆中... + + + \ No newline at end of file diff --git a/jero-boot-single-startup/src/test/java/com/jero/SecurityToolsTest.java b/jero-boot-single-startup/src/test/java/com/jero/SecurityToolsTest.java new file mode 100644 index 00000000..dc8ed397 --- /dev/null +++ b/jero-boot-single-startup/src/test/java/com/jero/SecurityToolsTest.java @@ -0,0 +1,49 @@ +package com.jero; + +import cn.hutool.json.JSONObject; +import com.jero.common.util.security.SecurityTools; +import com.jero.common.util.security.entity.*; +import org.junit.Test; + +public class SecurityToolsTest { + @Test + public void Test(){ + MyKeyPair mkeyPair = SecurityTools.generateKeyPair(); + + JSONObject msg = new JSONObject(); + msg.put("name", "党政辉"); + msg.put("age", 50); + JSONObject identity = new JSONObject(); + identity.put("type", "01"); + identity.put("no", "210882165896524512"); + msg.put("identity", identity); + + // 签名加密部分 + SecuritySignReq signReq = new SecuritySignReq(); + // data为要加密的报文字符串 + signReq.setData(msg.toString()); + // 为rsa私钥 + signReq.setPrikey(mkeyPair.getPriKey()); + // 调用签名方法 + SecuritySignResp sign = SecurityTools.sign(signReq); + // 打印出来加密数据 + // signData为签名数据 + // data为aes加密数据 + // asekey为ras加密过的aeskey + System.out.println(new JSONObject(sign).toStringPretty()); + + // 验签解密部分 + SecurityReq req = new SecurityReq(); + //对方传过来的数据一一对应 + req.setAesKey(sign.getAesKey()); + req.setData(sign.getData()); + req.setSignData(sign.getSignData()); + //我们的公钥 + req.setPubKey(mkeyPair.getPubKey()); + //验签方法调用 + SecurityResp securityResp = SecurityTools.valid(req); + //解密报文data为解密报文 + //sucess 为验签成功失败标志 true代码验签成功,false代表失败 + System.out.println(new JSONObject(securityResp).toStringPretty()); + } +} diff --git a/jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/DesformApiTest.java b/jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/DesformApiTest.java new file mode 100644 index 00000000..be692dc0 --- /dev/null +++ b/jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/DesformApiTest.java @@ -0,0 +1,192 @@ +package com.jero.modules.online.desform.test; + +import com.alibaba.fastjson.JSONObject; +import com.jero.JeroSystemSingleApplication; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.util.RedisUtil; +import com.jero.common.util.RestUtil; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * 表单设计器 API 接口单元测试 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeroSystemSingleApplication.class) +@SuppressWarnings({"FieldCanBeLocal", "SpringJavaAutowiredMembersInspection"}) +public class DesformApiTest { + + @Autowired + private RedisUtil redisUtil; + + /** + * 测试地址:实际使用时替换成你自己的地址 + */ + private final String BASE_URL = "http://localhost:8080/jero-boot/desform/api/"; + + // 请实际使用时替换成你自己的用户名和密码 + private final String USERNAME = "admin"; + private final String PASSWORD = "123456"; + + /** + * 表单code,实际使用时可以替换成你要测试的表单code + */ + private final String DESFORM_CODE = "qingjiadan"; + + /** + * 测试用例:新增 + */ + @Test + public void testAdd() { + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + DESFORM_CODE; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 POST 代表提交新增数据 + HttpMethod method = HttpMethod.POST; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + JSONObject params = new JSONObject(); + params.put("name", "张三"); + params.put("sex", "1"); + params.put("begin_time", "2019-12-27"); + params.put("remarks", "生病了"); + + System.out.println("请求参数:" + params.toJSONString()); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + + /** + * 测试用例:修改 + */ + @Test + public void testEdit() { + // 数据Id + String dataId = "f43ea15c654337fbcb2336dd5422ffc3"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + DESFORM_CODE + "/" + dataId; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 PUT 代表提交修改数据 + HttpMethod method = HttpMethod.PUT; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + JSONObject params = new JSONObject(); + params.put("name", "李四"); + params.put("sex", "0"); + params.put("begin_time", "2019-12-27"); + params.put("remarks", "感冒了"); + + System.out.println("请求参数:" + params.toJSONString()); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + + /** + * 测试用例:删除 + */ + @Test + public void testDelete() { + // 数据Id + String dataId = "f43ea15c654337fbcb2336dd5422ffc3"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + DESFORM_CODE + "/" + dataId; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 DELETE 代表删除数据 + HttpMethod method = HttpMethod.DELETE; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + /** + * 测试用例:查询记录 + */ + @Test + public void testQuery() { + // 数据Id + String dataId = "18146ddaa062296442a9310a51baf67b"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + DESFORM_CODE + "/" + dataId; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 GET 代表获取数据 + HttpMethod method = HttpMethod.GET; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + private String getToken() { + String token = JwtUtil.sign(USERNAME, PASSWORD); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60); + return token; + } + + private HttpHeaders getHeaders(String token) { + HttpHeaders headers = new HttpHeaders(); + String mediaType = MediaType.APPLICATION_JSON_UTF8_VALUE; + headers.setContentType(MediaType.parseMediaType(mediaType)); + headers.set("Accept", mediaType); + headers.set("X-Access-Token", token); + return headers; + } + +} diff --git a/jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/OnlineApiTest.java b/jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/OnlineApiTest.java new file mode 100644 index 00000000..73ec7470 --- /dev/null +++ b/jero-boot-single-startup/src/test/java/com/jero/modules/online/desform/test/OnlineApiTest.java @@ -0,0 +1,190 @@ +package com.jero.modules.online.desform.test; + +import com.alibaba.fastjson.JSONObject; +import com.jero.JeroSystemSingleApplication; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.util.RedisUtil; +import com.jero.common.util.RestUtil; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * online api online表单单元测试 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeroSystemSingleApplication.class) +@SuppressWarnings({"FieldCanBeLocal", "SpringJavaAutowiredMembersInspection"}) +public class OnlineApiTest { + @Autowired + private RedisUtil redisUtil; + + /** + * 测试地址:实际使用时替换成你自己的地址 + */ + private final String BASE_URL = "http://localhost:8080/jero-boot/online/cgform/api/"; + + // 请实际使用时替换成你自己的用户名和密码 + private final String USERNAME = "admin"; + private final String PASSWORD = "123456"; + + /** + * online表单code,实际使用时可以替换成你要测试的表单code + * (测试表test_demo) + */ + private final String ONLINE_CODE = "d35109c3632c4952a19ecc094943dd71"; + + /** + * 测试用例:新增 + */ + @Test + public void testAdd() { + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "form/" + ONLINE_CODE; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 POST 代表提交新增数据 + HttpMethod method = HttpMethod.POST; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + JSONObject params = new JSONObject(); + params.put("name", "张三"); + params.put("sex", "1"); + params.put("age",15); + params.put("descc", "

    富文本编辑

    "); + + System.out.println("请求参数:" + params.toJSONString()); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + + /** + * 测试用例:修改 + */ + @Test + public void testEdit() { + // dataId + String dataId = "1331797913880883201"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "form/" + ONLINE_CODE; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 PUT 代表提交修改数据 + HttpMethod method = HttpMethod.PUT; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + JSONObject params = new JSONObject(); + params.put("id", dataId); + params.put("name", "张三"); + params.put("sex", "1"); + params.put("age",30); + params.put("descc", "

    富文本编辑,重新编辑

    "); + + System.out.println("请求参数:" + params.toJSONString()); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + + /** + * 测试用例:删除 + */ + @Test + public void testDelete() { + // 数据id + String dataId = "1331797913880883201"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "form/" + ONLINE_CODE + "/" + dataId; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 DELETE 代表删除数据 + HttpMethod method = HttpMethod.DELETE; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + /** + * 测试用例:查询记录 + */ + @Test + public void testQuery() { + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "getData/"+ ONLINE_CODE ; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 GET 代表获取数据 + HttpMethod method = HttpMethod.GET; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + private String getToken() { + String token = JwtUtil.sign(USERNAME, PASSWORD); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60); + return token; + } + + private HttpHeaders getHeaders(String token) { + HttpHeaders headers = new HttpHeaders(); + String mediaType = MediaType.APPLICATION_JSON_UTF8_VALUE; + headers.setContentType(MediaType.parseMediaType(mediaType)); + headers.set("Accept", mediaType); + headers.set("X-Access-Token", token); + return headers; + } +} diff --git a/jero-boot-single-startup/src/test/java/com/jero/modules/system/test/SysUserTest.java b/jero-boot-single-startup/src/test/java/com/jero/modules/system/test/SysUserTest.java new file mode 100644 index 00000000..9b9bd397 --- /dev/null +++ b/jero-boot-single-startup/src/test/java/com/jero/modules/system/test/SysUserTest.java @@ -0,0 +1,188 @@ +package com.jero.modules.system.test; + +import com.jero.JeroSystemSingleApplication; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.util.JwtUtil; +import com.jero.common.util.RedisUtil; +import com.jero.common.util.RestUtil; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import com.alibaba.fastjson.JSONObject; +import org.springframework.http.ResponseEntity; + +/** + * 系统用户单元测试 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeroSystemSingleApplication.class) +@SuppressWarnings({"FieldCanBeLocal", "SpringJavaAutowiredMembersInspection"}) +public class SysUserTest { + @Autowired + private RedisUtil redisUtil; + + /** + * 测试地址:实际使用时替换成你自己的地址 + */ + private final String BASE_URL = "http://localhost:8080/jero-boot/sys/user/"; + + // 请实际使用时替换成你自己的用户名和密码 + private final String USERNAME = "admin"; + private final String PASSWORD = "123456"; + + /** + * 测试用例:新增 + */ + @Test + public void testAdd() { + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "add" ; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 POST 代表提交新增数据 + HttpMethod method = HttpMethod.POST; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + JSONObject params = new JSONObject(); + params.put("username", "wangwuTest"); + params.put("password", "123456"); + params.put("confirmpassword","123456"); + params.put("realname", "单元测试"); + params.put("activitiSync", "1"); + params.put("userIdentity","1"); + params.put("workNo","0025"); + + System.out.println("请求参数:" + params.toJSONString()); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + + /** + * 测试用例:修改 + */ + @Test + public void testEdit() { + // 数据Id + String dataId = "1331795062924374018"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "edit"; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 PUT 代表提交修改数据 + HttpMethod method = HttpMethod.PUT; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + JSONObject params = new JSONObject(); + params.put("username", "wangwuTest"); + params.put("realname", "单元测试1111"); + params.put("activitiSync", "1"); + params.put("userIdentity","1"); + params.put("workNo","0025"); + params.put("id",dataId); + + System.out.println("请求参数:" + params.toJSONString()); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + + /** + * 测试用例:删除 + */ + @Test + public void testDelete() { + // 数据Id + String dataId = "1331795062924374018"; + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "delete" + "?id=" + dataId; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 DELETE 代表删除数据 + HttpMethod method = HttpMethod.DELETE; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + /** + * 测试用例:查询记录 + */ + @Test + public void testQuery() { + // 用户Token + String token = this.getToken(); + // 请求地址 + String url = BASE_URL + "list"; + // 请求 Header (用于传递Token) + HttpHeaders headers = this.getHeaders(token); + // 请求方式是 GET 代表获取数据 + HttpMethod method = HttpMethod.GET; + + System.out.println("请求地址:" + url); + System.out.println("请求方式:" + method); + System.out.println("请求Token:" + token); + + // 利用 RestUtil 请求该url + ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); + if (result != null && result.getBody() != null) { + System.out.println("返回结果:" + result.getBody().toJSONString()); + } else { + System.out.println("查询失败"); + } + } + + private String getToken() { + String token = JwtUtil.sign(USERNAME, PASSWORD); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60); + return token; + } + + private HttpHeaders getHeaders(String token) { + HttpHeaders headers = new HttpHeaders(); + String mediaType = MediaType.APPLICATION_JSON_UTF8_VALUE; + headers.setContentType(MediaType.parseMediaType(mediaType)); + headers.set("Accept", mediaType); + headers.set("X-Access-Token", token); + return headers; + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..b0da6d9f --- /dev/null +++ b/pom.xml @@ -0,0 +1,387 @@ + + 4.0.0 + com.jero.boot + jero-boot + 2.4.2 + pom + + + org.springframework.boot + spring-boot-starter-parent + 2.3.5.RELEASE + + + + + 2.4.2 + 1.8 + UTF-8 + 2.2.0 + 1.2.75 + 2.0.4 + 2.0.4 + 42.2.6 + 11.2.0.3 + 4.0 + 8.0.21 + 3.2.0 + 5.3.8 + 3.13.6 + 1.9.4 + 29.0-jre + 3.4.1 + 1.1.22 + 2.6 + 2.1.0 + 3.11.2 + 1.7.1 + 3.11.0 + 3.1.0 + 1.2.5 + 8.0.3 + 1.3.4 + 1.6.1 + 7.4.0 + + + + + jero-boot-single-startup + jero-boot-base + jero-boot-module-demo + jero-boot-module-system + + + + + + hzwlsoft + Releases + http://maven.hzwlsoft.com:4000/repository/maven-releases/ + + + hzwlsoft-snapshot + Snapshot + http://maven.hzwlsoft.com:4000/repository/maven-snapshots/ + + + + + + aliyun + aliyun Repository + http://maven.aliyun.com/nexus/content/groups/public + + false + + + + hzwl-maven + hzwl-maven + http://maven.hzwlsoft.com:4000/repository/maven-public/ + + true + + + true + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + + + + com.jero.boot + jero-boot-module-system + ${jero.version} + + + + + com.jero.boot + jero-boot-base-tools + ${jero.version} + + + + com.jero.boot + jero-boot-base-core + ${jero.version} + + + + com.jero.boot + jero-boot-base-api + ${jero.version} + + + + com.jero.boot + jero-boot-starter-job + ${jero.version} + + + + + com.jero.boot + jero-boot-starter-lock + ${jero.version} + + + + + com.jero.boot + jero-boot-starter-rabbitmq + ${jero.version} + + + + + com.jero.boot + jero-boot-starter-redis + ${jero.version} + + + + + com.qiniu + qiniu-java-sdk + ${qiniu-java-sdk.version} + + + okhttp + com.squareup.okhttp3 + + + + + + dom4j + dom4j + ${dom4j.version} + + + + org.redisson + redisson + ${redisson.version} + + + + + com.google.guava + guava + ${guava.version} + + + + + cn.hutool + hutool-all + ${hutool-all.version} + + + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + + commons-fileupload + commons-fileupload + 1.4 + + + commons-io + commons-io + + + + + + + com.xkcoding.justauth + justauth-spring-boot-starter + ${justauth-spring-boot-starter.version} + + + hutool-core + cn.hutool + + + fastjson + com.alibaba + + + + + com.squareup.okhttp3 + okhttp + 4.4.1 + + + + io.minio + minio + ${minio.version} + + + okio + com.squareup.okio + + + okhttp + com.squareup.okhttp3 + + + + + p6spy + p6spy + 3.9.1 + + + + + + jero-boot + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + org.apache.maven.plugins + maven-resources-plugin + + + woff + woff2 + eot + ttf + svg + + + + + + + src/main/resources + true + + + src/main/java + + **/*.xml + **/*.json + **/*.ftl + + + + + + + + + dev + + + true + + + + dev + + jeecg + + 127.0.0.1:8848 + + + + DEFAULT_GROUP + + 127.0.0.1:8848 + + + + + test + + + test + + jeecg + + 127.0.0.1:8848 + + + + DEFAULT_GROUP + + 127.0.0.1:8848 + + + + + prod + + + prod + + jeecg + + 127.0.0.1:8848 + + + + DEFAULT_GROUP + + 127.0.0.1:8848 + + + + \ No newline at end of file

    #EG;L=RO2K=r*h8=gp_=)wZpj3uc^R#cbLFBMM`J3mXX@Q*_a~`!9{N1Nuw+1JU zAn){i;u!EP<~qmUM@(`JOV+?!gUaTUUvi?ZeY?q9^$2zuY)&9 zu}Qj*niy=?MU0;bV2bvnpt`3?+`y(7)rA>PCU)<2^miWoN=fXx38K8+7Rc+DM*X_& ztKQjczLUMRqDOrCV=CD14rI-iY8cH7Y z$*SoB1>bkUnj;j*@CL9QY)W=Ax(PC2`J3^#-t+{VuZXuwyF zbs4AR&74-yZkwcoEK5r{lA|?nF3Mtk<@g1zJ-SYlXAw&ji7NYMt7#Fg98v!H4DMoj zRG*W8`IUgmsrF2JG0sLD;&UwZ6W=ZGA;huxJs7(*rgg{0<0#pF3*&tZ7u zb;g`$3kBW`oT0!>RvyiOrA=5HLc-CGwd7!T@T6DZ2Lz3>enk3d-dl>izoNjlc zTjW7aeU9NudEaQg#K?EHJAAK{7t&8p>DtpIopKqHYi%y@YMRTk_IHUV@_GP^>65jWWC6QJbVs%QE zA7c^*3;n|QM2>2)iV+pjQ0%^o8uDIh_0uMA5nww?ZL%N5I_6t)F}c=2CreL${Jhf%{6c2g!r|FTVI_y+k(S?8l7rfwUsB@=3%=p&f+-liqq3TIe*>Zi*Mav{&UQp5+;z&26r=lu zuWl-Ts#2EL=53bN*8 zEndBD+H2%dkpfMfMtaye8YcM(NwXocxk=#ro-4N*I(^sdcb~SY;%SeEAl)+#naVLF z?eQkvs#m|6J*5p*(fEfnb&$RHSWVsLxN_c|IVvVXmPxBU9UK*fZoq_wzdIeS6wRz< zfo1DNL`+^i925Y&(J@_+Y#)?rE>y>CsemZ?$xn2o_DgP>8I@RwS%loni8lj%X z$7%h%mh0wJBH`Jbw{<)Neq>dnhO%~5-j#7jbJu7sQF6=zdVoQ7~G)`PrF zZ?42c##Jzy-<3;ajfh@yduDe=08X8&htaXYnZmLx)Qkzp4K(gC9^a8lR}JxADS?OQ zI7W4kB7{k!S!3>#JgPpCW;@sky0&s8No)Z6PJYg>gc;-}Tt)lTH-rP|Hpku+%GUxb zK(f}RUjxoFuUH59NX~evm(MWDXLe_^-Id4%Xx{=LTH1cdMIcQ;ZIZ#EXaReG zD_=J@gFPo9+Sg zu-8jOMEdqPW!XU$a&}h}yq2uEXJu3>ms@N#(e;`qBU!$OVR~5U z+jdS$GX>+8yZvL+KM}UDvwxD8!wB%h$?=uLgIEeywm_3f(K5aL=#|bb%RJH{??WYi zy4*tW_#waIc#~UA$3vRu*g)p=A#QHIjlh$C&^;xE=q_{maTjm=a2267SN=urtcTAk zwdSN~-c}*1u=zGXd58vxEFO^r3yhCs39!{!7D0Q_V(%;gW%Uo(jq!-4E1;NuR3X~r z6>^m;#t55>ph)GT+GWz}k!{tU(ji*kD<@9zuwqD2;hn3AJMy|cyQXqfr!xy4+YUQ- zJEU7|A+)3G_wu0vpgV#~s(5ok@4d=JmD(B|NH%O8aIjrPE^gfs95z9ZiqC2@cYDPe zkWW`^S2a|m!V|tVH=`Z450_NAlXT5lyXz&1b7!4h{$mM>KgBBUP%l?mN#2;loH^I^ zxwFTJJs?xpdog27#~uF(yBKkG$DXp>mS`qD@SC{1yE6IS~U{w^^X#; zKvhV``W54wx?;VCx^mJpZlucuQ|#V0GKM*_Iz?q}O*S_8i$->wWi~(-{ES9+)ggtH z*PO$$TZB>VZBwVG?8#O(#l)PYt%^_IERu1z)`d*!l7;O~Mnq<&$#()Q$tr|XB!CLJ zD=$GQU?8^=n-aj2l+W4&Q3yEtyj9wY0E>>4zbGPJB81|HPGU&uI3nq@CwJ-A{nmwm`*c5CSbu%wky8Tto zITQ~w2ztz*s@?KFZiKakhxO?3sLF~Nasl1Uwl2CU$Nc-2jb?TeCCD2~qUy(}9PEcI z&QQ6R1R9m__3Bz~#LDf{sHkZ4H#{Ed+yBeliz}HxdxkQqNwa`$8|S;+zm4~wNS_P( zijB&4Pl;bec{O9NQxNJ>hsGGrZg{I8TlRKomlW2^1$q>tWF1#BagKz*`(~3QI8K#a zl5gH3ShDJNULT*jB=fdc8R*wb>sm3}aN37rqJ~XoQ5!O)irUR4ju-dc1#ZvnNxPzp+3cxO#jI1ckH$-$-IpRD2$B-T#sGr2pUhz>* zp#0=ePSmUEyrP8nbO_DG+gFUnc*CP}oP5=>jZUV_0Y1-sLXUIl+!YS9o#BnROtFOb zvM)9(eSu_p#hy7p!?k^*qb;RDMdkgfI0KSpbE_~>4cQkQt&4oPJNalGWkyHE5Wd6W z{16bQaSp(0ntULfQotG>tj|kT4kO=axIiBRFAKJwKaLhJG?}Z){izdJ`^ap1jH;gA zbe|~zkcGEp<#I-gq?)CSF0cl>+SLx)@N;VJMB9CUvls5D)3)K z6t+G2#4@m00hYL#<1Jg76o6|i4l96jo>JJpXcKSJ3R7@%apX9I$k4-?zSB&rtm6d_ zUdLffBz0lVxjduV(v{|53Rlq{#Ea?Te+yi5yWkI_)ivNkXOE*<=2^By9sN@?w^;s_ z>$5_`cu}r)+50CmBxPp}@zcdemE#~eYsft9wL4h(QmFEfW+H}UD1{J~r)zMkPx`>5 zabA1O4D1SVz+5?oZ0nhu{W`#LzwHTfwe%HRS~Gv?sFB)|5$=(A%epLgXhQD04aG3=lzYIcR!hz@AWSE|=PHgy!*X2p4$>+4#hCEd}; z^J}N8n`iX4V@Zz#3RYK)n6@sf$~EGL?OJWq*@r4dwJQyq;J43A^fdo4PNh*{q}Eg5 zFz;&RE|W53m-R#5mo&rX2&oUfzqNAnDTUhXsL+UxIIV3?(N~Z*Ec;wmqaY)2aZ|e5E z>lJg-+ywI#Bz>}s=5V#>V>*cUdX9$TaK{o=X`cSps*8w~TcoO0NX-x6ayY)|QSJGj z=rS}LJtyXOMbPxz+vOpYbfnzbX`+{mse)ZP&Q-1c(tVqAJl!hvkJAK@o1Ori*@;)s z>B;*<#w27xrZPAh-YycMa3J4PQ37woh@7@l5L{3lJXnfuOjsl_K}*k{)xu8}KN z(#_b_qGQOdO15}?>JqA{lTHwW>klP;)8zCOPa7r={z`fHuA{7(u#YOmeRB0s6_i^| z_fQ@xNtLmTEO9Wti8e-BQ|ootMQ=*U4fi8=&BJ+fzeyyJ1UAsDJs`Mr2-9WmHRl ztr!pDx?ny&7sGsn?Y5mZcFi98S8CfmwTDB&p|7T-_cRK#xJywGH=pWKt3lvI!(Y?R zpdGziN?}d8MP0^de;46x0<3(@R6SECC|)mO8J2^rVV4%V<|hkHTVc{h=6>vvxW9Qj z6Myihtr+F^PFE81mX3;a$j|%Y+bv^AI=3pkaMo^N(CnE3O;MBPHw-%!Ce~Xt1hUi3 ze%YsgA~|ih9dv=zVH+asbd0E;-nvxWHFw6Z^~qHcm!T@VZ9GgHw+wly3vB3Ad3yui zW)X}zt)nZhTbOjWO%`kI6#h1T+Z7;xV|!C9=ft6*&pb_#6C)Av=UrP4#~SPU+ROx; zR{Xd=!uZ8j6~nWo$w{;Wul-^J49VEr4thCJQGN47j$M1EqEjh8o|euQjkAYzKlR$9 z47SLqmgT4>8}|0TXz8^lk+^^xnqm%>GZ|-dh=}xj_-UV%&y);UH=4F#cKs&g>1R~c z6d#syJb6`7654059jGdwdNrgkgIz^4tkIOg{<=^;a#X(ked6}M6cDn9!RzLpl7?UrfrZWEfy$3`C`jgA?MVqrlA6~pm|c6ztO2s zaM!$wIxI%g-u!m#&VNxOwW{pSH;uHM!YzBMTayCcu|`3Fo2C=3^W-nlB$~yS(DYrq zb<`HVQrSfztAfAkcG!;c#&3gW*CmThXuNCl%?@@%W)L56jzL6sZ#N>x&Wi1=#DGHD z)#FO#HEn~QdDpQyk0*CZ^R|ODL%PZ(#K!ScN(Q*)aH}7*W762=7!n>3fyz;p(s<3y zoHdD$w@KXX2!3yat&Dq5%_;S}Co@9iv$e1xr-#EXem?AaNZvO?dDP#A_<6y$jDKY; z@rsR0c&7G{0qnj9i6N`pf=lNmzqL4X#8D*1x|u^>@8cM4VO12WbaFa?3()_ z$6PPUa!?bV2uKNBMNcMl;c=~h49J^4Qwx!xeUgbwZL%>$)NTm3yom}~8VnkKrR^;k zXL;r3p1WR>RWV9_>^E9lvK~N6J-pE|Ls~li<}Ni?`yPWIf|dIFkfD#)svBX0yhxTc&w?l65dElArUm{+v~1bzxoh7W8+V*kRhwt?)+q#7=1E8{>LI5jLgYTp?&11M zNNh`YzBjqdWm{kvRz0gRqk60wZ#Cb5WlG`)hQx-O3R^{AB2P4ejl*0vy-o>-Jft_J zSIcQx%XPu#x*r4i*3mo=a7?q+UJ^au0?&aIOgu@j8YxdBt3$nTJROjX1p zGF%8<@(wxJLb74IQ;W(vU32BGRg7QJ;E)tN+00>r`PstuEmu@j=cA&PbP_<8Rf1+p z+jWxyc9mbsGAfe6d`I=UI~VdeyU`HBzp|Ng0uVAGeFUubk{nYU zIU4#HRVz%w?tQB0GEN^hhe8-_Ty3c4=npxgjqL8*HLJgSq}31G*NsroKAxh6^G78h z7H_1`WD#CXH|D>iLu$d4fx#cEekX?6p;s!G@%vX_G(`!r7o8|paW zb8mujo!1;i@p?%vQ70h|(3rDO>09MpWV+Ew$GvVk03OxmQ#skVv9NMo!HD&F<8RiT zAp86dOqBli6*(yeZabLRVnxk*k?6S`r@)?k^{nz8c~q_HF9ecwcj9DI)h%new;IEa zMag&aYDC>5jYRmYtyax4lCGH0)*Z2)kiyvwVkyw5*yj%sy1ib0#}w`54nbeYWz05Z z7eltN8B75eoCPE!H5TTxu&c=GKdL=&q%mA~r>Q;kG==hduAJcDHOCw?C2HdBxWQTc z>m-Zg2I4-)rz_B{P7&WeT)DkGr#+g?ou|90G=K~Kn&X0b&1Gy=>>@czNdvx9`4VR! z?~+|a=g5QECRgmtQpn)rMw0e)I+a+= z!tdyX-}iwPAB;bH6DF%FO`t$cHd)9*DG=WLV_-+#tqg2RBr2wZgs@T3i7UsxZLQR_ zn~ovnnH>AbsJO$T_fd|29ej=P^hO&LYwq2gkka)+`dHbKP&BS4hHfj0sGxa7f-;Bb z@NEPiUh9mfgY;R-E60qzx+E#x=HQ&Wa(k_!ns~79_)_)Pa~;3BvT+_!%&EKLQHPwW z2T8F!-dLcHz(|#!oZOrhHf@Gv>uv?b2$C(3xg4X}RfCW;j;qT<5BMx>AMJ{&%{V~N zCsvrtbEV!=fl>y7dTL}e(`rI8b3m= zU{>M{h2`mh&1C|+hdur9S+%%~yJwclU%8M|8bX|lO#z$X>|#)YAjGsf1OOs%abgxr zZjO*$Z2PN7T>3%N1ly$W+U^cw!2FAdNYplQ2X>!;gHS8S7-9308K3BK6QxUe1RC-A zeIeX;HwT8kQwY{QgstX%#H-H9G8@${$wRn-(~hc|eq1?s zPR9jd&El}0>>br@dz(fo$kmiG9F4&F8BjTMCi!5O?+sZ-UfYl0P!m1qrX0egdfJNh zXvjA1WC1E#RilCI4{rJjtYjz~N;aRahAa})Z+Y!lX zy(2*&@hZ=lt(e{>c?g$Y>v_et2Gvxi79#oXO#!6Tw;`|b7kakam+Lv{h}T=qVQa0e z{LWwoO%sqO#v(*xmg4dDNOtC7yNheeaciQd)QmhU5MHn==g6rKBv3PO} zhd7FtWEawFzsEfj3)SVhlvc9?I}^aD?!rdgvk$^FIc4`YgtHqQ_sk-I0rGPyAKW zUUr4-2KCDAN=V48v!La+kEwgmW5_-hgh(3gb=>^iJjnVvk;qu?HS4C>nb*>ok24aI z6rEHdP9swVNnyX?317AUVX~t~#Wfi#;K{C8SI(K+vO|jY4l)_-Y|s*(5Sfe**%1Iq znRzs)kHPLdt*R+Dkm4Ct)Qc9ic0mY;Z>ro@H}t*B@>gDQc^=zDuwH}_F)`xJ3#4n# zL+09R%J#-gH1AT%rm@&Sm^&}qL{qY2q3qlE?%vQ3C`0DBlb553%60N-yUGt)!bjzp zsR>16u!64~S=|6(w3!jnya(9LttSpy?gn3CT263?%&umj zg{8_~H`%^zT3Gq3qe?Ry@_=1V4%lgQ#n@=c5m_+Zi`LugMYlqy7+|sYtGV4lRPZ6gJvq} zKh6)!?F_+^H|4C$7L*OTZfmZKDitFicc)1w9ainel#w?Bf)Y(|$gJ-o2oCuxN71;! z(6+8}f;OROmb&P$=9aPtaj<$rWLHV|@(IgEF-We+Q` z03rQv%9ry5_-W~MlNkPk732iiTyY`n<8!b%NSnW3m#PU7GCMxwxzLG_rIn%K7n$q~ z6XjT4L?yz)p)oXSdaY`j&I0h&M|E zu^=ZR_%E;h<@`pI3p|@5sy$W}wj?qL(RCt;`9_k2>}d`(bfbxCSZ2xE>ygv`E`Cwn zw9EL8zxAXmq=c0iK`i8sY%webaLr1>SB{H-t1JAE|kjzExcld2{#th-Gc4JF5+RQwB}~@j|qL)9-Rw2?*SwyO;nNsV_06E(}~c$ zv?`duOmhsgwz>sbpfjXR8sfM*-rV(q`bFViDsz3FMhmbvR0QY@9SK8fyNJ*1b|0!d zfl)c&+oPFu6B`Msodb~b*%d)_j$CuSOS8J1=GQ6r5^f)RY2+d2#4=UAQS{2SaJ8q> zjRF<`Q!!|1E6VfOcU4N^Ye zkn<2h-q&!Vs#lO*MBCr36~K9H6{=?X>s-CZLN!*X4;2mShAb)mA)OEn#v|ZYHP6W+ z5@E}_QI0BclTNK_KiWK3PtUI0-|rE)CTa=hXz+Ovi7nN&MhYB9F=KE~Th)R47-R0Y zpj~WGOq}cyapSL(jw8oMH0g3zj#j4fu#03USN!Xc?NF?_WaH7;dsj}XgY{fpJ1tPP zbOGOz?^fK9B5@TfYQM9Q9H3-8O_;Npq*fAh{`z4HjE9|uPGl#-Mzu_T8wK@sJwZ_Q z$#t5*h`RV0(%t3*=G{vR>;S9gk1b%k>b};to;06jw1=cZP3c^s3B*KwIyDocn!Fm4 z;G$x53w}s0)FF>`JlJ%5k^WKwN$YzW3V=EOxMCVg(UEzm#yM|fEVP6VsLyd#HAD9? zA+38|EX*}N{d5sW$Y_YqZg{kJNXg}uHCerla@hH9ol~NVsw%%`+q^Sq$1b6K-Y-b6 z$Tr=)QQaZjDO93v$fbQ)Xtq-Urh*XjVpaEZ1i(BovT`2AIgxKeo^16T^wm@*(+=1& z3_1f0y%!Y1WC}f^-s>8&D}ZP?N{{CI%taVkH7a*f?qK3wd{mvwkubGKk`D4lClBn1 zuweTa)wyA@M?Z$}16xf<+U3oPNyK5W?ZBu6Xm2oHjJo#thLaa)+FP%jzgL$Wfjb)c zyFaQ~;hn@2kg=L7m5cox^RK<99XJaTw)HcWY%IFq8AOW8D~HA3_~z6_C8mDuIWJBd z`dN!Q-HLZ>$x;fi1(wV92WQK?{jht$9g>6G-||4xeU_|_^C7ZsXSap*ve+czl8GSB z&*Ne_xujh*v0yZ_1sZeio?bSBO(O{r2RPYE$X+>FGp%V(T5g6bXW^PF2h1KuP_8J2 zn(T|MGDOhe%I)I~l`9?D!bQcbOq0s}aurc$Ng9B?a3s#FnU^rmk0!L^+C)XgMRSbC z%xGzNG%qyf;OAajH;d0ao6G@0JwWBCxTWDGXgU{-IrHF)+=e+Xv`6{aLy+d$lV-^H| z6#Q0zdR@r1HMzT}Avwy2ymN8bHkAcm9C@`r3&xJUO~oVon4&ZL^|E=4P0~V?V$)tH zxy9d<;G8iW@5eVKo_9DZ>CFU-a?b%rJKAk;$ffe6(b}Zf7=OzdOr%J~Vv6lx##kYo zkV`PorCs?sZobzfVXmEAxh@8+Q{C%bIU)6SX5o?(G;#QpoJBp3cb%KJHN8x56>(iQ z5^6o0afZp_mbW#Rd{?K4zuWd~x!V`cz@ss#H#}5(?YoUH0TmN1lb!^*tXj?ODW!^W2;b;TZpow#aPF=SNYd1{9gL=7NjZ*}dT)9hz?7#@yDcs2)V% zr)fbmaS5?b|14KAi`b3b5p7ns_KC~d_fC?-t_!VSDd$T)z-YUqh{(OOLs$w|jN`*_ zJA_L7#$l*zja2Od6VD#!28?+id%?h5@RG%uj+zNGk01tMn&xrG^f5$KAWdBfvLk5aoL9< z@7rbCWAEbNVb-%=m5Ki$xIARnJ6BUYeHgBIwJ+R)Dn_~<3M#WX4-{ z^;+zZIXoatpW9Uy_Iki+urGHj_iJek)x{9Fay(~mUcN(8jW=RR0H<Zsj=T+6OVl(bUNPZadUC zife6Z(#?oNhZ0*UE`wKhUIhp-k)&7db%?k5JL=SQjY%B9y>)v@2^A~FCd6ghSCQR! zt(|3sCRc4VOTn`(h>zo&Q;tJu4sW%^w(27+g}JrmdeKF~oy-52k|XkvFM!<1kxhh( zl9WIxggrYlabIRBgy-$HvqwzNva@&E{+07UU^}xNw!i6w37E1Q^Xj7D;;_`KNkruO zgvD;7+$DWf4%!oF%PXp!D{nu{9n` zqjs7`A{6kg+<&z7hHf01zzBfy< zx4vykVZAOmK98A&)ml4qX+qT0;X7_lr$Q53mh5yy-h7bL1#pS-D(~KTz&Ij}`iYW4 zs1pET^9y6Msf5~MjkIyFCt0~!bL`v}!1|e2*Q1Ti&fD99%5iEZg8tpcI?Ic%+bO0t zKh#}x(a-zBmme-DHewNoG}Ne^Lf9Z=eqTQ<@Cl~k6u%`vVC8@w)m%S(^SLC3EVmBL z=iJk?bKy3$vIIF0!f1=?G69RD)&Jcd4q2LB$U*?4dAgc$-sm12Lk8L&$xPDCR0i6}n`%nv!m=&{ttXk4V6 z5q}62q+rHq;tJ#1xPuIA5KcOQC&}6 zAxKJ8^n`NpnDD(ALchP@2zoxjaPNL$AG;cQ6G1=FA{3JX@k6{9{rqW;t%nZ zu9n>ZfN?bZgldQ^?JTS=+^k=$twiHTk@ zC%0a~;?h|0$z>6w`A@fo+xw7bB!oGo<4m(v338N2R;wym)ctWS(73uE50e7$(7c%8sVAjvD11UtIAF4 z%_SehHFqXpH0{D`?p{_OmY$=WytS+yRJ)d#(7uj~k^bXS z>W|7fa(u}OFqdd}m9G8Xc5fEKz8#f7@pnPSTiwOPLS#;?*Dg(M?qHCxJlN|U-%bXUy_Y?B&@>o}XlLkB=;T@y-OD73(TTIYn zwtdY7RX0owo@(5ii~xGo$+Q9tR}*h<5(Qrq4y&7&xb1}d6&u3Qexj+Ig`J|g_9h#) z(lIMUs;_cR=w*CEC}!839r;>Yq#2Fm%_b$6j9Uwpn%W;ix&6+1naWr9QaN@&eZA~v z>RRJ0Jh4MNJzb5&KL*Q}{SLN!Z_}Vin|B=U(i3EltF|t4*u>)Ewn>ssHrQnpy1oOc~U zRUXo(YbKmvy@ncz7@zePaq+dzbu?i5AymBp8)wo*{_p{1qWNPnFvt zdv$rV@ake_=3;#lJF4^PK)xe_*?Ani_KrL0_3i7HXqu93%0IK3-1v{{ASG+PzMF<& zVz$jo4DhIE_N{1)b3@r>hMcvStIL;FwRen$?D0Ryu8)LtDPc64cvYnzLHSl|)XnE74}jjrwg> zuLC~1(Xrv^oS%|B;)Uo);=M^DtQ`ICyrBF(IV&c$2wi>3_4%aVE-Vfy=k&_i3r%k> z@Ojq=on4a&>FLN=T3|FU6(j|va#(U{Lt$MK3-KCi6Q#Xn%t4&A*H0(M_0!~c69CcO zXEiFmy@qEn?ERX@^?Qy}tDxfLHKI&Sm%G1sLtb8(jeqScB)a_sAR zM7u@-lSHNKA?|;V$~jI%ge<^?hGBXe#<8~uYJD%tkqCy7OzZu=qzE7nVh-*ofdlLc zNmCjU-!^+qI+z*riEPqR2g2mRO^Z5}A!JeH zXr@<$l<&~2TYzaFVZtwmOhY+DMrkzkgRA>#oME%YS9=WV2i28y2`LIOq@5MeL6T~R zO{QG-quhcayEq-<70*L{;;G{_f@)&vZ^R)*v7Fhz5d!7?lOI%pP6x=oxEQkB!w^YZ zSmAFxP+1}k+74f^3zh)ZFZ+9X1LQ*dA&IfdxgNUH5602jL}bh)bV5XWhX}*HnwF}F z27634qtbGVL%rWuydcL#M!k=n0rZWGgBWY>@qWei-<*zXcz4PWx4F{(g&{)S$A!bcJYC8k*jZ1xwM9)sjG!loQ;D< z?&mAjOJDr&=|PVw*HZ|6@gXlGQ8`TacD5X?4%)C~AYv_w%e7}e*Moxp_;oZp_(Hm_ zc|GS#ZE|6~&Nr%w=8zIAukH?G2(j^_T#v>MJI2$4Zg~y4QVt?ouu^+_7$*U^lU}Lik3>^oVRJct2Tr8vFy zDP)OwA?bLp2TMI}e_Se&fXO}%8PX%g2~wWLW~x1OreD}1Z!or4wL9&W(-P9n$|0L_ z8?@+FI+N33kDnm&UrQb`7?mC$(ncE6<&t=ua4Eu= z=p*@-BRMR~IgTsvHLAskAY|yB0G8+$i%vI>R^_I1S}te6oeDf8)$|naYSOD?1Q}r` zGD~LKb~qgws~5=L2#K@4niAp&zxL!0edR<9n`7*e(i)X?qnmXh)i#Z&ULl>vtS2Yh z`REsdf(ZrXVGwyOKDn7WiC7-kB&#!p$8dAS*H|icRAOMw3kPAIuK+op1NKZ~h>d+t z2m5GBOW69@dH+(aAm1zF zFv9(Mz;zWLSm8Z5iprgfhb)Ey=`zw=&q;^sGJ;N_&g|=?JctA}Ag@qcL6r46iKWWF z4`V#12SBDkL!^)-O+yLCw^{h7=4tvHDVy)S z&5~mZKW;Ztxu>wC>^DGDPcEgxKyEvN>im#Wr`9og-H_c33t_6=GH7VuX%0Ifnc6=o zVuVXvP`5`zZiue1oPGe?SCN&YSvgQp2|6Dio*3ysyHfiCbUfFoSHM;&#?SVeLGwoq|@sjzr%{%*Jv6- zI?fea(uCzRC(+J%552Na}G(M*P^O; zKU8H4&dnXN+aMv!`3z|rMB|e2nF?G+r$E5Y!hi@)t)@LgS=~G%FCVU zXwOE)9%}u_rJkk0NznP)Lw%z$V;yj)3MN&|0X;xobqm2kQd-&#uM2pq%G2OC z340lH#nfFr7`NT7B0KpNlc4eX)Tcp4wU0iaa(Z*kDEG4fo>>07qjAp>w>0HD5zArw z#7medg>*RY*dc1<=>KU*Z>zPWzM#HdL^aipSfA+^&^s9sahe+QzalmProF0MjvEzI z$yBYPsgj}+xrv9Idc6jROmi&+({Z_xOhe=LUvr0b@wZNKnm($1 zni(Rsr17TRsxg}RSPr5dt{4ThJ{5S}c{vez!0`&8po|4Y#6Oscntu=@g^1>~el}0u zkr1i9@oQd1I^&i5^Bn16bAJ6jpHkQFAdI(a%3Zgk7lO4amL>kSyZc9W6~tYRYtHjM zSIqst6F@Ep&$Ew;2dR@-H#-tK&!o!Uc=vq{fLFunr86RLXzZH5cVj`#5Wns3yWEfQ zd&cT8xvtfYWtSVTASLrLaR*#gJu?oCpu`j@*gjQNx#d2h;`#lti;@}_8(!T!Sa&wS zicZ%auYJbJ{JalYN?FJ!HfYBuK4B%USME~wqWZQ!gTAwIujpi^5he>*wm1=5w>0Fp5Z;&#m%P<2$Pp-W9_g+mNtt7M2Z;b*;$F z-m(*?2k#-8ilt}N+RpE*oJpFV>8zfSh)ULJy@bqg4#^pIT7O!I{~}mtu;?zTrUeub@tj<;!jg%{A5YBM@@dlkvVVM zE#VQSSNaZF4llq(tt7gb0JqT2kH2)O*kE9cP)ik6=^@E|`{F9MjjTewaf*$`33{h$ z8*1vI=Drg|l0(wPv6_so9QTxo3Ms5zd-;gw>(TY1gG0!!^=kS0A)a`-1Der2)(G1t z?bL+UZ+ukyWJ^^22)WmzAv}UNFEAT$b>Wwe zf5^qL;*t)dkfdA1+G01nGYLS(el$oz`k;rdvIglMlTkvdNi#>IcX8 z(qS9H9`o^oAH0%05ow`q30MD{93G&37$6pJk(wO7qj`m3y%;q`jIEg1vopAyM&kfg zK&rnY*VSYxr#&d=kZc}Mb?Km<3gx!pAD*m+=K(tKNcBg`up)t$Ex zS0qm`70udQvAp&Odt)yA$FkC10Za&;uzqGi<f^BQj4{ zj6?S1sl3`#;W&Nz6pCGu>37XB+H20d%A#0vKFdYqnAXy~n$0Ze_AQLCYac;2DS#P9 z0lUo;$#b>B^ewrchn3D-vE`u;Sxh`+F4}1L=3aA@z!oOV$X9O9t_+y~;2GNWiV#P| zE9VfpZj!OrO)T7*Rj-PYYtJ=JVj`q4#SL#CYZ|sIRH*JX*r@jC$=~yGjqOYe0b8;2 za=n?F`VFD3t~vgi1`Ns6s%qhvYYs+=9d<@ZISxHA5LF_*a)sWGCLhVQ=O3@!awJA| zTwpoNK{@1+kmF-9Rn6z5a(TP2@*NH#<=?GXA=6lF50Jj*eqangET*R3HW*b$)sRI+ zm9rc_rX`gjDrv#j-j5Smc#_Yw`CZf;4fg+5LFnqrIse+~c;g-Iu9MXqCfn^8#rC#% zrdrNvzOC)E4yuql4BMZ(Q34@E+IjZyZ$h-i}!bs9U>&i&M3Yd=7{e%l>F~ir%f}r8Aq=xqYrR z&-A88o9SIbRIarT;Ol923DkXd48q~^S+G)M8gTxmw5i6lRJ@kjlyBm2Si{X5d`WGn zc6T+*Npov=@0~$>b*Y-RfE?%jI{kcq^G*GLO$ z!su+rW6aJgmk}4qPlvHJ5XNaZ%fa-+ne+QxAR3rSu1Jq9WMkEh`R1`lM5cEiWA9hamf7mY-&~IsYHO{Fh(;kC$f|wXSae;xVu|s+p&a zI)*xr{=+O=Pcu)tF78>p|MQps`pf_R#-wa*~ z*@qz^)`Wnp>Na=f09yf=8|O7=1!O2)r{>;*c#oy_60E5-kUpK!%E7$bNUp)=7z??q zsSrN))x@ohzag?(zxLeqF|RO;Vtth}zD5JNH{kK!-adth`rRXq_D-KVjB4W0!*rzR z6?3{ZVB_ps>PTpv>n6UqZsNy#-O1SZVT0d8GS|IIDgfBDguHGlx69lxlek!(`t!*} z#{bHb6R=BZA*u8Oas>pKveyGTLK6&2G(M`P1u`+ZnoG@tSo51;mCuJ7c8_{NvUEpv z&tgJ$a-oqFG`&MzyxKgEVSDT%Wcdvc|74SeEEOfBCy`sw=H)7XPlE#XlpG@e(t1)r zda$mlKPxJ%>!ZWEfitS@X;i`tO-mD;Y7o+;gqnjb%Oor>!4Rj*QGL%d(*keC_qfuP z+tY7X*H(d`*aJD$G?~>iv!&{+Px-Qx^RWrpZ(-DwblD^TtlI{|dcJVTEWW7rxsYh) zlMX5C=hfAFf0g6ku|r1nYNAu%jgS&AN0XEHmFqLa!@4s&sw8j7-dY;Me|kvKg)7IX zub*_$WJ6Tg^CA4TLu8)Sr?gX(cI7C5jTuHJtXI1o8j_e@IaW&jET4gmapky`uN>dZ zwMPZ5pVBZEGSmY+5v!M&arO#~I`Ocspw~~qva4N)*=`S+%eiurnBMrP!)=JL43?Eup-frbUq}UvDAU-KXw(i~$ zDsK;U_K@X0@m@K8uakpnxrLs_9GHvCbW(1pAV&l%+Z+D<;wqS(|yn0M3w`^#uMW zVlscDa_FCk*+T>XF_lDdHhL}+2t{^!6HIvJb|6Q?O_k7Je2r=cX=l)81<<|QhD=eq z&6aLj;0=NkPrP`JFuB_~;m$!7@o|5gz~y(nw6&TlYrGp@C zE&~vi1giu;WF9E$1yy9;r6#!7gFBODC@$F_rsYQLA2SSEPN|xAmS>R%(1%|!n_$a{ zr*=o7s&W%V<=Sc^&KH%A2_ZHb48HBRn8>{&wI7+96TL_>K{|ruyI~F znb%EK_Jn=0avm5OLY%&umQIL9s@3tn_LjQW#Pmh+%JFa9q|=8&GPB-v%2vM<(P)+# zqnuz|43xcqyP9IYwi_{-a*MUyG5e$Xy8tQqsDSc4&ReO4j>Gt_>vB;Q6z z`4}PQ@f0l?_KGC$**=Ijc`KAwpN=+`+wk04l z(1%H*Due1kio&-&jR4QTLD z+@cyb`Z(j~r8^-k__uF388L}|-+a)UnfIW3uLwXlQ<*Kp3RPJVxScYP(li<|ELA)z z8Qd)>q+I7ArItRVt=7I4E`Q~gB@tHU_SH1y5Yly-o$FM#SSQW^NM*wpkd%j4UL1EaB!dmWGX;^N`=h(CqCo+ymiPVtG72uROKT#Tt_F!y^4VLSqZauA=Z zwAe?$E`qOF_GH6MIL#x_Y#}X(Ype|bav>J0>dgQw*2@$xFk;D;n}aD8ZZfOex?x(T zLlm#vI1BcTu0K92d@}h?|D7}yb-#yuA+)kFnCV3mD8Mt7LU#7D2&X(CC9Rtc z4OrF4+TBS@Cl-~}lM{O8jSi0OQpwlMLk{vU1|=!bnp0ZBYnnmQphM2{B!1qHMxkN? zJ(0Ac!H{VNM3PE20k9ty&=F7OI0|--J1o69DyI5Ax7*U!Zca2B_a(>p_4Op@vht&H ze%EeA=tD$z4k<3u^jgiWf%8R`AWF#)*!aVj+WSX2ifxNK2cbS!g{w`K39NsmB$b_1}tC5yT}q&s%h9B z{t1~gv%u^u`3#txAjoXFo1PlL>-}DD(N2MhEJajK`9?q!*@lp!m)CBV&tX#+n0Rl1 ztoI@@da5QS67I%v2N%1?Vw-Z0EVZHYdEW?bi@WeqtfZdKMu*&QlS8;sSQgShji#h@ zW6E|rqO#wYbY3m_u>({CX(t46IwR?RnowRoSj_!~oUI^>|jVPc0zUDZ->2dPb z)6#d%SEzr@cvrXJj@2Dw0;??ZHvP;L$R5p(RdU+;9Lbp(9P=n+=ySvxCAoI)y+#H3 z*3!=>JxjcorfTOrpUN)YRKb?Uz-Tfv@7>T!bvNqR~r=d<6i(I$9rp;S> zN}O%;sJfz6@8z%~Di5;1`{9=XWm@0YE{cFiTy10Wk(2Lgn9dlu2h8foI|{Fzisk#7 z5{w(uGo_*`)9U-A(fi(~Pbxv0lti_Y2smFAuqzIlxz~OJkfgA2>*@tN3Siz`_&9I2 zyZEo!uXfa|tDeML&FgOrU~{et#zQ^#`*XiB(Xwp-Qk6Obs4ukSkb8U$;*P+q9hgsc zirJciH?I2$D9kH#h$fhZ+|OGVvEgi3;;81IqY_WRtZSEG>F_xW>q$hv>4+7wXkWYA zeMhjrXB*`sn_i97@|Jcy}RHPOgEclpK zz%wg_>UqYmoimxUMGE%Dc{KTB*X-^K*Q{V}dp`4b9rdPthydb!P9WXc*mlwzHz?WH zYsWo~qiIx?tlDLM&6ZT>ROGks;gSBaWh(X*AgG)1Ls8aai1@{=r2OL@VCQy~v(|g{ zScxOvjE*2mLHZoI!NQ&$Ndb}O(+={>sWU&WYc0Dtv9%(-I*Ja!s#dI(NL+?LPTaLV2=lVFGOVc%-Lp4O zkY`UNMqtY*jXP(pLmb!yS?8oV1D@AyVOCH8dgdN(yRRYYS;DdF#t0~&(atzIvL`mw z#|r2J_>pme5uFlDMPzuj=dJYH(4Gwm;}oBgGRZ?Y1I?B~S{@pW!*$jQtOvzvSN6sC zAp3=A+{$N*4^w21e=B3&hQg|yi>LWl?+A6|$K^$DYbU62G$J`?{ZV<#qG(r@+K%TE zs+}t2H{r8^vnw&%Ta^nE+ly~mE|TYP-Vcis22@JjeBlyjxx`wKb95~B*Hx53IAy7u znmm&=RWs~mB8S-lTL+;nPJ;LsYyw#b z)N#o4y;jegNT_sN(X3{>zJ*^;tWs^x3PdtPyY+Nck`@xb7^HT@%vOT99N!3YY?6#hudBi>cBk(?;rwa|L1mOft|Djbwmrd&JV0uApK8XxjsR|$$yT6U3 zlOYDI2xkig>uH`aBI{A@;wWLHhW`+^dJ`5LkH+}EwnHxtUpd)^#LaLrlVKUZhJ9rx zj;2dRJBUqf@BG7>V?;!J-zUQ2;UW7i+Yl1E^MuL;ilbT>AFzNV8iKRWFNl2<(n8sEVctxcI3hiL33*& z+tvEwtlkG>9$WK%1z;G}-LgP30uV6`<1oN}3?QWIRIjV~reWpHj;dHjNVPlH(T0gv zm4a-c`rL*Et1@>~yYi_WujUq*U46r3yi9Xh7CwDsxMQCHT%sXp z>46PuD+ehjzG1FB5sl2q&(Qa)*kPjDqjGug2Eamn$R4jlBZvOUF$v6M53E>`&&gx9 zQ8dGxsgc_TW(+%U^ zbfgN4J=MvgiG2y~j}ghypV5CD2@8`ewPFG@`^hT#XeY-C|vI z36O(TGfvHI!(ISs($+nzXkF2a24!!~HI5UebD7+y;c(0Qc{|&DX)r@jquQV#)XRGE z+E$B|@xJ{lJodx*1n}7pq7TO~SvPCv8u2leO+KT;w#_Zk*XrgP=ZZ_~-6iFdY;yCD z^(=>;h@%APv0kaXAaT-jsV6H#c6DGKou5K)7c9DE;n+3Id>;O4C$u#GY&00Fe*34M z^HH7sM_u;}#@cmzxxR2m!P;3P90Z6s@m^A4pQv%GCsxoba^FZ?*Ub1uEJiko?vAoKW;F-bHR2KmnUpiqC%r zl78A^3(WIqu3|ts9|rE2&!HR(tPj)ecwfnum7sm9>i(i*KiM&Lb}HT&@rz zBl&T@1jOlD$*$x9)@P2dox+&L32CEiw@}`F&thcEmhhZ)=?ty*0^(}Vod&^;co_rt zy34hbN{BB^t0&;{dY9^Q) zpiRayGU^F41Wf6)0!E^L|t8yjoD?6XjVNq;DysOn-_mX)FTq9F9x;m zub=%bmKBkv@SSx#iFr}|+ zy!H)K1|-f9*jrr9PMxk6=@KBsV)kiwY?1K&PO{j}y}kkCdbM`8d^M{fds`%=*TU<1 z58bY--8K(W9o$rsu_c>Ai1b6wASe8^>4YDZSJDv8UP z%Ju$+DaC$+!Yfj6XcTbYs<<-xwPR$(Kn;B+HY$euA!naJdNyJ-%#wG4tj3%2c{@(f z-rmvER7s}xJbr(xL42d!&oR~$VSY<4C-<`}w@%Nrv`@W9((IgJ9J~=QnWKWNice22 zArw%7WG>dX0O}_nR65=49Ng1gO!Z^29wNA&R;;aE7Sd*?ugjUkdb0C+f9p%ZwtHxL z+p6y^dHBY;7v95?ezeM}jrzNL=0o1%I=G)u!Oz!`XmBFgf}fjH9_j@RX^FHM1g^jD2~l?zVcn67>VD4{vX@3foSAuNkWy(d+Vi+sy^sTW%>5jdX!Pv?i@#$) zLav~`Rifvt8{}h5>$@Cpn1?5~mM#>WMBalattGRgU8$!RJ#bvTBXNE0!CF*;qDO@t z-a*LVsa-d`zk_hcHUHwy0a?`N@;v5tWmWCmL8>P@zH~G?8&>LmaU=U<**(baN8;zZ zdD)7idFS9>OAK2XI<2qd;Jzop)pF8B9~Zb)a8e~}f!yzVl9&0-Q|tr03h?ZuCcX`> z@S>2G zL-wPz5Uh0kimK}vQ7sv_b}PezIL)16H021Rq2O+7jI6uTJ661+ylYSij6tRFn-D&G z$STo7&X_Ju^kcR0lGEU@5|>+u%a6)0U0l{$m70!5)!AuO*4_#XV5<$Rom-;UlYrs% zN3--$r$Gj}oUqIVFEXU%q7O+RszAwG^8pLu-nO@$>^y)5@0X52L`?$BmI1W-eY zlEg2Nex_G%{)3lc%|Uxo1me~hvjU)^5cflHza{q=ps}>Pf-^4*6}Cl@yb+Y~$PZvS zaYRe7tfTE_CC=^n`&ury>5+Xm#$z9d(`%g?wXU}*>RD&}z@%~F^NNSF4j>}BosOyk zvSJ|asbAkhOV+IktILV9}jeSc|_sJ16Q#furwu_s$w$bQ}w z$$nwtn(+ZzOITVjswCHgCqd;T*Q^lEnicV_RV8KtET9{aAnP$sH3c|kR9y#) zXiwGdW6A80e#GepM4VhmNt!8)&s6zK!j~hTO%Bpyf*_|U0Rt#!FkqfC+hG{ zvv&htvsu=tBr8uV@lIkUh;(Jkw6A3&hwZ{f$XcPFIfx<=G_(`AwrnyqWXyxC@?&>}+$--al2Ix`?`P@Q1djsj|4}8JH>&;cEL*`7L@A=lVbU*&ON6&g(V{B;S8kTR*!xVdocR(4)HtDft+zD^?BnYReu+G!Ce z0r{hC=pwe)%q^_z%C+dkSSkGiT+MEQDhRXT1}?reH#bc9eSJx0HJK#3&y1_@mkJ=e z;uYt=YnV};86+JyUnNA=Tu)9+@$mJuR2IZt*s}_v8o!hVqK!wj=qIXvYrW*geLHsnR{8D#zTW6KSuV(7;o|%*qxfPOZQJ6_wc+ zZS4ZLkiz!?6wvW78)+#w!&0B(gfcnqCU{m)7qn)Wtl}ABsXwbrCOnqKldGoAeA%^D z2y_4IX-1EcynI)^?>UjyWo2-gI4c2z$TGLbhI#HqRudoP4vl=w?Vs=7^hBnbO*Y}v zy1yKcA4`)}=t)2pgaX{ojPUbn7V!|R^F2Shn!xzVAmYbD@kPu++zWb03FZ*d&W$Uo zSt#USFT7m4$LjAlm(VOItDXDIw|=k%@x#b@>ke5pD}>1q4+)H%n1>KzEkm)HsVB$1 z*XVjapJ{x963D3;M2uuCt4QzKi6P}Jj{W2CsOBAqh>ahj@aLA;dvj;B6hP@I{-{>- zs+~k$C)u(u4+fzU-bP%MJ!sVs5mAHt9OJZMhNKCiS;gtme8Wty9@V)3eEu0knw_x) z=nl+Av|p6dRb^9S1ySItP^h}F&a1eH*xuF!vXoFr<-Vh-ylgb?NIXXStxLDVWC$Kr z@jooILhrgJvzV_dQw|8MSsMmv5>k1e>?Q#P%LC9TnjcVz{?gRY+JWT66-vsLVwi zK(fp6lu$>j7ZC;W#(h80kexD#RA9+ovGStg>#UtVTNM6eo@qVd^5mA!^>R}PpX_!t z)ic9L$dUQDo`hs>dFjI&_-0i*`Ll0&gvCe2eyVrj=@T0hu&UvpGq7?C|v=*F~XSVQJ<8sr{F0_?KYHFGkrnX1?u zg0vS~*%Wra>{yv;U=@~mM|%p0Xmv^}rgv}1yALRjyo z2jyjN)GSnoN>8OHC%jXMh7v-Z$4|1_-wWOsOfdZy@`wUQdJF$;_PjZ(I|KtTkv%D^8odAM{O4Nqbd%Xn9{)^9ss?= z0J{Luf~f`tSS-<5z?ThxA$dMNBx}4ihgDbCiDAp041D@B8Rezs zmQ1F`UR2mWrfOlwv7)(WTSJyYss?`*lhNdE)sC5esy6Jp>YC_vv@ji-M9O+z&4N}d zFS%9N8=&<>y`7!O;fXyUtE}}k;o>+wHN|Guq9`*0z=+xKr4|LH0=*br488mWCYGlx_+?v zdJ+e)d0~07GZpXGq#=9M)7KdP_63dqz2gDP018U7_){L}R_+^gHNV@r-im7l$f{!r zrfd>2+4b0zztOrSD`&98Ht&}nU>9(M^$_`}mUOa`Qbn()*?NE&=RUULW5-D-?vB%{ zP)@3_O~2otSjvY)+@>afY5NAA{+Z4tkynWy;tXvw*&zJpQ87752 z$)&P4stk^KFzLy~h9Tm(+7anICG8-!@^_zYE(F!;RbhJqZb-i^92GmQB|xL_V#elv zI`XyKFE*fJEF6{aVzYxhmF!+%$C+*W?r!OdrT1)L6^84axqE|j_u&R9!gB*~=5NW9 zcvC{@u%}EtBGf5|7~*;o8@@eo7w&5(3U`B2FL_Fs5%nQA0CK4Ht|N66H@hc^`rO?9 zboYz^liB?fQ(=YP=k`|WwG)as>!sIS9RilYUQ}%noZt=fSNmyJm8VY~mOJPwQkF>R z8P!GWoP@id+XJa78~`iDoC6k}-C?on2H_D@qV6Qy?j#M_YumV5LAA{qO;4sku<*2C z*or(SMG6?ydo?Xlaa?Ox{AWSr(%`S1w4jnkePxwZ$A;=P6VLrybzu zkS#JJCQ60PDP>fg%|aRWJ1y}7VQ~&bsl!B67_tz1g`#*)pN&^`SSrXJ=XGd>oUj(rHBZYm=6#mv2LafhUPEbcDK<1o+i z+!)00uANPYRjkHYdbsyOh1HCVp=0uk0d%IAXFCTMIKvKk=OLtY!)yk+zVpNXy3=V= zb`RCdj%5c_z!f5*xpu>#B%sPmvth%k7r8S}N% z=>RUrg2wvZ=L%-sD0wfIAPKdUgQb&4IipHpe5{$__KYgQsqfec=~+zeE~SI&Zrq1- z%W2y}{LM7Lo1b`)X0tJUuY#he7WE8>MFL2(_RdJEIgQ0`Jy=H>qOsRQI9hjj%2(f1 zUws2A(TkYEB3%d+cL>TJQrx(Q*8e4R$0wZ$uMGfUu z&B?@Z+KGhpB2Eam^^j6|&8|`A26j^<@!ssZ$vlMTU*v&7vNU?PUU2N%Ws`JPVXEF5 zX6pY#&eSe&mY==*GnYX_HDdv!sHnXItTH%c6+sZ%#3n$v*5BtO=kIfjt8>Qh0%TPE z%;0fBjtxYH_f|78yi))xgC7+Q(`rH}*YTK&`X*e+@ke5co8jqUR8#F}@Ed_-Rp$bd zmvudHR$I>aHTl2Zcg7$Sh9MbhqgkawNO7#!?sgp}7r0T~Z46Y(j;@^mWhWEz?q~R3 z%W)WfT<;|2&4$Hxfg`0_H_q>AQSH7(AjeN_xbd@o?&1In*}3ak_zkmcOx*M9iJNp^ ziru2DD*?xACx&@coas8xvOPdfHPMiid*MYBUOpIR3Na-~ zU=AlAzo4A&#&1c?xN=k?#t*yl5vN{W{iw#>zQ0%U zBKU`U1eOQ+%Y9*j`U&DHLDlP?pMsEJLuA;TAIP8AQkX}{Vu%0B@YnQ3~ zM$nTfO)mf97S1meoHj1nv$<7o8HJ~#Zu;_FCx)n@S>^_?Xh+tE`ij?)s;VR>rws4tFmX1@!>B&L9PsLsoAR z(l4b9;j5lq26Nx=up-w-#V@HH4#_UlQ$-R(-YrH0BZ{8l$}tkLX|RG^=p3{q(n3~c z9U>}oQ(OvQG#P7aM+~<(sEXKV#z*Ue&h-K!5YfK-oGU7S+IS}oB`>a-+v@dWefBnk zX5~4D_$iIaN7!9;M5Wl~wJRH1J7)darqW<-4dg}Tc%1jLrFHr5*}2WwfM@B3rN@Vq zx(qm{x0x5m7;;`(&EolCadkj(wgWQzAj(l6LdK`>!dCrWSFvzF?)RGQMIFc<`50nX zt`!&bcGv~5*v#@&&K{9qcOCs3LmijtYj-Qv77GvTq4It|YGziv;RZl!0NQ;9y-_Ak zO-Kof`d<=sfR!H5(JKV5B7A&lU^6RMA0HSfj@E8`=9a7keYic+9AC*&2 zy!s6kwZqqL=2hQ=z4PH=m-ZMi2i_iI18M=n6grNQki#wOO4-BurxeI^Wxq0liw**RVmn0$J=O z;0kMkdPRCfSuX%ZzVGXM0VHI0d}Dm?gkcuJq~=>%o`ZQD?VYy12P@SPlL_)as=b{U zvOH-tW$%v56l5fS3T_tA8&yL9?D_U}G?s?svAkw;9;51=;Waz4EP<2-7DCcyxL2BB z>#p5dj8ZyTts~me2dtt@D_N2TB*&8jaIH8a9rW@(X>?Qq03D8!TJKC*))oL#-1yo( z_YSt3TiR7(u%1@uR!;&iF?|`di;%-q-8?My5pebbB2{CDT$DNFenK>=ZFvx(RWl|* zYgym-_b(^&i^|P}Vx-8M{jcqS>iu?(B{7$qMKTW`@Pb$&RRTbG2;bUvhayOw!YxuI zA)728vNJ%_t@goycv+u1<7wYyxpU2p^xva_sPI`QjDjPd*3&LZwYY?RVz|k%iccOJ zZf7pn>$MZNJ(|L<*Gvdla2Ao^-VLf4N5gIb>e%IuH@B{=UMnS#t)vy`=hmXy6?#Aq z-S)TQ%4@~gyZxtqdflQ{4)N)8Lj9Ij-O-!uoo03voiKr&Me;U4%KpB_Q|_edX+O~5 zd;hX)w~-dL-~)r&zT*jX2>&dywN)~`c%icj>-qgH!5tpRF4wjweuw60x)(nhd)OK< zq4MaraM^41BQkLaTmSVujch3Iq#|12N3$jBYsJ#o2B^|$a*+M#84~AomKf~kI5|T% zBDsk>VEfsU+EHs+dG@=XQ@TMi0*?nQ*0ocOeKQdWN)oalx4KRR@BcMp>D~$F&tJ1E z@Ygwy?jgHd9rB%2j^nb;VLjtq=b{Y-ejrt}4e_$(mI=-KoPgZ%rMOy*p&7nBqTSVj z$dR9jVb$CgkRzudkr!NOH%YGjrfN?E6kQLwYg~{V$TXz-|2}6`1x~k{GEN0*K?1%F zQ+Dfw17v|>2v$EDS14|w6r!H-S!l2F0#wfnhult8K3W{FzTZ`5dc?hG+q+~O z!dN?v=!W*uFaVD45*<4)sd*f6E3CFV&Nt+-BBJhL4d^kvmRvHo?L#6zyiLZ<`+ci0 zX^115iU2J2pj8G-t<-9Ktr!5;6VveZz1pm(7G&>h0-ks*Yk|aT!fF#%FA=t~fRH_( z0r9j!OMoRyFx1XbI980AyWs;9=8A(c*)DH~T<8?y-s0Nr%Ikg474u|UHHb4tDM#XZ zJ>jUfDiu2Mi{>S(V63N`pCa=6o+_sg;j-6Gb#F4d+Qr8Ru$_jWNqayKFpuaAI(%PE zN3ANEYm{9|^`&by_cVN~N<=GxrS619Jnzpg;!7jC&hdna@;?RxiUh_r6 zeQV7HD_;6BY|pKPbt$W!h?{G--#8eO7hXFLtA5`rsj$Ahig2T{?~iKv6+N-Z;vn98 zZ!+CD1#DWYFqTifd-N{B3~B#{^bX$9Tv#S5ocgdw#O?ufj%Vd`J870C!tsh^OLaC<^23o)_5?~bX;NEJ1pkV%JVo1low=!+=~*s$e_3?gwNa} zpourG-E8V%-FWGQEX=>}mB`*%+bgu%IrR&(p`tOHpK+eGL2@jE1S!2&vtMimpHtEJ zPqQEz{k}Il4>Qe@FrHobhw%a%JcMNRf+VJA3EN%1$CH0-Nay2SO~DZ z-1=FfD@0y+%@Xc2!VEpL^6VC7)-AF`xt^%VBG+?kYK)5aA&fC z$MhwKS{H#WJvl0?BG~E~ZXdIo4~T%2Ku=iUzKln&X&eeGB$%fV{L_&koG6xy3i zyAHRRm$4nN(z1}x6S5=IV%FD-V*i}xDZiRk5Vre*7Vj*F5P>XxHTTSmkmTqsdPc}$ z7;}rxP_ZykH3BoYuCLY4Rxx=VcI=62zgAGIk`c9Yk8ZuZBtytFCK{2Q8<8LBxPJJz zEx^C=lQH5lKSP>W(pzfGzOz?hdvyx5yS)J`KdZiL^)-M!n8x+Sy3VTk{^4+&u%0yE zjSUEkB~~P{+OueEV(dzama4gS^k^gH-A>{}Rn=t3%#8J2QEv#gA8YizJ=6qKzKjtX z)fmVskO+NGkVGNd)(UUVA%M{ijf!u&5>m*1!*WQP0HEZc&+(SuRUw#LGNe2V2U}2x zSil|7{%J_^cqCQSHaj;N_VAHroHVB$qTKhLYjLgr2-&M*k(95$X0+!Ga@T+&l6t){ z3Gz2e^PcvvU5ZP{1IEcad9Z6?j%?Tp5j)x|$%pWO8Uimb>nj@NS&nr`zrb)~Ap2rq z*y@5um1GX-ir?CGDLQ1Y>b$Ya8%cdm3*y!tBCovS};>9w&_t_f;EH; z=wm9E+X6lv1MM}FbU8_;_J;sORSG^L<;@SsxeO4Edab%-IjAd^HClCAG(}?uR5%cc zNaOb{F^roA8zPRg1$!Yms=aIy!mHRA3HBL4Vc9R&S7jrA2nuB5YyhiI2;wH&Rcty|3MFuZIX&oJN)L@G!xs z64Q8JtYt<#Dq+SB8bsaAXrxR|+~V*GW5*r~^`NqNx9Y^6C@|z6pRfwNfIHWOz!Fg~ zil(DQ4DFqQ*6KuJ*34AwYC^YG4up%T*Skzu@<3ED^Hnn%veQ>6KH~u5V2|@UYqMFx zszCtUTSt9uwK9-<4hTYie@Aq`=mfG?pD5q?cN%WG|E?)df0E_}XpL&^CP9S+lic{KM^Pxej7;B-3%S_YbShri$F~u4V&(ig@vI3*Oxd?OI+M{ zjBQI-wgh1Yymlob`W_4MjvK1_Uas=yB3CXN0O1K8vk=s`RIvR#b4<0`T2z<)gNR0Q7jyfYy7OU+p@{nA8xg3DG@2~*46@ihM3 zNQO+%4_Q$zBtz|*iJkSe?s-jFYPMJegv}ol)=_?{1z??g?e^=VpnEK_?{^t&%eJy} zNO8pgWi~Tyo5?L)hT%4@kIci!GJIP1*Mo7#Wzs)}&W3%*MflpUKN(k=fMJ}?Lc&fA z+u_P_4Bhfk>>xoC+`qq0242?5*%A?@tRw}_f zi^qq%NPed3$~E2aiP?1J6m(m0Kn2f3Rv=ex*ZXC*s8*02)*PZbrUmpfGzV1NA4$b@ z?Nvnc&_oGKb+7Z~Pf+bCwjt#jYG+PA)?*K!4O>02p6&`gD%C9~5>#O)Zz1pQ04i?- zwR&Y|N?}373mTO(P)%7tr*1$8>V|nYJ|oKXiOMdtz_x#W6=0{&-=Z5&{>X_J!ZM1KPNOUJ(@UUGCN-C@}JgSma1B$T^$haIr_-u-ZR+gxlTGg0e=lukA zR1ExUM}an-+<1z*p`yxIALf3eDaNQfB1JkV>JR~v>uIs4YscQWz8r(2;s>%LWVMP`tF6hY`d`DyrM9|!7R?$J z0atHw4MmDV%(S(FbO+&o9>$9aS|#>~$|npVlaAy=q{rjhN7aH>oo4Vu&TObU&FT+1 zGf5QjURfH}b>Z5{NdER8A=YDm$Lsrh7vWKeVYF1kGO(kPLH=!sxZO=xN$5>i$~~1L z8ul|clHexC5WUVtI&N~woq86MiVXzA2*Yg*%e(hfJ2f0m%CRCXm81=!2^tfPv^ydYF~XA@?>fOBHmvQ5NTq+=YA;st7_vk=#1T9pfge_> z0%Mh5SFYB_KW4t$Tuo+%Q>A+wrT^#_)1808tz)S!Z11dhA#_||S{a?4b=cysvFvK) zAu9SFTgOMyJbx}0zAIEP`|*z2N+BT^0p4-I&9zewcZZghe438gzbn_MMDUYmIe@d3 zAW5JhpV$x%Jw?u4+4TVJRMOp{(JbD82$HNP2dpKAbo;J#&`vS$Fi%_EsLlb(^C~bt zlDAS_oWHZKsPIPq$9^s@qP^u%D!lt0YqlHTAvGIB{@5#!a1o(nOn-(hoh~u&OdWOpW{v z%Dje1w%%-JlxQZ|dk2J6TDf>w&z{yf592;Z;oUGPCDI2C#s0J8{nW{@)2l6B5*O8e zp{1U9%eE>cH~WU^Ni!B+*os7>TB0GOGTYj58f-dbcjK;|qRH!BNbXUoNm)-y91q!h z+-vu$Ec9i`vBvr`=XzgcZ6i2E5SwSgHiA;-eUF8;x@#DdaIaM`0BS&$zx*iXHwKxu zXCeDh$6JT}*3%h-J^tGldxmGoalnw~j)&Z2gz5^j(j=tonH-VKsfdSl}Aou$iq zInFbHlrOoqsK1`Rhp}OI@iT0{G&v*-1R}B?4<`>Z5<)Q0jEkx#Hin{@&z?yI?UYh< z{f0&IES)z4!#_6Jr1SD+q@{wL#0247u6fER+0b+t8vW$$uqt0eWUU_6u0ujdyhL7I zW7KP>_W#<6=sYD-?Qm4A*h4U*>4fy*YgehjFcP~XnG`GCiAt*Sl#im*qv3s@?Luhn zJ~Jx1E*K^Ir2jm2MQolPLZ$RyjDeCMl+u;Kp5y0a*{F{nCj46OY8397tg!^*%~Ws~IA7Z0l;5 ziHCGYt#%@NS>FYp#y^lQL|!{*qkRdR9g9lL<9g~^^V;pU#d@+zuic)M3hRYR@F>Z zh%*Y2hxtC|a%C!OXW&tZMXx6{<}tZ;3(-fz?tkACU%hsgtSxp5yUbiqES;P17|h=+ z-7y%NUa}ZXk;t{$b&p#0^BWI&tkUaTH#=vzgHYVjvt0MJOzV*HiXq;CYj&8f*X^#I z61Af$ydKeyK6Vk}K35*rbm_uB7iHJ#!|1+i_de!^<$X+1=A8>J@$GoA%zo~sGgef8 zTt7Y7+3fc&LMV(D$%)QBYml+u7LI#%{#ES%dz-lwTHo(P?|bar!Wy+>?N#rPgjEOM z_ZsfgC$je^Rk}Db-GSHdBqS8Rb|os4S$;a{WOZ4V3A&XcHGmwFr@r>nFECu6-N{#& zPK9_D?$j6K=7b+N;%n!A%I%$qZte2Iwot~K9-G0i@>2`Wc{>Z1g3ldqJ9jZhGtaFY z^PEcrSP&ZT5Kfn%&HpW{0Nc-C)%Q~GA#!-BT|KX=G;yCJ-0boLe^f`m(gjg9&=yld zN#W*8nAW#Qd{)-23dgA#i|SwGKMQ5sDe`a4XH_r;>Pc`WxiMTX$n*KX8kHNR3 zN*B%qD@VL#U&*f#a40{m{=Cjzh@i#7})yXP~c+D&cy)KTXB(zIONf>S##Y?|VBJ@i3$M4v0=V*|@qV zN9*a=^=;Mv@4x(yzx==Z(O?&l9G$;A7Db$_{a?{n9PCIjH2i3=wf`Gd?YNHxlow=! zEAzc_l)up$6$AdKe*e$E{6D@Z9Qzmb<217WVdnqEk^SHP_Lu+f|N4*q{eS;I{>$M1 z>o5Op|L?y{Un1XmLHu_oA-&!^a%3DgZJ4?Vwz?FKERn@U<;E`?A0j_pyR`T%32gCJ zklROA5`edH1w`uXI%4XZ4MYtxVX&@t{oO(+qqt^z>}#apJ=&zBIqMKvo_TS7E&m9_ z>t=o)tfB#DpHo$)jDsUIg9^Z?`@2wrOSKT4leA)mNhs=J5(RiaG zX34J*uF^&*4QxRm-9@+oD)P6xK@-n9q8F?rM9jm5xH0Rt%skKwcOfi#*vRI%ORlXTYzBfEr~Sa*feal)lp@yj;czQjk0{$5W;-x zw)Zreomv)|QTt6H_5O1^30q1qtUP&0H|j^U>}A02Cqz>4^SbgfMhsTYK2{x7?rKQs z*Xsyh4|$@o&oQd-85;uT_=tH{Cup!M+3+YD%-q3lq>q{;7^-iY{ji}Vj5smu3 z1OPsP>_)3CV3~ zoUk5H8Kxp`h`VLC3Z&EZM9zH(2E2BX-mk0Hpy*ph*S@ACa7gSEkN~QYpi?jQB>7fj z+kS@abKIqZivct8?4Af%JOmI<=52?$Tl@~*3M z8ek`%QLW${Al7%y6s#vOaZhC)H}GX+nv7^TL93a|FxVC1*Tz}_L8rxALrPIyJ3D;4 zNt#C`uAUy=vg{Rah?3Of3vYAXIb*Hm4o2lPubGP02UIBCdC^hBl*fASZFSC;qzo(e z7L_qwJG(GIN5_|%pB5oa_q^psUXE*G{B2(Ioyh)GN6vUcXWm;XEVDw=B>CQLv3wlr z6Scm03!03Y(75wrW6oLL@n2m^8?(y+hQ8XN_CY%7#?FtpEoR}{8C_+?KCMhC#y?rQ zPn$C;*yBTq3Y`EeU9~&v}1HMhikS2%UgCmW=Fxcv;yqnbaw3uco9S?Sdw=&7%|l? z4E4VDzAyr*)AGSGoW@nzBq96@V@Jct2QX3!LSzYLWXz@z zqsbm0vdk%}&NT|gU;{55aN+W>vH)SSt=1`|Vz3Y~t=Db^N+!H#^lp%RpIa#5?<^>0 z(lL~!OKFA3yo+LJC$qH!3S)EL;t>Pb4zjwEs8o|2V%ZJJ26s5V6GOP^tMUUYovDf8 zy4Dt9HVUB_G!q8ILg++7_TxVx_YzD<5s{ECP&OS{k)~m@HP$YVHL81xroKOhT`KC@ z(Ln2q>}=Ag_8gCPBIxa22XhiWpTzFn_b!)#iqgJz0t(j?m-X6lzVG;Zx?plqUkV-G z+T80#ou28-R;yEsM#QJ3avZuXa^J&Ucap`S?|b5RH{+|l(auHuTTb5pH%?)h8*C{i1>A_7-RZj*_IdvzAp zI|yw&#eb(kWn1e4>8{k;SFI8g=HNGHZ!Nc@s(6YEMx})9 zW}`hR5weRbXat34x4=A%bnTq`YbT_2?e=a%?Swqq1&78BLUDqyy&^k|4m@P_98u*c zji%!7qxsQwtm}t)C}^WH;CM>A)qLsu43Kw5cW?mxguYWSXtG zc|=^`v=O_0K`aPgd22ju<6@yizK&)TWcwtm`kF*8=9lxM^2`{7mu?k2c5wPoVEgu6 zMgM)xq5BYK!nNbK#`~*Ny06It-^j@u32i->1hNsP-Ds{c`M-RH3xV| z0i!0@JAQpGsvS{F(3Q22yJ(I|eNMKE&!u8(S21=QYI(-qlcI?g?#<5+SNfdW+vh16+5-?=NhV0f9#O=(u z%73tMMuXq(l){*y!z31xUXZ;=qMa&{>j`pv#``_)AJt)W#p}HvXlMj0Q>>#YnjTYd z$WxKJTq!yl5-zC(S^dV}d#WL;AY{?6kUzi1FijWSTM_Gt^lFo<$H*(vj?di+RF6Rq z+ZxzC^$J@$Fks=#fZ3Ufy`(x~GP(0ti~>`7(uv_4T$BO1XUv9h9}^{#?+FrKNV2z& zAr=8xPb)S6kUuvfneNt>kF@-xW_w?@X8g3%YOvj_t`Koi!l(q7&6X#E8Q$k_YP_s; z=f+rIHX?@leU641vVYDF??a3ShUQMDNXcs6#8bQ(QyWEoMNLxS<*jDl!E#dp7ViXz zQjR7MVGpex&|e11=P_p73P6 z#iE*zubrI0_r0qF2rDHus@uw>6NNuy51yjo#T>`$tLrH{`nw2O@72ruIr&mc8XH;SA&6E~rCJGZ5luGAC=NWryuPSlI5n zhwOSsNJTEAVO{A9lKiWGR3*ki`#qc^y1zS**YRW)if6@WQ-OYsT)Vu$7I*IyISK-p9BlMT=TXZ20$Q1#@g(%NO=#Z@IjFYd~3_ z1?UiUiu6{3Yc|>Hu|uj`sDE}^MZu%$4)KrzUL$HPv;QWa*UywvSiaeaR(TQ9qn$$% zbhTsnzY*oM-`DOaG{J2rqP;laYtGvZdq$PN(;U}mg;z*~cW#7ceM4Nvv2Q8eDDpGT z`DXU}vORI(YDl8`)>8duT#<{=uIvC66JS543 z6Zf)Ujh;^1W!z|<4Tpbj@lsdMPWF!bHRIaFh?P|6@S5LpsQuC`lw(v z=Rt^ntRC-XZ9-In9Ai5Nh4jP38XGEPE+K>>6Tz!(2h$Hz#%9$oBZr8kwhWcSiWl@fAw9_(3ts>STZMf3 z`5&t>tk!o$GpEtks<`8)E~{&yC5ZRAh!iht3U9F3cSS|BrO^A@+wZB_g18~1Tw_Y5 z&eX6q1&~6dcu$n!v%JNPa!F|nBYSfqS8DQ@N|{((ZAy6-$9W!yi$9zCLV--J|Gx8R zc`nCAM$qbLQeU)t?HF6TI13{STb1Q+Pn?wqF+WIVRqY6>`yOmp^zE^fZKJAPM;pR) zxSkg23Q@$l5@uBH#yMHI%+rIa=y3bKu$DG7W*Y0Yzw=nF>-W>Kf$K+UrQMY27unH#Hba}FC#jb3+ zcJT)3^IY)9EW8RvXM^nNxmb+bY||mKG{>61p1eDcg$s)fSgI8Wb{=s>ZgiOA)WOPs zv$FNZ#=LQzK8EalzWCieEfR9S={6}McdE&RhhUYW51pj znr;DHzWyXE(GdTTHkX1$MQ;q@urP^ z^v(q^a+L1KNKc>Gf7#V!(`2;?pB?z_hq@TZ7PptIooA@|kYR`8CSYKqQW*GMSoK-nixxy$UEP1P< zt158Kp&`(dNotI^Q`MkmJQ9+7WfzdfAD@>UnRPeIyw0_kxR{x;3~q?Bv0HHYw>uwA z^d!r@3K-G3y5%QzzGj~><-mMD86Yrqo3JX_eQwWBx5HgU4mpPf!q)yi#}_$Xk!xxb zcqOZML?yIx>-6iv+i_Gp;RMA&L{Vuk#}Rfb`WwOO>b3jlu68A=0ef*WfZ>t|EK|5+ z1@hok+$kkRV5}c`k4}TwZ3O}~bA}Qd?7xat9pcJGxPzl2xT1o@QHb0^dd<9H2$5qr zGpVob(i(_PHNS?mR6(K)JNcXRteZ`7XA#B;O1M?lMrA}LO?*e6rRj7+{Qr~N`{j(r zsEaK5+No%&oeugn`5`I%JjEQsqJIuu3)9jODO){{%$r6C$pSf2p`B%a9eL zg?x`0gtaMQW%owpa1EdVUq^E`$(aHWw@wVJ<9k2&e(TFAF;E?etX(^7Vwez)%Vd_` zg-nm{lh@k?*66hpb+~r2)kpJ>q( ze^iq^#No0HNXVo6m?t!kQB$_PzCt0ORhQ%##*%`AzZCdDSb}0gk%**Qz7N+tF;Yky^jbl zgsiT9$YfDS2Hr_b>>NA6O2>_A)z~4Y;z`xnb)EUo--hiuk}#7v+1u9yvSRW25kKk_ zKuWjWAnkIaRE&VNM@3z>1dz`jP2xHR6)Ze!sp!ijA8g+5!mbUQWUA^ifvJM?A%DIL zE~j^0^}{|9vF%$*&AMSeWMvgYZY2@5b0JlSjb<_85Z<1-PAlE0ed`Pk`efDU){Tt0 zP(oNNrzNxLMnG3x?`2r)N-*aDDTzcn4sd<^EVUA}LW(o+2*#Z^>Q8YvjJdVqEez6S}_W4|# z*)xz?9($nz74NiRk_W74Jr%n(@WcnfwNjn1MK>U9ibeoQ&P78gHa*C*31E09hfeRw z?#ahqZ41Hl2_jOpFl5Lc(d&Cz-9<`ZVwDL3=ImsD)gu*+bfSOJkEb;?oXuhPsP*Mu z`oMXNlqCCOoh=K7h>A&#lGj8xy8!Ol6j;12amd@XQ&Q z_}1-=U|c$~%7?-tsIEZL3g1hcA)SqmSyH%Ye%Ssjx4eauT)k~kMsR17hx#?T1ekFP z4Rkh(NTm%zx(z%;m_twTp<&<0q{WX)1mc)wZW$tRlMWgGckU~MRyxBs=lFFc)p3I| zzjl+rC^%I+Vx%=8iV}+VIf^OHaLmr_L?y0cP*TOD={|Q(O4;2f*2|pdQ?nD)+TX*t z)e(#_U_Fbqt?QTEBI>qffDB7tqfN%Vc%o3#fF4VX-Y)oBZ?1*(j8uRF`eax^rDiOow_G$Lxrx4JDmQHBu=4T{&cX2|j$KVEOcblh zIU1|RgRB-dM1UpU5uV)hU=Z=^9TsKcf&=Zkv!S5Is1h5m_dO^OvKp~yWbV$GiM+5) zSaLKfw@0ogb_Gom(yNcr82DM4X{?Dl|52fORJ$sINc~a#>p%A61VggB*Ojn!s~Ob< z)>G^2TpD-nH~_J0pM$iVcxfrJup5+<+fNQeB|6q}W}rMK6ZXALhmAW;(|AYZXkO>M zjJA`BgcZlHYE4e8!WNCx`EG}eYCotQl8Zg0Yby;vDcSA1c6^TYr5vWca!k%bZ};rg z+Ew{fyX9}1UhVRp!xHG%dxj@uzxXl4>u{qHzx^5Kw^YjMZhqXf6TnM_w<@~~R7bCv z0>;dIQo3u{Ti;#HK=ocewJ%FXh4fFi3%h0(=bL7%A8X9DgQV+2{O_HY{TSLHA>C$| z2HHW3H~T(rKeg;5EPvBw7-U%75mMROgq@sss894bTkK>V>#tOP6n6d?T9>HS6QSSS zAO+*2+Uq+*gq9&mfOmiz$`($ru>`@W7S#d#!8ThzIA-GFJ%sv?lC(TVmf;5tO+9gM)`XhO)eOZ?E zazCGdX!-C#J6w>JE$`!2Ypk8Wxt>oGWA@wY23@^(?7wmftuWYY)m^Dt6#~9_339eZ zpt(4jx$OVe<1`~g;n>!HjCt+EfN%Xt?mKPx<7Y=sRXy9%9yO!ajuU=+nZwpF8HX(r zs(zxo_TT3xIglEB&5c4sG= z7G*v05+76M^GD>cwQ`7xo`i7TI_{7nBX2Pk*$k5yNqF0X<_)oxKdFnUKv3isPP z%I8>KMZ>X@KCdUyn+q+8Vsvtaa(e`z?-fpbquNX7Ar|Atxl0N=78QupE@9gANUA;h z0TKnjGlv`Rz%vP(Ub1Vu;>fdw-{*uDnzCRCtA9P&!(1Vk91mkPxs9&&hv-4|vke{5g&AR9?y;Yc6=0Edgh5;m$yiJJ?IhKXndivgIm0!@qd|Lx zth47@kgkk=>D-XQphL>Nu3e?f*A=00as*K$w=$O$O(}N!F=UPQ4CXab@c#*sg;Ff> zUgY&Lj@Nx`wJm+j5&1kuYG{I$(Cmz5@Gjs9{GK4?^E?T2E`0#YpKZQ0tqmT z>zArw_p8N_jDsQBd26@Jz0nlhyS_y8a7S1ULR5kqB9=pD+(4H0Uc0wdnK1bnVTsGy z*^dK?v<#>QAQFDw*;1HgKT;O9I}VzOh1>wV)pW!Bg`o_y+seXKi+cRtne*b7{1Hqk zNKBPvZ%cdl)#43l`vVlaH!K!H(#o7+c&bm5GHg;;li67FuOYbqIub{WtJ!)NT}7ml zq$#uP;)AHGR$vG{uGd#i-X{DJ`ly>Q!mYIOb6?( zvLQyEYYnk?gcgKAye$x8x{uXG?29VzcT}c!$I}VtiD}2ZY}D<+8RD=LKVdz(6cv;4 z+S$%#+sWP9qH&>OV#6W)#yKU}1)1AS%pBX79=UJn;KZ84{aI9O%RS?TOcbRPq=QQq zLG}_}NHtG&HIY7=LXoj=*kaIq*gcLzX4HxVmm(R`lxnv})m}S1d03YhMwKWieq6mjJFE z?j>De5?$B3pK*zUA?K3hfM@AJSj}JTjS_3l3o_M?mc=eZxK7DKvb-oQ5@FvTdB2x0 z!hCnC#Md5Ges;|myN5he6TmdaQimYS;>WBX>Z zCtijulHGtx7_}x$w_d29bgYcE{e)$o5r$F*r-iS^5wgcKM?zwvVQ`h{dR>+K0&#}o z0>(vg5dcY=cmPy;9U_2ro0$bNsaoK89soO~1XENpxn)bTe_lJ417ADOsys&YO4)iB z(@h#;i@i#%oqF}#IBc2iDX+KJ-_hLf9CC&|9K1&2;B5)TzcNfD(t3gR*`K`ALjD<@f5t~I>+886*uw2@?-TPBSCBL>a>Y%>CHw62_pR;x* zIFF-!$pH;v)W4m2h3_rQE-0Y7z*j!v7#dK;b8Clp;$KJwR;`p(zcU6qk!)v{;O=w& zeKeNt)?hK(YbTL*eeIV(w#9p5M?0>|F$QDcP51kmFkaKjQBf&O?o{PRRV@$MwaFp7 z*#&WT?#78~1wS2*b5$_eDvlt^i<)0ZbrldvhOZr#Y&rQzO=47;dI0|BHM{qGAcBu4 zLy80R8Y)da3#{Xbsh*+5>3>>iXK_`6x4*2c&Y4zmn}wQ&7p@$ZjSjd+KoKn+8zRZm zcCuZ{XI-MojjGXi0iwGZK$x){RxGFlA#r&w@3VhPaPeu3Ou}#}N@_aXfkD%6UMi0$?XQ z72jE5O@uO@6UP~um~C~6D8;t!k^C5NJ`Ze}ov4bb)Sm^#V?%xpkij&rsEP?jHJ%M99Fu!(-)rWO|rJhu)-1r$z$pgqqcL9uU9bP+Sf+t?->l>9i`s4h) zK2W>+fe3xy6JSA@+$vMUcE>qnzj^@4IqvV-`u^I2zwc za8)+dU9`SjroKHO(Wc;W!`@lgTed@T`R{YQ-fQRTB5A0dLfq>e%Rl6ddk&(xkK<7F zm_>a#5O-qLA>LA|+oUA)B=Pf*qP_P$O>X5_ro8N^CJX93p&jtc;k@ue278{v@5y1E zRaZ!*?iww zm;T&|nOW92A-xI|RaI33R`mm5R-LP#$uePX4K9)m=~7J1IEzh>uJ(V1^fvT!3^*T$ z?LD7{=_YIKL?ib$1EhofkY|+V+pPDfcb`0IcLWi@v?v)sZ zmF^mLeyr28UBw{Q`>Lwb2krTQ7=VN3wx*Y(>S+mHA6|5F=UC-x@9|zspR*ZL@ zJJHv@qOCD@ps_MsP5{9SC$t61yEN>!M-~-gPb7;dMcYs(0e}-2{qpLd5zbM zL)r>(WD>ru3RgsY6`#Qh7lsf*tz8b#>9|$xxDwkmwnf2x{*P=KwpSZirI2N zu*CYoNvHiYenk*QoZk zQOJ@pL&_qC6c}xP>+6$>RVv)~<|@qNy16X~uG#axwNfpTCU&f|4Ns-Y=*3ToCN}BA zj#pt@fi5aouMw>zh>T~c$6!dlpLhrxYb35VsF1OyFllEp-5~tZ;z2sDO$OF44h}mr z0`f^DUB>p1-RRS9zbJZ(piZf+fmPerBB+>2P?OKQ9|cj$()WnMu1Z`xL57Zga-H`39alv!2-8C#KoKD|ymR#Q%n=p1Q-I zW9CQG>xlwt1mmC2G?sj5sbGRV6&{?}8#%QJpebhY{AL2e9mXm3ii#6;x#Hi;BV03~9Gs^c~_V%pr`4_dR7#XI6@GW_(gba>1kGAD-e_orsR)A z1x|ct>Jm_EwhM}=#IjBkd32%U4(Ts=t{Kzt~Y{U6m0_R(gd`0O_C0q`dt;suTWkynxA z7}V#uCsytKohk_FIp@5FzT{6Q{&lj4`~F~j-Pn#rb8LP&g2|(cJnfZA)g}R{-4k&b+Py`stH`cIe~!8 zpgQVFp1%LXhYjUHMg5~;cNR!Pl#Ms!LduYex{eKZd5OfcTFmw*cJc>SwbZE0(O@A}A|F!S7{pUAC(-qlu{W%7jA{?$M73&!`(ATY zSW(EJ@oPsat}oGp)&{c2+M?PmYRFwPfY|txWDVw7C48XP%V$>Oo*6Xn1_Dh=@=afM zChV+>{M8~05S8uO5~76XYC!n!#sqm!*!a~BcczX?M!9i9ZUnryo?i%&BaDe4Spdxs z#)n#8Ozvx^YW=9>^Bcj!lQ9~b&Vw9`c`U~q=_k+=H#GH`KUZfT(z8nG+0`$OCWYIk!1@u}FkF9@2G8;#l-;yA zSN-}{b$FX;3=1>VuA2XP5&&x-1n;Yl8nVl8A=r4lifRrB%*B}do-L0p@?#fg=o-Pc zmk~~rym9ic8dZ_;Se0qPH6I{-m;5U0=z|suHtiZVjgqJz|98r4QY5>6QnM9-Uo&Br>x#d1 z@|9814mvKC@zst%X>V9p@77=Xqljye%n%~LN^u~va!r@gS)D>icYpdE?3;`5WuJrW z_m896Gc}NV87M?-VOt8@t0^$~pHJ~UgHq{noQ`G>Y zsbSvl6tJ<|PiLj;wD&tge1zjQ6{PnYK76HBy5OT}BboJd!f~?Q&a8vTn(0d-uJlD_ zR#?g*tbE_Ko7AoBQU^o!UQawq4}a~j#@cbS`@sf1EtL_KY|!=OYQkvtw!(eSb7&_R zTxhyck*e3zGh}^u4^HVxaHlwIz3i zYvSOEj(%!kr2crJ4PWH8zJw_zOa(EL3;prL^S-6 z(>`@Q>B8A9dGLl%%2G2dlj=eEtS` zn+wQ$EEXs>F*g_y1LI6_ zTN4J+iG5j%y<}Xw9u%#2-omY}6H!JKve)ECL$crZXrP;(vZll&fjcuTDwR@){Oj?= zsvTMx{o*mWnD3#tLiok+rjz*xEB}Dp(>$moT~n4DCWiIJyMy?cPe7yKep?`(%W8;66llvz|QcI~{95zpv}r?Q@Y z-M@BK43p`(qh$0&BooELO5I%D9J@y!;tDhlw0U8PEa|1YIti;1Y=~3C!POsd99GRZ{;|-kt zDO(pp$Ul8sAUlcHy{SzvP0ipB+3z9OlMGZ=hG=5?`Y)g3=RXTH0*Y6wj>WbnOzULvp{aC*kvuC838@@p0`g@KIm=ICfNg>{|n(>ArX7U^B?( zSXT~9`w6QarDhDW`<#Q^c8VbHc@;D(#kpqnYGV6#nbj_&gui52s5$&;_Ez911Ai)TtBv|b5WE!b;%M$OM z&|F}>ty+~ztt#^gpa=SV{h02Z0oHa$&ey7{jmn&Ex(ghI?2c$Oskg@|tA_~61B*zg zKgLL@Gnz83a7B9usYaxBs?v7z71l}wkP9bw>D;!QVcGKsHM2We`C%(c8`i7zAym?n z#YKHWT;IRN-J4Uj%l&m8YbR6EIpA*Z-L87~+bE+E^EsNTr#4JksDA3Ac14Y9woBXo zW-IjlVu=fTSO5`#*GgsUwUTs>ouumcWBQ?cvN48K+8g5h+_97P<6~PodaNlFqxCG_ z=~oQesz6R$7R@B0nqBQ??p2>bZVuVY4|J)>@eQ1v-S?`+c;Rm8!rf4Tl{9TocjpQ~ zAKoyj=h%X#C$_c;7NwA1Pyv9Ni4;ae^_LS1;q-JgId5G=zdhjp#!s08`%Oi=vP@lw zi&ffX>Q}P@VMyMwYd_mykg~lIT>)!IF~G+Joz{Y+W^$~uh*(gyn-THT+Z9MxABOB@ zoRG|>Yv$ryB0S7~M&j(9#(gbk0$gB#4T2_S$h)HYPgn`yK{-E0qOR?-v@a9m#OWuFgYZ()T^5yWHFTYh|$nzH@g|MLn=n9Z)V4BC$BEy z3lVf(&lyVZoZt1EddgEBRnM1>>&Tt~3!cV?e=dq!8Z9Oa+dJk>ZYDXTGQbcCg;*29 zfPKRh6l)1!-yU2Xi}75Tt!9F6g-VN&JTnDH?Zv#XYT2U_xV(;dCQm*UA+4R#>~Ad{ z%G8uN;w*sJepZ-+So;o;qNY1!s_1UZiy2@X0qq{|=E?lN~HTi}jTeQ8Q_h>u6W(LR9Cq2gdy)i*We$?b2?eTxG!_GVU4h?5P#G zX+{8iMxU6<$$yUuw*=WwlbPiBojNw_Du%Vo8GBZr`r;eZUeTzX0RMf@K|bS!z5i%> zv8&mM%zfHrapn;2MQq=8?%XqtR!iCUF4!Fvb$4ryTbo}uUEaXU8VBTTZQxub!?P&KsyhV_R7gd#z&!uMJDW|h8>F&;S2aix2VV+_r?31yUfKQIjoJH?{kPV zeVeExYp?tHo+9;xiB%TeSWilt+8(R0;^M?|W9oZ`xBL{0FMCw(Ks|-keJ+K}B^uCB}DctRxA23QEd_Thz!IzIz8LM?%XUgm1*U(e0S{xoyz+R*{!*L zF{Jvd``$)WJxXWpVI{W|13 zxaP^8xV~Dj+EMGRxSp!rAF|TIkZgw=WMH*EN{jDnd&@pZ%y-Qk`_49`&`TZdM>GOD;n#`R=9rVRA8CQu z`jZWvxoJJ-wam6rWmCt5G;tR`12Al#OAnK&t%?84=u0YF@CHR#To4%2?Sv48kd`f> z!KA1eU0166u$gSUwi`F92M`Q5Y$>5@#+R+KrV(%!<0f8lmq$W=w^0zj^lmvotlPEY z_+EU(%=_t%s5l&F+phQ_M8(Z5Cjaeb$2;}An0g%K#)rNlK6w){afHC`CTCWkHvgEC=xfBEq(bHK-<~+OH z4`KLR?W~KJQK=ICUJ2+B{A7OpSO$}H+mK_rzF=Ktjf$;wRQs*;wyFmd*Avlw_Mh!r z=Cr;pOhj!sCF{I%Gd9?d>>!ymyj?e9@({*3Ynb*i(Ff?|+y4Gl3!iRolb>XF1@Lq; zHltfkSLULo7ctsD%Rg8eY%-wr9IzY4n_rKPMZ#J;)^8PBs(jTo6GT}ZKE$DDli3V= zU=G6Q`Zh}h;I>B2_n6Ag5H_gx1ZVA>>>B{9;TD~Vva*I)A>TMEXZ@rd7dP<}O;4hs z5wbb)16wImj8?hO_5SqKRM?Pt=_KNxqZGkEp_Q*3O(x{YsD1w5m-iOEQl^k0zVSq$#Di5+mcu1FV+ICn+6vV%4z7eH4LP!#_2C|oSAUyF;+;R(J zbllP*YKPOFxw0^inVdRNX7Z4J=q4H#xg$Cn#0`PST+%0u`8$Atew`Oa3E?f==Mt)U z5J`(1ZmsC2_JvTLl@sy_#Xt6H8HC2Wk!OS@@?n&1nNP?^#e6<#&R2W~t)~%gp~U)P zP9dm7UNg4Y-9sCe=@eqXjS5xrcu48gA$N^y*s2ku>K&0GOAsECmaQ6KHfc0ZGQ-YJ zt@j2BDDb(?i!p=opc0dn=UVY1P272)1p_#sOZhZKelp&B|wg*h)= z9k#1LVZB>0D*8oFsh13FG-~TwgOF7q4YO|7R|T*`vLqr(AP?x#%=_F9!(T;DSGa9V z%KUb)!o)Z?KMK7O6l0}`Ylv-H1ODBLts&F3SQf_oZpP&)5?zq8J{uFu?|Nb|HWxCX z!jEgW6k_MSSqYm^nTak)C(Yjzh5ao?v7ib}-0nJBG(W0){ScL6nFd*6zj#SVL7hG( zI+1NMtQR)u9MXRqj4JXFj?l>@*6`FS?6|;JD%p-mJ!NO1L8h=Em0+2z@m8_h=Zck1 z>zHrR^1o6n?O}@~2I@3GXrEhLB|XP{9#Vu5I=0=-cp!XkF!hVFB{Mt7@+&D&C#oRL8>9(pMxM6mzb38~%y zbUD)ymAj1XAdBgaYq7$G6G5J($cTdzuMr@SeIFwy-^nGoN;>E;E+}!sB;hLe4OR6!W$! ziTK60qUs@(A^XYH5Lv(V}~jj(9}9v7wb8B0jalIB)A9dD+)&!RxTGXnnI$N90sy zm*)1)>}D)+AFmZ=Xv4FgX5u1ZBS36Q#QBD!S+W>+u8RpdHc`3cam-WgW`L)Eno7wW zb2<(q*&2FBah6q9+CH};i<3UA^d?MQm-{x%&OzCyFu%-UP!RF)J3k!2lXfIUo4{MF z{`T78=%~1tPEE&EU1$RU#P%V(k~iRDH6T7|BZz4FjZo=Q{PojfqM_8@*ZzO9?j>il zkT`$fJnu5!k&F}yQu1G6?%OZsc6a|$WqnNm zR6wi03MNCdQM$`f=k&xJbrzxoGB`4fv1XkOJYa?m1txkKJ~cg ztwFR)otNl(c4$H_0LR}b>3~mvV2=+gih^oRa(#1@uOkw$`IfM~Xb-!>L!I%5QL-yA zn(x}sA=0w7tAp8JRwe7TRcQmCNZN0^4jB(w^71Z6qGo6t)gIr@^CtI9l$ZH++RNt* z_VSCqSWLw#w95rtcxc1;H;1@lp*vKIf<@Dd@pV+IFzhh=|Ace$?}{iZ8K-3({|4AMJ+u775OLH2S88t%X? zpRaVqt9C-6*UoQ@W(tcQ&D_xAF3ANH9O-K?)qQK`oYt)G(t&H1a~dLF(k^R9F3h@s zm2M3awa%D<>?+-m+(!uS@p?jYs|nk+yr^tF?tttUcGmk;Eu_WY_ulN-D<@x1i6EpQL(%B``hum3km!SRBlap;sv7e#Tjy4(hh$0n0 z>A+-Y?ZCjw=npvoRIF+478(a%SCD(QZB%l zAAWWM;d@9wYO*o0Y-h}%k|Rlx;7M|J%-P%aO}FJ!jpKaW><)! z8QbSRm$OnoD88==@IP#RQ)MhOlzfa_8P~IekAz?F=}|>54PdeBMJR}Gnd$}(yAh;G z$>Ski-Acqu)wSekDmZGP!e#~){?1q%GDD?M`462u1p*;Qo&(~0EikNdrrPaJJiz|6 zasbjYiV_6(F)`K~xM;|IjF~fL6<|B1W30^=i@%7BjwFijxCk7dN;@KXfs;?1Jd4wT zau?tY&;h(gB=wDFiOOiwFAb1_d#x0jydiSUS|e0C*sATS@F8P3?Up?m&GRTI#;%Qy zsMKXiA18a#jUVCeHha2HA2#PHDq;!ehAri9l0Tw`g3shG$opuTi5P% z8;o@t6}hmdIU$mwCk1{s6wZ7Q%I=q%T?Ndp?6DQLzOCw$eB-LQNW&mT-eKMN9x_1? z)nbLw^zzi&y#)C%3=~myMr$^%g9yDDX(YFtkozsM``qiw5yQ|?iHWQycgPz6yLC_6 z>q*3T%o#QhKWvG_5V!s}C|hK+Af(Inq>^BVJgoh1oI45t*{?PS(8c4LEvpnD+R+IL zn&gA+*}RZh-!+pX#h4*;DnjyHuHF48R~V7-m#8EtZk-kt9SXx`PPu%(=_S47nsYMDcUNappkc8B)==&%xZ=F(#NS zPp5$|%UN7ctxf}GnkK9Dl+pBvU~Rpv$t5rD;?y@MIqMk*oi&S2uc@D(8LDMfl?tdKg5!A za*|>>r({E$kY}MMHzWGB3|b-Y<%~$!N}YOMeUky4B;oP(qulFg*M*Uk2uOI%POu4xm6LGpKUWgD~U*mSY*bGeUvKcFHRj;twVc*!0u-tWdG;Yy`u&wOLHg6XB z!xq7r<3Nc-#hR_B)N@?}vdvn|EeaX!xl(8I3^DgA8Wg0`+0k?@Vu)RMNWbhGO|jSO ziQbK)8AQd!wkj*H4=IYfo^18e6h?j{z-;GdLow zePgN!q*gNe_c4aq=kRz^v|SM!`F2wnn88BkNvDi zrd^zK*`0Ij1Tr_SP}>+0$_6or=L6wt=I zZxyicykG(m?TlpPUMnH8)Ud}+)^-sIi08JydS_LvSTfP- zx|N=Yx-w4foKxD!AuV#_ECe}`WvjEmLVn*{n5Z!8$#z049Sr%=%-aJ^Pge`3q!Lyv z8B(YyB_TfD>KbM*Q1~3I!lrdaW7{am3Q!PXq3nWG(bg#ib{f!kS2fq7lxdI1>zZvP zb;szXf*aed_g>Y%j|r&9m9!)yYRx>zb$cg$ejT|()oEc2%!*rAvsgjO_fxK|SFy%; zAR}O3`{`hGT>i%||K*qea3E~{(}d9;e!5ufBVb-{qOtt|MZ{#X{rAC z%U}0@|LlI5(J%7zYgtd?qdR=X50g4D!JKX`meJy%hlsayH*OA-Z~e+pEht}K6w~sH zFej!vbzGJ`a|Ky6ZAhj-)8>QUZR67OsaqJkx*LMpbtfW3AmQ~i%MkK!)dIiot$OoU zDk?EoySpg~*{c;HlI1Nk*&$B-+6m&=Us$&qBf6YiK$Uzg3nPJgfH>>-xt6NBMi{1S zm|2SjB14?bA%4)YffG8V%5RDJn~qo*FLP89xz~ct;vhO)G3r-ICF;3d2-t9*Mqr35$f<7H4gK=NvA`&4X`_+wTc8N8lCv0vEqHs=7 zSjO3UT9_fEIPeg&Ur!U1Z|qE=wd2s<_c)o3kao(SZjHIlHzwh^G*^AOM&{(Bx?cfEj0+$z6A~7g8N-UGwyAYqD%RDq&`!Ko%g^%95UMo6^GJ7F%r5)H5xiKJvGd|4_Kvn9tTCU-;wEWX2mF6 zfT&femnqYzCMvV66p4_pqe|mK6i74~?e6ccHGMrTs%#H1Yv22<0EjTcwc_V-@F4ry zu^WLxjoYb{)7s(8+jINeibHnsKs*0q{0r-?jAOA<)=_au9y^H`4q5SO-}97lc4be( z+T*t`dm|b`@FslHZiz$)m+Ls?k5|x{-`9))y|d_X+dh}w)&Lwc9o-HyL++}zW45GD zotGzy%Dt0ow<43ttai4ZFzq&m?4iAGGTe*aIb*3UpJ+0|7=7>0>N1TU%FeGhhly@V zhvr~sUu!C0n{JvQ8}NsSx>mO4kDmY#NVsN>#Yv<+SE?T`W!)l>$f+hfQ!RrP*0;lR zJGvVYttXc-u13|hnh*iG+v7d;bvx4&EZ5hBGOEez+L50L2$sB^Tu&7C@o)vynZ&5v zn~f9fv9(%H?4EcLQpPhHI^=7|6mLtdO2Lh&9LN?u$&`4B?d0hl`be#-#WF3mv{UUje`if?pOs&rOsizzu3Pcb4=uIW#< z-EMBcB>v(JJhf-4hRj5<<=HB0*FD`f24}3IqrUDb1(rTncvO`hL{f;{d|5Gfp)<^7 zosWzaCXT`%t^p3p7+o3X67-zeA~2Jh5TYQ@Yz)Obw+OlrSgH3z*xgk%*# znD)2GVM#Ms#`TECo&ZKwv+=c+`kGC5Wp_T)>@zXbWzQmD0i7gK&)41Ue{*?8CQI@p?22h=&dU9L^g6-!aBxpsiq@DN0V=j`B(3%FI*d zbg%xT$r^wleDyy8GB3%5YFW6vEoSPaC~sJ??fJ6!CdN zNZP$s5b+@q$7J-{O$W9VWqsx7L}k~mrybG|X7;h7Ih-giGSO?~#?@_+h%PJ?K#?9Y zKObV(jyF)vJrCPYI@PYP1qcGz1yPAgmP6bbJI062We;nuN3}Z7kSae8d8ggaK>a$- zudgQ;aboAA&pqkFBfWMshYi(}aLDmutNBJHd->a*O%%SUf$J!#jBnLt&Fw^3Vek6C z)K^Gh&>?$;I;7xqyNYU&1j6VbwexS^`e6YVL$VZZoUXyO zevqo2ZhpMUb`@5QT;CJWe^jLdhV0!$G{P{avrx?=4imoJsP0mKNJTZZ^X>~1V>B52 zz9&EPVILQ-UUI$ffpqOU?tuNk#vLw~OK$NbYQ7iX>4%$Op5vLwVsc?2R7pEUkVe;_G@DExwjE__{;eoTNPa;y zd+K9I>Go@<2#4W=Dy0<>e`l?j$n61uB0l6E9SO5?$9I0rJbqc>8Cxl9w03rs}%b+?o@ryKO@{ zGHzR8?yNZVq+?+<Q(9zrnSx}fX|xQSY$2mVvN}Ut2{fPj78KaHV0#%q z?9(Ev^GUTjAZP&TC30a|oe*^6mu;&8xjBqQ3rp%8lFNcg<3mAJgcL*xmwmI@II zbBLHp$`7&&ooJMRoX~~sK1|sCS^#9>6ozd^Myi%!bp|*a?M@ZU*_+(gQ=AA{$%&5k z%KQ+f?gk(@@uS_|28pW87!`}^dSXxo2tc&lbwtv(CWU(z7J+q?hIFZXRK1utWCak- zguSsXU;s=+gjJy(m9o~iD&2Gm`PrB{6DuP=zu-6L(xmqie@16E$8R{UN}`@z^gp6f ztCTA3(IKViM-wy4RDpc5b1dB;)urY>wJ-~nQjm8V4cFvO|98zJs`=?opAd`e+1fqf z(o4qc$yKEWP&i_1d_%aSMRvYXp4ce5HRELk8A&cjX2uIPv$VxA!p>a8ZVOfe!~xqH zR@2WeCR%EoO<5<_$`xuW!6jx3sv&ps*cJuXA=xUqQ zy{%}}%HHw7XM3L$w&JVUS~@4W!D@~JLiV#ct%_X5NtaHxgBfNqS{A3DU!@(5xc~qG zu@?&f4430PUiKb7Oi-TXnP};NK+1?%Imil>Ad^mUtP;q*umhuV<4;swyNM0_h;IWZ z+A?=abShc1uGBxZc?vqVw zRZ+7QW$A}*?pP^%>T6XMPa;-AGtMle^v)-9zTJfM6j|*UoIRp5>?}M6c2&*m{qNJ^ zgrzv$kUd^-?FjGo(>S}H7SpL*YtN~lo=^<=>EQX^y;&+Ge8;M*o%48n0XyogLcxgu zyjU_K1W}7s^nFWQ@yn0Va}+v{mbB8I@n>dKh~UAk*136UWuLpna>Q?_7~$B{P_HAa zenPM(oYznH3$B^$b|d$-{QNeMS9w&zs>iP$O1g2&P<{OB!+kE%BGEjquJkrU7%-N? z=Vw?j>EoonhdoxegG$Qfz9(8zyI7I`HkyUZAs*E{M%UL~tB8rqh2Hlzf-LOEj7*{? zOd|F4!F|u|toAuuZO%OfwuEcPs6z30PkJ!Bh1MI*7FBWn@d#58{ zCAa`g@?#U+!W|JkeVf2{y1vC+Z_hmu5tljr1kk>woP0N5$q4$c9mW~^8lWKsP>v@K zT-m-wA@KOV>uMJeV^6BP#Wbh_7Gq(o79do2c2gQ?qICB8@wv>$Q8E7Co4$*wYsWUb z&s9qIS#yrxIwx%2iWgn#b9*6l;)m(9J#c20q;2m$#l*fpAw_juPjh(V9@qcA?@73w zv?=do56FCq$ZX`@&lYFA{B-gAheBH*l{kaJ1cS)Gdk0xI?aciZLHOn9TEnHBe_RyRUa&0AmB zD++=*GWR*MK}|`ri&j-})0mbxNWyWshRFTg!6t<}k5S!ku{y{5DUc94=}EKRp$(A{ zYIfvX!us0DVq9PEYfGy{BP4vSEak~gA>q3zSgF$!HtefL>8PHiO;WC`y2rY94O36t z+fIK}%C=6*lR91X=dZ3-HLANtPm`S&2Fv6U6$E?&Q?TJ z*mV>I*lXn-pKqNct&d|RT5dI|GkNwOQJxbL;&9o%$9ff628?2(^Aj(8%}k8@qr-n zV1OG?Te*p!5J{^$>4K%7epd2%M}v8JaRs7`#bMy(A8|_pPjFHeF{C*4A=^(#_fC@2 zv}}2uQB^#A$WAq?ORv_`Y^&U$=R3k|N6osOc%APzB0_pBcc0tirVxRbA46Ydb68qB zDzTdzz--ka>fzQm_w*BG)~r3IU7zF>0cfM9e4cFM?GIp(HMg9@BAd}vC@^G?E+?N( z$+J-QILIVcr)*M^`dc$;s%v(aT|AubHG2_e%z zB~2PPAgke;@pn@Qy6WyhBGW;`whp zTJm&fLT~KL7meA{oyqOFjrO7I86o0F$F4#w3bG;2*0B#cddiH^^|6$Lp7ddK^)6+b zRiZRNnC$_jz7t0lrpHUBgs`}1w2q74cfmL#y zCp!~l%<>zSemlC%c>c4u`N)ql!x%VZUsDm(kek# zs;ZgANrVhzuWki+f2|xUD-9tWlE{Z_Q3#`4;@9p;EY;>ML0<0IC);?c45E{XOrrhc zpZzjG3Z03Uux;@OrgO+v&(Y=)v27Kd zdj)Ft%eHfvl+W2TYSNz$+9R+TJ{i-syDBRP3-pIFTQmlSS5A4lDsno(&7-fU@e>ES z)7Utvr7kbFp4`6EOM6EsM9$#8$GJ%_Tj5OKo1YZ&6VlxXZpP$p3zeAM3H|fwxHF>@ zR+QdK$vG&U8KQ5dG1*56^gxo>exu5aCW40St|NreePj0_j>CGox_|A&AKDtWedM(h z2?-%4uEcTJUNnVC1-28uciB3w#66FMy)vz9x4?IEHp*4(!}wQ?$`WndJD@EUGq>pf zjttjl%x`6PK%JPgqAY(ua~9D!Um|HwK6YR%__fi?|yVL2s^eG{Zg$a=m zmd6Dc;#8+;m;H}wKbnrHYvTPaK5-|igvACZ`?Loj5Q**H*REC}q}RM_XQ@wytqAj= zRlY_fjPG!+ROKe7%J4qVa(|yILet#v|6WG9F&)*&$2$G;bu|3F(_LbqrxZGr+e&Nl zJ^AWv-uE2lHWJMzd_~;u(b;NP<}_R0p8JeST=q1&aM(ju`e95&^_ionrn~G?zXZ2t zXQe}SKc$W;p4(2oo5Eoi6F^n1)Y`2!Rp&n9y3q!3!cREy1cs4+E9DYas{#=~T<1KW zj;2-FHF_Png_Qxb)l82z1md&9V;5%DQt^8S0kC9NBx#-71HQ-|R{qts`kn4`m_+mL zrAVw(y>>`Hh41$aljLGSUhE%IUTez`SO21AnQSDl-r&*3s^>b9CvZ>dOCX6keUT1VYt!(nP zfEC|T7AAA|I4aqKhwQFDM15DAt8d29w{>jw!wPNIj=lAI=c}$KMY=~Lnsn@pc`A+E zY)&c0V3R}US3URm(#6-&V5;+93-C=-Tb11^#F$jptpWv>EXt9cdu25ZBFSY~|9LX)K5ei>B8AiZVjD9VI`8Em!utI9R0yO>ZUi zDpVb^=TV!LJ%!Lkk%;pT7u5hxd@?3R%)+2%G=DXF*=O>K~#a32#&aAUDocm~5OffZG66Gne(% zTMgH4WfmcO4o*)pi8q3!0`Gg`o^Q^KzKx0wXnR|^ZFrIX-2RYqk=G8N+&BsGTLpos zLu^VeiRjf#OzkZEcj#sj)|dGCjq@IDgH-UgX1ik;u=hN!t5y7jDbzYDhjxRa7EX&P zyt=8(M!I1t0y`?t^1VS#wd#qCxPgmD-N2VkeC-PPHq8C9b)(vqydm76jcLDUjbxJg zt>*oFb8%(7w%uD|J*tYoLT0W9RF{^72CZTf#-o2MwOa@wdS5g7;2Y78$1h2z%=yOT zdd(dlQIbPkGCW~)zYOBE;+0e7&d)rVPH;)@J7n9u>dJbpsAIPbdFTFq*(@wM3rTS8 z&y|?~h?a(pV3#l;-iG)jp9r@w63h>;+{eUa<0me?r5Lqp0_GH|`4t0g+PO(TvUFXbx+naRkmmQ+9k`KX`@B9crGFC>@ndW;Q^+zyVzUwuPahx9h0;8Q09ZG7B2i?K!_=KN|s2Ep{f)&u-Q^Uxja` zZi;X)PIJC^I7{jLP8TIGhb+n(@;$gttxG~eM6hmiSZ@7J;IQIqYq#PoRKhQ5Q+=}) zMk93nS!bn-r#m?M_ZtSB!ffRoweoJw8>c;_{}Hk(>rP`ivs(xi08GuW5>*i`p%%jH zk3n;6H|0*hZ(O^*V;@xpbwo_JJN{g-+laf~gk<&J*US;SE^L=H@P1*G^&oQ(Ikcwa1sq?rXT)wl~VRIJ4_V!3rZ;a$;hy70sWsGu4UW~H} z#$?MxMdC6qzFhL;cWNuQrt9e0Xr&XvdU0b&FXavqO>p-cO%FMQa4*Jr!wP_hO%Dv= zxeifW_WGWvMk7+$;ze~rm#Xfz-w+|5wZq5P4xio#D3n<#+9|eZYnTCLmuu(W9#ZZw z#Ir~7Muv!?^u4Uho#r%9GA?8eBPt0eQg(0ul;a3V++I63B-%nka;7>eRirmgsWRsq zvL8{5q$Dvt7c^l4D&9U|#z(R?Z54&hxsJR4dLI)hiOXtsJu8jD8uc8PYqgs*L*7q9 zc-HaCooun})@>(MwklH?mC$slvQ->FNc}n|=t>jC8vMSo8I1kY5;&@bQ=<~HZ=8PJHEYOG~%3~d6e%I6S)l!sg%j}_l-lk4fJOwJVJ$P9gN7ss_*sYJjTJ3OMZ zFXxq>QpvTL0aW4dY);4xlYdtUTgSm`pm9E5&K6kTpyo?$h`OjlcAYA!E3 z&ikCI`a5N?*(}1F^P=mhnfTkL;5W|5-aZO>C#5Q#bU27&iv`Nu?}S0}ciY@6#Ydyc zh)&QIcIv02Ye%ZayO1XKd%KQi8)Uh>pgpP; zv!Hqz(grnNh6oN{PrZ{qMlE=9LuYI~>>PFxti|s1$o)ma?M22PmBG@P&n%WPoDW%)Q=F!e863+N&Ve2 z3e4-wQt!EEh+u3ZZ<96`R!X7J1_4{4u0iaQMu>b_OpOC&Sk{wDty|5vF*RFSq$%GM zMn1P6gn`I9Bx(xIb@WOVoLnK}tK-?`ofTp#H*6}ZG;6K)ytY>EP0#B9DYrWP=j0{p zcq@g6>L_(@jH1d5UO|X}6YN<;mM1EO2z5TYCQVYhz-bP-yF3sTb~~Oh_YOz2d`3iy zhZ=xs-y4c_f4TP|-PdR-VO=^K=9gH;G|ive9pt>dJ2S&Ii%?iqp4wGlO#MyD1pb zP1UbipV=oytvqvJ42{1%Q$*{Q=#nP?5j$P99f;ia4# zKpH+G-#Q|P?l@(?yrUJ9^3Fj#{#IA=?YI}yo>aR>og9qi^LGkwVouNU<{%swdqFA& zoxIAf8*;|^G~r1#RQnAv?L4H^LP9>N%Bs4<>ORcLP~PZ|)B4E|A&}%pgQ|!`Ph`wZ z&VzQ>&N2FCr{ba|Af5WXzS`YO>=0@Bo}sf$%fyA;9q%xuQ>`UzPBmoj;|_SM%eQK8 z>nPWFU6Hk&)?Bt@-TNVd09wcQalnPsjQc&|1Y3l6a}gLFl{9jiGo?B!2Rkp)3MdzU zTsa*R5q7y|t~`EACqUHaRF|GUFz-971-tE8?VRJ5JSS$BNruIIv~1hbBGK5OeXo@J zLUUnzhm?7_*Q(bORb5X!$Q!{j7>zS~uC>hi*f5Jb&pb7mRy8G6jYcF?U4`5>#{1fdOC3ftwg-in=K#)AiU~}Y9p(3*#EDw2w!2R3d)XGbB!~od6VpG2}^1*h*@{GB3x8D+)d2 zxYa@bdO9~TekIgiUpr@zy_8nFcY@}2>~oSXTh2lQ-^h#F>c>IEzqPVn1NP7YVE$*D zfT)LvBl;~l9YPD-l3V%{^y&w0kh`+6t^^i{Y|ZYM88tJJhjd}4j_%z|G_2a&JJ_B9 z3R5Dpo^0lgk^^#|!@oBq!P&EL9R0T~axdj8rAz51mU8}OLTp2x0LXI94Ns_|rmWIwZ@NRO3;DT?M zdxMj%+)1U2Xeq`d__- zvt|s6x9Q2MQ5Aq4vt07cFr&G43K7;7zv(!m!(A)ZzyT{Y2yt$|Q*QfPahOXT>$@v? zL-@0&&29OKd-W!t6(DDDW6GUKz2A=8lkA|`0DmCGt1TQ$;ZrYSCw+~rbf#f@`E37- zpj7DeBp6>~XWAf*wy6jc@P0R2&p({8^s}>dE*L{(Z`S^Mf*;%Ef>E`rt%>c5nirCS z$rtWiiDSh2kX^Ws@iHn7nZ1xc+m*3l1PURMnRsuvD7|RB^l`i3@q%k*)NemuH5Dp;()A>tmqYNp!STku z=FjNd&wLvZt#+JPL6+kc6)W(Tfa7z#!FkDMi|>7|h}khdUnF%>n%_m1i^vlwJ{VTDNJoZh zP75$5&dFppE_D%7q44#kpgUy+lcF@isES61@Z(-j(@Zkv$-*}VNwiTFFWct|&(zF) zlN0dOVp0O7`qwBYvo#3$+>0xh!>)Uwrt{$w4QR2s@9c3AGY$yVQ;i(osT@F>wPu#N z`4@+Lb8|xDkzonPsQkAsZ(L+UUMxfRGVoXwPOW*KfG{Y=bjm-^d;yKS>} zD;#f?7U0r;HSho>pP#xe$iHS>-(yXwvRhmh>GAmNqPi|k@!}CebC2o*$Fsg}#VN~c z_tVxHW@)r4!_2~oH48sV+lC6^t=e&-Si`W->taO>Go+s-IrK3UEgz z+p(S>SF@^8Kw(u#MC5-zu_dTK3eE# zR24Rkr%Cg*Q@9hAgU)_Gq)Lk+{P74Es1Y2CEnZf^L(+~5Z+N+&RTBGx0 zmig+P-c^Bxh{T-&a_r}t!1_VU2^2q5(ON<>TN5!B=Xz43(NcmWUR#rxR-7WFcaVn& z8l34xG@Lhj?=L0eu5#YUT>!PQ?I71Vs)6}g`)cw#cfy!hs5dI zy6s74KrGOrP%10$0X;L`yLK&rzxQL}c0_$bQ6fn3*0*o_0mCrfjegkSyPX43NZJ@F ziv>_21mWp&>OxXNUt+hb7mk@OZj)zKL0rn=U$w9ArIXF&?SV+h_cMSzuJxsdD}}&f zdt^-id!46I{8&vl@6&4q80}DF5Z${iZWZ!I!vvp3C6V5lw&p7t){bS{%Cs+MMqBcE zl^{bnzVir8TUAgW*S1y4dTPcpcirM~qT6`K2SSDosjTGc>3wS!I+m_?M?r_wecl&bt%hkHnOR$s@mT~cm%Pc$$619RdC&Ike^9r^F{eouOLfKJOYrVyGC} zXxiWXxp!CeLV4e(D2$%Ht7pQuZ$b9cRw1P_hp;b3^5S+5bq^E`l3N{(oMC%N^sNFz zKMrWTub-*~TYA`R;-D$agi6mWL?je75_fi9*MIP}8(SSMx-UZ#vtiQbLV8gItY{}x8 z;!Ku4OEXc`2rAt|C6-j@kooR_G~VX7o34yxH_bt z>$;CQjZY6q7Ob7RtJuI=d*t?z{f1tM;;N?zF8`3$(N&#GWW-I7W!*xSqYkOa;65jc zaD$@Gg%YF6EnT}?lUazbrzhY*`&GNTDjZ)kit;tfXdZI$F*GU1Q<)Vglp6bcHyj-3 zR3_mvOB^N}a_m6@i0+T>#C$@ctmWVB;_e}6wp;NbdsM6W!1l8WFfL0wT1V{EsDzVR zKA$Tk0H}O)tH)wFqpss_lj1V6vb1vBZrN%`=C85_A_CAHXI-}OtSG~LeLYu>UAP#o z-{N`U7`FSeyO0-r%9^LD8oDB#-R#v@g#)%iX^)WFdS@u7l&cY%ZmsW2Tf&t8-58$N zZ;j8RH_kmXvZb0iOvK&mq%DK%qiw4>ry4_;9PMGJD88=Neda}+pL1tWnQJYdt#_5V zt*>Zmngkms#sQ*NcN}cz@%57rHQP&1!sP|jovO^)H3NJsL=NBCgY5=3Dh@@1Wanng z){e9Ekli#1Av(60S@ts*VaLVU$CE*jv4Lp# zcd-i4H%MWe_(D9svblBSii~B0bdCLnZMy9^?1B!u>PA|K)aEU&N0wS#$nl&7um$5V z*zSn7C_Uj5m1yMkE|r|&P-bD)jO8r^c;6HIyHUB%#Q}h4LVe3ix|533JZhaYf z&5tawOt+ZdN!-IdC5T<6rl}B|o4IpOvL8)|q^RN=`M!!twj`I$oU8ZpN zEyZUm%|^9%;U+A0nH!Re7T{E56g7C8(-1R}9lv4K?T3)oDbv`oLJx?$#huld%J8q9 ztMtv*R%8ihzA_e@n`)H8t|3^dy)@fbKmnT*5+?e2RPl8H8_9GF2fUT#T=Xqwz%G;9 zHSzEcm>|L)=Z0YF#t7;4#5lqsv}@~$DP(S>_@1hYXg|aQ7}Mx@#kYz1d&jwsy4g5| zk>5YF+}A0UDnN;>5M|o+E9R3O(-_UQXOhFR7z1cF0|K}i86x$Q!~OG)eT(6a6_I*rnSYVaof+z_f&G5`$_boJ*ng>M#HQg@wsR|OeXb~fvgZ7GX7i7?lkR_G-S^* zG_a1+F_V(;TdVwx7LRbh2~sW%)Bt)A#J70P$AYpKMU^0%6q4G#b|l7ep={{)J&YNH zlT}$6wexRBmGs->{&jT;aM7B-(ZjuIt97DqKa2@8yC#@h@ zVNSR2FOd(Dgu`cW=4oxvg*jUiq3S)Tf@%yIW=NI=V(Xho$1?d25tX}b5e6C; z!kB$;^LP(`iOTHmcvc~;9Y#~-x1PSjMwo!pwUY{KGRb4>-1mAlE+ApG{Z-eq!va&H zam_Bu0pZylJDocPS?p{bWudhN+U66YQb_)qsS1qaV5`dV zxjRs)`r`fp3WP^O27X`bg5|oxKleE*=gzn)scR?b{g79>p|5`{6x!!-dR&lluTmqV z>dg?v12-fc-XJ+2Z2_9zh#k!~JRreWqZ14eXLQG+P{hPlSPJLYf(+YBNCgH%vdGqT zewEJ=PWlWZIb}~Ld|^BIgm6#UkEmbyiO7EwDoFNBUdX#AIZQ}tRJ6q;CT}sOU<v$mhr9 zqfYLj>LyCPyTN$9yRMl!hlpWZPuaHjJqhqzaJh|JgXx^>eU=_kx(bv=;DZ0!(ZH0r zzVgo*Z>Lw(-}OaiSjE5zZMH?T$v>~A9O7C|8)aX+Zr2!Ko_^5RR<@mih&zl*uJ^TD z>=w=HwXdDK2`ASb#rB=k&cInusv1IyMNMetYM)eru?cUD&8xLyi5DYi&J~C$BRNmC!g^4jqzri@c&6i_B(X7^i))w zz(F(16epp%=Lp)E-Bf{i$?mrAhlDcXYgU|hA|kO-Mn*dxbrPAKyBE?RWHr`+lwKPR z>2cz|BJ6Unma}J@wpK#!H$`g!|LU z#y{`nAkBFBHw3oT@c|>?I7*$xwd=M|%|wyzXmj`})MM9+iRJE3N++z6?z+BIp>{G* zCxBo{g8I5E{88oa?7*B+6Eat*%U7p7M>T#C9P63p^}fipgSKZS_qnkh$4R{5$!U?2 zm@4msoOePkx=hR|>s{U%Q}xi@s4}=hgj!xZVZFDZ49nJqF(TMHD&evCOqz2VhY`BB zsj^`5qhiLajM)^WUVG^S;_7If=QhQifQrXw9hGIhX1%gJjQ5p>LA9&uCd}S%ly%fi zYKTuP;09Ba-Gq?!Mywp^ypg!pE^cK3=+N79y89;k)6tke zQ{TI%@OQjcpR7{eyx*X%KH_tX1ZG1Q#|zWJni*xq|F0JnCp)%+`eR}@w& zH@2VL_8RdUB4)pya7Vi${PGUe-JT4%m^PtuzikoG46bIYqPFQn3KxWQPsm&$r}aBO zC)t?KZ;gnt``DB&3NgO*B6AmSg|Ho3MUC8G*jY7>`_@&EN3{qU8YWpR0eRO)lYG6P z!|QXR@k<*CD^nA+=xxAmDTaK;8Nb-3r_WEW`-&Fiddr3$1#7E6Mp>Z4l zTg^I*3#Lc`6;XPhTiSHUTrdouC3Tad=;K`2+?I}0q4|I@JD`Nkfbwp&atNz|4^z^5 z2bI?zdqGkicTmU3(L5H=juEiFR75wG3ZQ1_`P{>AZ+H+#j} zhRyeDfZ74d|xofH09_afJp29>l} zz5DQeO|5UU@mcmj1oX<1_^HX)kLv@cH`z1Svt;zO+Ix95Q>6T9(#h)vWby1~W=Prq zqSWg;A}DS+tIKU;qRLf7#mY)P??TzNlVKN}fH3l}9XWDrpwrdC{3E~Pc>pe<+t83+ zW~iMb{SY-`Pe-kyVN|=EV=2AFUhnl(vp?_L?Ps>|EG8^Wd{>U^SN)XE9}g+(Y4DJX zkT?swj|!0*JHI{jix;*=5s-PHZ=9>*(^-*mHUN)@s-tT33YIPRLn>fCZ_tT@CD7^_t2!pZ-f^v;ulz@m7GfzquDxaG^B8gU0jH3Q9GVT z@1}>{1Bwtyz(ifq!0B?K8e9~R@x5k+UYiUa7a*DEA|j(8INo#ss>4p)!}bzQ*o6!V z?bJO)ptPe0nH4k|3)8TQ?qG-Y)f@Fg7AlV_rzx?e!uk%e$n5F2;t&OsP_^`6BhTFzwnc#~4z<>kTO$gB1JNId3f|YnSCc9Umnl%=#NSZ|Z2&P2Bg`$*jYTO71#oUMWN#xpsCu zPK2!J3etgYm<;gUKMe{Satn$z`@PjQ>w04ysnhv}+4H%rx-j9LE247cQFN7f+4+4e z?Pp!FX5&|OeL0crEs3N!k7RBRL-PL{6?cT|G|U`24CH>v*HMX_>xrvg6;#L)wY8%! zIK+qj&>;Ka4pc%mr}a1=h91K7o|q7Q*)NB{aNKD*F5PKM-eKcJv-gD1@NbVfXsp!> zg%Nrim8HJqTOYDFA*^v&Kb|%A-{a3AJ^mPi+@6kRA|SDUawyCK>MMa#CLdCc ze$38SXwt^CvTZcVginoH$^GUdOn9iBFdHM+)1n{kGWOa%gj7@lG+w}ld*>%bwv;!- zN$zk_oV(iy5#+m`=&9SBN-x@HRD1WD$~UTFRw13F5J#l7%K*3lDoi3g`3&1rJP^^~ zqf)oi$Qd@Xg{?*YVZ#LNc7$dgDv4vV$v(GYFLgnVczjfbYBt zj<>$f*la5nUpF_dnPRW>W%gZSC89;JiHB8|4ml%90pP!U?1_*b+ui58r~SlC_N!qh zw{@e~{A0ppg7YuWH&za2_m|N`ho+%0GT0)*p-a`>V?Jk+qdhfl84F-QhpeM`>1ab}*~&MDbCDgoltmfWpFE})*TIq|`&*w3Nq ziX*wJJUSN=%aWo2ioXV2GP;~q`Wy1CWy!C<6$WX&XL?ZI1uC~EtK8QQ4r+2))2x~X zSvIK=&A@KsSPOfbZXH$o1W~SVAM@X9bUz2th~!1qN}>*N`I5FH!~;aPF%UEd}2h>LWwwG_5D83KX`8C*@m33Rr<3{0;lJj_Q2|n8x37C_^OwYCiRX3b##=?$oAg{tdY(IuO?4uHxzMd|S ziz!!^IvU1klbfj&$JP5p9OMmKp7PGbm32hID18>>bKhWP$Lr`q9;o(1cS8hH*R>+* zPo}TrG$Ii|3&$|pEsT&o>ljj;xeTDIo1>2em(6fuo3Y=4zX$1&)LQL5o|q{ z#3UDLfn_V#H!t(rsiiySV%*$_<~ZEscEzm`Fpy4~aMErGDBzPp&T^~W?YlR-(kvxT zJG({t?s#q6M28Y1JAx}}=)}8iJMJoawU~@zrV9F^;!0od@b()%<&lPy7D?bu_2i%IEK+md(gu9XyO2R!Ym)ABnD1`LH z5Uy@ag^RWe{J1ZIVIm)2+Ou_nwk#Usg4u9_~^WV|6P4Au=BSM1Z4H5nC#1%;VUw%fC{>0RO!2@I<dUdOWY-BQ#12_-XBa2)kj(6e76gx^pQjHI zQXPlDa#9CX3Rgd_Guxnus@WgXc@MC<_w}mW1~D>>wpJ_EMC7UtC8;2w;>^IX4VjtX^aB?vy z1oPjTaFy?CjQlabW*qI7*AXo|%&(=ynk|WtPZ2QBDTK3Iv#`760aN*MKglZe)XHVi zavI4j``u4KMI&9YcI@8t&oHMxA}6brtMfk38{7l#08!>PJdEn(@xuu5`xSDbp<4kv z*-xahOm+{X1t_XkJ66vw$HVx~zYgim1wGk$SS?Ps|l zETevfT-JM{pdWJ-F*&mU*xqT zA)20jNd-nFKzEzq!2JD?6{Vu-f${BKL7?`f)Y&^Tm zxG@oktrKR#;@`OM`;7Ci*?xj1qMqrkZ}HX}wpO<&nO5UdgS{a569;R_o#)*$ z3fbIdj0(R_0xEzh3^2rkGj%T&w%;my#a(bmQfctV+0~-qEiHH^8Y^G@ZEyV=}kZs_I`WmhXnAI<`F<)!y%`?-dDZXZLPe zd!RX*Rg&%d1#Ye#Vf6Z1RvQ(|?3nG|dJpN|(%NN&Tsu0jO=@-}x=^ua*rXxdcN%hw zKc{8Uct7IBBZ%Kb#(Fd~LkyqwYo%cf-~qinuB)QYvzB-=%T7Vq6E}2RUBOROq-YXM4v)aB>E?v7{0X!bs@jRBo4q8lpJZVtXeRvY!N|=GTTS zKmoBd?EobCt}8LkJsl8KsbC24)YhpT*j0Pm#2z_`gS9`FBh6z&VoB&=th)0q{njt< zw3YmXn=M=Iw24!>5?=FFlkiS%{we?mB!NqPRa9qTSEYOh*SBu5e^ZJuDv5;JQQBRc zsvU*gvJu5yg}!#mZd(8BFAF}ZT?c}cm${l- zM9InpAiaWp>@ADXiuku(0=EL}0fSWfBi42TV3A}1`Jvf1;II1{%!PEo9GD zKz{ct2ZyBn`&=>P<{OpL_Hl*W(IHe>0#<-$=e+ht4JA?8 zO$?QPPkP+NI62i&6gU~5??a0u?1G6_NTst9{dUu5EPJk%M z+1hN?6KNc`>H#`=u4SFPxMw#YWs$Wb3YH@4xN^de?XuP_9T`@sZbU0c2-&Z`ZZCUr zEJTX!K1UcWbQHGYKYX!YJ`Xqnf^{b5Gmz|ZU(3sS*1aAZB=+5z(#*zprnq#gaf0v> zXx=ff7+))pSYfn`r7PTSP4*f~JicF+ZIQaG-skv`#L|e^cPFyRnRFe&zxvr|dPpQ> z*3)bE8R{(CWOgTLIytpcgbmVz4wFTKVBhpa2p+3cxYcBY=R1oSY7cutemZq`6!V$> z!g8`w#?ncQwOVuag1a9mI1;vsDi{uF6(D=5Dx|j^hw#z#1xbH29aOBL^(7G0;A=NY zhN|bxhg5c6JCBbXC!)e<>x;k_udCfk{-erx9a52B?ReSeom->n;4oh1sOTAj8{!>} z7PNyBmxpAd+&Gm2I@iRT%G%nMWR0mq+`~O&%MQWHcd|QRN$RkCi`vO1IaeY3MV*i* zUAvpJ&)M)C{b){51Iil&kk0jTPyUQz&iOD^FGo~TVMwvph**P|H5FD)Dx~~iQ!ATO z{H($%yV7pb^}F3(K~&E|hmc^+L%;yn=qjf?ucsnBCc^8=`D!=uWN|)3eAgxm=(<+s z&5Xj3i!JMlNw#29*lHdjlvnBuvH~Co^WzYb=Xjd^+x3U_&eLB{bFws}O&d2ey71A) z{R%u`WL?W*cAbf{xi-u+7QxsN>UN7Apx5Si4C*jKBx-7fX0O5E6OyB^tyR-?GJ4OW z;LU zk~?GCy{;*o*KA@1jqR~)DE5ktRuwGVupI&m7j!#NU8wmJ7tGjBIHPeTbs-7dq#;aq zqcWeQDE69w&ghxV0od=4X{KcO_+4yul}2F~ZiKMaC&N~0R!78gBSQ0o-z?~WYLX&Z zJxUb0y94&P!I1k!yNH%L3rjPOs$z=kd9E3D@5bqnq)ID7L9EQ7?H0f5!bw=si#A+- z>r@1heL_d=#M#tdxbNuDOXUtx!p)ohyHd*PT1v^L1f7$z*V+H4(z6FM2@C}tweZ0N@(m)Q0-GW}i*h28p+z>D&u`g?Kv#*`@X zz#C+*+BC{{0XD3;Z{%eFqMB8_WhvS9koMDD)VMeHqq>pN$FFzJ)W%A4*w6ajJ1W{O zS$plOG_EUd{e4cjyyYx|z{{zbt4+63@=#-gu${bi_%)-m-k#%1Z|v~~R_&)F)rez* zuz#C;h$UkK2xsopC^=6;h3v&A?Kn2O`3YOmBS>NVjnX60$8wWE3=7Rt47t-r*scVZ2d z#(7Xf&g6g;Cb(1NV6~!ED9;1ZPQ~yhxaWD-E-xnAn@B?n;soqxTN-vxNDO&(*jWLx@56}sy&8b7D=+dXSi(M@ap;nM zD-7!=SL*#j2Kh;j-T`JF3Eo~p9}!mUFu;2HC@P{q?u6_Igz9KNWE|3gy~((Ye4i5m z%!oy`I1(!H*4rv0x$mt!=h~5+_dRO+iMtC?@YJ}U>&b7oUOR=QKbCyu7<%6ikM=!V zbt9lEZho#a-m>&oX1bxpb{6SBPk7pLMS>lO}2Vxw%rJb(i)620lH6&W>voJMYT1Tz`7%yh z7(QUp@bWHii}~K4Ff+_sKBusAh3Z>Sa{cu*Q#$69EgWld~!tGKC6JlnT_?+ z^o4&9+l@~c6Z28cUJqH}aP9a6ldtsLWNw&)xV~I8uqqI>e+{$xfj98|(~vUy_dTZK z$?77h*KUtE)b4)UTTgp#G35J+QrJoKFl*NL2&~-kkY_b8c2DiNP5oILOY=sw=Lc)H zFbSZ_nEJWP1(9&%ZjgBH7D}k*XsSZ&TMKs7>Ss&pv#<7ioeE}7Fij~iQ~xfMX$vc! zxVEdxgxupx^|pj@h*JBvQp;P_j)Y})Mzvx_h->-B2&z9CC?rjAgU4K*$vLFYnwoDF z(vyw##96y`ei`$#c>chOpO5P7RY#yLx)JQGLBty0V!259`bvF|YKa%$WBWLfjXblw zG2!lSe%zhb6jsR_B8u-3^=NH~5Z`spIG#8Q>*Z25GTEBPACiSOL_}#l;lP#vjhw>c z^K{ps*tBNU@DXw4?sGzy?G&%L=;0kl0k%#yzjSYiYscQX&oMiXJ3IjMkXOv0KZ!#=n)mY-!qY9PKIBeRDUB0|5+V1g)l)^0DOVfen7Av%9^JS8eW{4BUD%82ljP#t z_btiJxC@O}DW=aV!g%{F>anYE^qHk;2t_>SMLAZ>|B2mLJCuY$61K3`; z8ZwrEBnj8-+!1UUZy5T0?hXR(r-MRv$2I0Hrxn8dZg&NJ+plXUgYd8w@xu8tf(t443h1@FpO6o`oRL%770RgG(6F6)5~h9#&*3eV(y50f{-Uz!hwL8Pko`WB zp2XA7lp;=^psC1VgPM-+b27ztMo03?w*-{YST$@fO|Gj21R;g-0_LO@IK?j zoCd5w?v0?UOA)b#F>uX_WSksNmq7$0+8~8h9fS9ju)vk6Ic4iY^{d^z57&qanq0dU`bOTXHKRI{vDvx0 zG-P$!wYxlwt^_m^hE}fIsu8iI-&!U@Lw+)GD9L__rhq_N`8UbHJl6~#fvi>!#NCpJr;z9W;_vX0H$Nc&cPCJsMww@U4p7&3kby!`;^`~X9c!v{9&flN~KTQ zm-0r_2XZ4B)FITsO)sN!dNeV(VZm%`hNMfxIh^A;u|DL0r3!JA5YNswm}HSyfg0Dty!_xCkmJ~r?=?1YsSNB zwmrP_j?_xm`keI2aw^uBOL0_^wvX)>0Y$S%+1kw&1zbDjV7J5btLlldZcwQ9me2a` zc0q`|-dO-xZB9CNGKc$~LK)l&!HqXz|3Yy?sLnf7;>~SY7z^_36rqkrkSRjuwk#?s z%oxJ*m_WAZg1+1!m>>F$6UA1)cBWoCzFxIik#yU%>G9)AFbty~Al$EAQ$ZzjAB)ME zErkssJnnOu1a_o$=Fna-Y$_N6+u#w2lNg>Hcw5y~&iW~>eyw&}A&9-!O$TjA`YfHq~{WBcJ=}S+1l!Fs%pyv4Jz1AymX~MN)4P2clU>Rj z*7M&n84aFvBTM%L2gDC?UQZ%NXaAF>D@sGfHm`SV-EV@l3L=l~3}kPvwoxl-Llmz0YwLUc1lJgW>g~ zQn<50iRHh}$@ZGjp^xO#nS@z6Om*cXxv96K3AlX_wo15=Ubh?7uAzl=t3E{K-JL&J zuPzRwU#_PL`-k*q!unoOcI`?%w8DLFHdwiIQgg^|QKHI}2$1(_6Eek$53eis#tljw z`iYnQwnY>2Wa<3DRYqndL zL-L^Oh>++!qUrMG%}!Rh6^8BVdQ_~`hwL0f2B?ELuSzWy`wVLx+1Zxm_2q=hvRk&Bgjg|h7_tA(ZXRv-U9Cuh}jJLM-~pD zvS8bgl2IX)=j(gyncz9wY(v;7$`&wHwoo~*1_jCe3D_e80V%&e2isdSFaX3Un7&6x)L^R{IQ``~5z-A8DZYL(7MIkUNj6aGCAcZZrSF2kAwH?=qOwu(vdjLVH zh4@MMzZW3h$(Di8QD5r&Q@L|&)9+5X8HDaMta zLsmj?%_^*oXgQ9EnDMO~acyk^NW7*`=E~+2nSn`O9LA5kkCAHEjJtDV6fcgIx;Fo0 zpLP|)go)Uvm8za9d;*c?NvA_jds^ks|1+rD7Het`MkQQ(;-NU;dJ=`MZwp9zyhZV1 z)=}+^|KlFZ+otQkcO)LRMwq8ZT{R{%MML&Q!WXY2=@MwO8q--(vrq^(EG zKn+QJ*#=#gv^u61X-QG^xuSbf{TLJjX~@N1Oh+91Yv&EDwiI^W!1ko&gPiw1Eqlwb zmqzbT)G)&OfIbq6ev7veOJIqdCz zNa-}rJ-J>id`wNXRm+%AhMh)(^&5LbN~`Dz&-LtMG!+;P5zA}!!WMChszHpXs33r4 zlXPF#Eds>L7%9*&MdXK7w>+eKhq-R5^5QD4LaxaW_rbPVg)b&bIGZ99I1RF}u6F0= z3uT?x#Fg)cU29Gs?Z!PKPI8L}If2Jr+9nivnxX>q#`ra>@~;7yW5qK=wPfqahIPbIk45w|0}9S?O<3t$YLM#fT`x z!0&4@&076SHlnO}pQEUeL3qz!|5 zRO+3R8f=-Rs?);VHE$}}Hw_?FO$`U^H;bm?_kLH%na(VO7Ux1)PXxnu=^B+7Q)h}d z(>~V|D>X*R<9VV5wx8AuqZc=*m~TYAv~|tO2qO{7_(m!Aaa640*SYw{QQZ$J8)n)4 zwM%C=yVmkqn~Ioss0>T7LsL#fli97gVXX=TwiIQE*BMS|B>e-FfLt>+u}v`L4FnbvBr65GO(l&;$;h5U_F(x_da0aM)5`p zr3hch$7I42txE2#@Ww5=@cXGy9Fe@Ml&8$Ekx$^fuSFPrVR{Aum8>Oqm zub<+y*Q`pO^^MPqHS7BVbKLiCAs;fO3MupQKDS?i)47<`tvQD>sg>K$alLjkrpqNf zL8|vz7{>9}EvADo47PyC^p9a_8l380XShlV-b zdhPfP=eM5pAyW5woPB02LEP2&YsH1W4QA{#rfkcJWK?wJA?&birYjX^?4dgI8r4Nr zAxkhAlLSx8l+iOi70ruM!6?w{>uKf_+h__pt<}GJICFbk#Kf#t{CA<(UQrgUfX#>x z^Mfy%LWDbxO6UgHL8Mx5#qs^P&dor}a_qApn398zeAYp`S4=actFa*rq%9T9A-yx4 zJ$+Qi_e|GRbnW`(t~=&#*jwQZ;h9JblsC-t5LrP5AEMb!(j?7YR1cDgsVlpd*V)gv ziR&eg?0zpngg7nDBs=G97})CFK+4_vS{4YiA)+EHIeDd6%@*(;!-wq|^|KcFb0! z8&%>v#LLeulfHXMF>YFI=6z2x4dcU9DBSlPH$6eR(65~s)XXIa#+;Y+W55njNDpJyj@7r{qzUt5 zOha^j?Z|@GrDRRY6Acx1-z%w85iU%yC93j1T_rJ_-B$_u`Q+Vs#Cf~QhmP&LcW``x zE64|inO^53Ud$bVC|qjvA~t)x8bZAO7=4%8qGDLw99fSMOHu6|9D2<@;L=!11gY!W(zy{yWpI|s-iXeHgw zypydiHIA~jmmOl~fJPg*`Xw^^^~6(6?xMRv$mFUh=z5zHFsjB9K$Y^m-RE3P48>~?P!>j z-Nv-oDGlzIxHrA-HFUutRuQ}OIU>K30RT%h4*&DHyVE!~HN8iF6ctW8!i)#!r&Gq& zCckRako$exmg8FW3S}z{S(OnQA^E-tDaKwu#hv@R_t*Qo=(a}g2QEVQyG`s0B(prI zfUMUpNlx1mu$P7c3Q!H9ehm=Pg`d|`Z^4DRo@~L_&KVujgM~w8F+@`>&1Luq4-RVY5bsA8Cw27ocgOQp77i4(a5M z$hqFH2F4mW>QgbaYc2UZyA&1Hvpz#O*+;e7_h_m~ni^8PGOH=9TurK}6Mj7v0Sj3) zajck;24T_N;EiDq+J&igHAP6}7^B*w;5!<{?g)HQ;9D%mC9h;y?9l;QEjS`;-JSvp zApzLMchJegU9t;1)y1S+AQrO1u$uWFpL!!o+nVHM7Bwn9YO4ZCj}F;8o*`a~J)|qB z*N#hY7=!WJsRK=gr%-c9wOi_Q$Sb0S{hGEtY|3j=;gH?>h-4Anh9q&mO(28!<5KZw z)hBHzY$~<@N-i2@`iPd$dxR=u29`4ARC=fKzsblms6+}~|SzITWp@p|nDnfo4<9FL<~47qlD zxDuiU@%5c-y6;tk`ugI~)h<8qK3Azqz#V-Z6=^uI9-RTd0l&DI>;L??Vj1HD-J*<4?5Vn}!Q0+b7Xb6X+sVKd1z%n4BVwHXET8F}N z6X127BNeg-zt*ZBUk&nXN=FURuAYVL1^W<6Y9x8e_c1~@tVmtOw216c=c7Pf9yWxP z*hF}lJvn*pmMaP>M;(!kzm7_I4B+~jEI+g(d#&tyQma_id`n@aIlK^-N4!zsZYK?r z;rZIFW+yCpzH0NP^~`QHyBl z>X2pLGo5ym074dYvN|izynywl;IK<&W^w1fq9QYI+#(S7JuxQ@pA9>WL|GlVe)8rRKD^fg`#l2Mi2u(rpm`Q6j3hi> zw1K6R3wF(^utK(&NtJqXRSiWzUzr-Io{tpDQy?3g@sW0 zT)dFU_^6158)vUq)RBY`8R%i-tf3;b7Qs&<+z-;gCg~YSyLu8)X(48sHQ37Sq0;-? zq40e)Y&A@VBrALXL2y7iEQ*PZINFL-7_3&dvOutyVk5`Eoa;8mObLI|=hke^y zXfdMY5t~J8*5A7)3K%bOhjc~9C)A|Ys6~V04uvhe1FI5uNTG#@cJVrr^Nb-ea?6(1 zuf8+reu{g+GkX~#O%%p|qZFXNVSc{?+iy&+nLq?_ zsB7~6kvxe3le)Sk5G=jf2~y!MgX*?#&G7POOL$K_1?@+gqe;_5#3WiH3veIvI`wrt z=DN9IGg9r}+3KsE)r=Zzwvc;DUa&$D))1vvcfw(_r%@5vwjWz>6(aiCqWFt%|EJLRiH!eSBD^!_95@~AT>f;9s7`Yzdh9= z77$zGm%UYj$|JI!7f2T(Qa^Nl2R5F1QWG}AF{~uhh>DH`^x))>A_D+{wwY)VEyEo~ zW{rsX@Tf{?){K#Ohl*QvoCsS%p?32>5#4JH01Cci4*CBXyO(5LlOsFNeT*VUAc9q> z%&ay?z!pa!wj`QKn7^5xcX@mpIB3X78j0NNc*GYM55GtJ3l@aDGzE;|L?OUrU5{$@ z-9sv*sog3%hU`8ujINpQqn%(#gM!fIcRp7P9